大数四则运算java(转)
// 大数的四则运算
#include <iostream>
#include <string>
#include <algorithm>
using namespace std; class BIGINTEGEROPERATIONS
{
private:
static int COMPARE(string number1, string number2)
{
int j; int length1 = number1.size();
int length2 = number2.size(); if(number1.size() == 0) number1 = "0";
if(number2.size() == 0) number2 = "0"; j = 0;
for(int i = 0; i < length1; ++i)
{
if(number1[i] == '0') ++j;
else break;
}
number1 = number1.substr(j); j = 0;
for(int i = 0; i < length2; ++i)
{
if(number2[i] == '0') ++j;
else break;
}
number2 = number2.substr(j); length1 = number1.size();
length2 = number2.size(); if(length1 > length2)
{
return 1;
}
else if(length1 == length2)
{
if(number1.compare(number2) > 0)
{
return 1;
}
else if(number1.compare(number2) == 0)
{
return 0;
}
else
{
return -1;
}
}
else
{
return -1;
} return 0;
} public:
static string PLUS(string number1,string number2)
{
int i;
int length1 = number1.size();
int length2 = number2.size(); string result=""; reverse(number1.begin(), number1.end());
reverse(number2.begin(), number2.end()); for(i = 0; i < length1 && i < length2; i++)
{
char c = (char)(number1[i] + number2[i] - 48);
result = result + c;
} while(i < length1)
{
result = result + number1[i];
++i;
} while(i < length2)
{
result = result + number2[i];
++i;
} int carry = 0;
for(i = 0; i < (int)result.size(); ++i)
{
int value = result[i] - 48 + carry;
result[i] = (char)(value % 10 + 48);
carry = value / 10;
} if(carry !=0 )
{
result = result + (char)(carry + 48);
} for(i = result.size() - 1; i >= 0; i--)
{
if(result[i] != '0') break;
} result = result.substr(0, i + 1); reverse(result.begin(), result.end());
if(result.length() == 0) result = "0";
return result;
} static string MINUS(string number1,string number2)
{
int i;
string result = ""; int length1 = number1.size();
int length2 = number2.size(); if(COMPARE(number2,number1) > 0)
{
return "-" + MINUS(number2, number1);
} reverse(number1.begin(),number1.end());
reverse(number2.begin(),number2.end()); for(i = 0; i < length1 && i < length2; i++)
{
char c = number1[i] - number2[i] + 48;
result = result + c;
} if(i < length1)
{
for(; i < length1; i++)
{
result = result + number1[i];
}
} int carry = 0;
for(i = 0; i < (int)result.length(); i++)
{
int value = result[i] - 48 + carry;
if(value < 0)
{
value = value + 10;
carry = -1;
}
else carry = 0;
result[i]=(char)(value + 48);
} for(i = result.size() - 1; i >= 0; i--)
{
if(result[i] != '0')break;
} result = result.substr(0, i+1); reverse(result.begin(), result.end());
if(result.length()==0) result = "0";
return result;
} static string MULTIPLY(string number1, string number2)
{
int i, j;
int *iresult;
int length1 = number1.size();
int length2 = number2.size();
string result = ""; reverse(number1.begin(), number1.end());
reverse(number2.begin(), number2.end()); iresult = (int*)malloc(sizeof(int) * (length1 + length2 + 1));
memset(iresult, 0, sizeof(int) * (length1 + length2 + 1)); for(i = 0; i < length1; i++)
{
for(j = 0; j < length2; j++)
{
iresult[i+j] += ((number1[i] - 48) * (number2[j] - 48));
}
} int carry = 0;
for(i = 0; i < length1 + length2; i++)
{
int value = iresult[i] + carry;
iresult[i] = value % 10;
carry = value / 10;
} for(i = length1 + length2 - 1; i >= 0; i--)
{
if(iresult[i] != 0)break;
} for(; i >= 0; i--)
{
result = result + (char)(iresult[i]+48);
} free(iresult); if(result == "") result = "0";
return result;
} // 缺省地,商数向下取整, floatpoint用于指定保留小数点的位数
static string DIVIDE(string number1, string number2, int floatpoint = 0)
{
int i, j, pos;
string result = "";
string tempstr = "";
int length1 = number1.size();
int length2 = number2.size(); if((COMPARE(number2, number1) > 0) && (floatpoint == 0))
{
return "0";
} tempstr = number1.substr(0, length2);
pos = length2 - 1; while(pos < length1)
{
int quotient = 0;
while(COMPARE(tempstr, number2) >= 0)
{
quotient++;
tempstr = MINUS(tempstr, number2);
} result = result + (char)(quotient + 48);
pos++;
if(pos < length1)
{
tempstr += number1[pos];
}
} if(floatpoint > 0)
{
result += '.';
string stmp = "1";
int itmp = 0;
for(int k = 0; k < floatpoint; ++k)
{
stmp += '0';
if(COMPARE(MULTIPLY(MINUS(number1, MULTIPLY(DIVIDE(number1, number2), number2)), stmp), number2) < 0)
{
result += '0';
++itmp;
}
} string temp = DIVIDE(MULTIPLY(MINUS(number1, MULTIPLY(DIVIDE(number1, number2), number2)), stmp), number2);
if(temp[0] != '0') result += temp;
} j = result.size();
for(i = 0; i < j; i++)
{
if(result[i] != '0') break;
} result = result.substr(i, j); return result;
} static string MOD(string number1, string number2)
{
if(COMPARE(number2, number1) > 0)
{
return number1;
}
else if(COMPARE(number2, number1) == 0)
{
return "0";
}
else
{
return MINUS(number1, MULTIPLY(DIVIDE(number1, number2), number2));
}
}
}; int main(int argc, char* argv[])
{
string str1 = "9999999999999999999999999999999999999999";
string str2 = "9998999899989998999899989998999899989998"; cout << BIGINTEGEROPERATIONS::PLUS(str1, str2) << endl;
cout << "===============" << endl;
cout << BIGINTEGEROPERATIONS::MINUS(str1, str2) << endl;
cout << "===============" << endl;
cout << BIGINTEGEROPERATIONS::MULTIPLY(str1, str2) << endl;
cout << "===============" << endl;
cout << BIGINTEGEROPERATIONS::DIVIDE(str1, str2, 4) << endl;
cout << "===============" << endl;
cout << BIGINTEGEROPERATIONS::MOD(str1, str2) << endl; return 0;
}
大数四则运算java(转)的更多相关文章
- 四则运算 Java 杨辉鹏,郑冠华
四则运算 Java 杨辉鹏,郑冠华 GitHub链接:https://github.com/yanghuipeng/arithmetic 项目相关要求 使用 -n 参数控制生成题目的个数,例如 -n ...
- hdu 1002大数(Java)
A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 字串数_hdu_1261(大数极致).java
字串数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...
- 两个大数相乘-Java
两个字符串表示两个非常大的数,请设计算法计算这两个大数的乘积,结果用字符串表示.例如S1="7832974972840919321747983209327",S2="19 ...
- 四则运算Java语言实验设计过程1
题目要求: 像二柱子那样,花二十分钟写一个能自动生成三十道小学四则运算题目的 “软件”.要求:除了整数以外,还要支持真分数的四则运算(需要验证结果的正确性).题目避免重复.可定制出题的数量. 设计思路 ...
- 大明A+B(hdu1753)大数,java
大明A+B Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- 四则运算(Java)--温铭淇,付夏阳
GitHub项目地址: https://github.com/fxyJAVA/Calculation 四则运算项目要求: 程序处理用户需求的模式为: Myapp.exe -n num -r size ...
- 四则运算 Java 实现 刘丰璨,王翠鸾
四则运算 GitHub仓库 功能实现 [x] 使用 -n 参数控制生成题目的个数,并且根据解空间限制用户设定的范围(如 range == 2 时,用户却要求生成 10000 道题目,这明显不合理) [ ...
- 四则运算 Java (于泽浩,袁浩越)
GitHub 地址 一. 项目要求 题目 实现一个自动生成小学四则运算题目的命令行程序. 需求(全部完成) 使用 -n 参数控制生成题目的个数 Myapp.exe -n 10 使用 -r 参数控制题目 ...
随机推荐
- 存储引擎InnoDB
InnoDB是MySQL的默认存储引擎, InnoDB支持的最大存储限制是64TB,支持事务安全,支持行锁,支持B树索引,不支持哈希索引和全文索引,支持集群索引,支持数据缓存,支持索引缓存,不支持数据 ...
- HDU 5973 Game of Taking Stones (威佐夫博弈+高精度)
题意:给定两堆石子,每个人可以从任意一堆拿任意个,也可以从两堆中拿相同的数量,问谁赢. 析:直接运用威佐夫博弈,floor(abs(a, b) * (sqrt(5)+1)/2) == min(a, b ...
- matlab基本语法和运算基础
转载自:http://blog.csdn.net/robertcalm/article/details/51582253 matlab语法比较随意,但正如其全名 matrix &laborat ...
- matlab 矩阵运算技巧
1.a=a(:) 作用:将矩阵转化成列向量 a=[a11 a12 a13 a=[a11 a21 a12 a22 a13 a23]^T a21 a22 a23] ...
- 浅谈JavaScript -- 正则表达式
什么是正则表达式? 正则表达式是由一个字符序列形成的搜索模式.可用于文本搜索和文本替换. 语法:/正则表达式主体/修饰符(可选) var patt=new RegExp(pattern,modifie ...
- Unable to round-trip http request to upstream: EOF问题
Unable to round-trip http request to upstream: EOF, 今天我用的phpstudy环境中的网站页面忽然打不开了,报错“Unable to round-t ...
- 2017-10-23 NOIP模拟赛
叉叉 题目描述 现在有一个字符串,每个字母出现的次数均为偶数.接下来我们把第一次出现的字母a和第二次出现的a连一条线,第三次出现的和四次出现的字母a连一条线,第五次出现的和六次出现的字母a连一条线.. ...
- 深入理解Java虚拟机 学习总结
一.运行时数据区域 Java虚拟机管理的内存包括几个运行时数据内存:方法区.虚拟机栈.本地方法栈.堆.程序计数器,其中方法区和堆是由线程共享的数据区,其他几个是线程隔离的数据区 1.1 程序计数器 程 ...
- C++基本变量类型
算数类型表 类型 含义 最小存储空间 取值范围 bool 布尔型 – char 字符型 8位 -2^7 ~ 2^7-1 wchar_t 宽字符型 16位 short 短整型 16位 -2^15 ...
- [JLOI2012]树 倍增优化
题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度是0,它的儿子节点的深度为1.路径不 ...