大数的运算问题 最好数组 不要用STL

来源:百度知道 编辑:UC知道 时间:2024/05/30 06:13:26
写一个计算器,计算两个大数的加法和乘法;
两个数字,最低、最高,都可以达到16位,即 -(10^16-1) 到 (10^16-1)
例如:
两个数字:
---------
-123456789
777777777777

计算结果:
---------
(-123456789)+777777777777=777654320988
(-123456789)*777777777777=-96021946999903978053

如果不是很大300位内,可以采用笔算算法。用数组存放大数

大数乘法:
参数:*x表示第一个大数,存放位数不限,size1表示第一个大数的长度,*y表示第二个大数,size2表示长度。
调用方式:(以较小的数做测试,证明输出结果是正确的,大数肯定不会出错。)
int i[] = {5,2}; //表示25
int j[] = {5,2}; //表示25
multy(i, 2, j, 2); //程序输出 0 6 2 5
void multi(int *x, int size1, int *y, int size2){
int size = size1 + size2;
int *result = new int[size];
memset(result, 0, sizeof(int) * size);

for(int i=0; i<size1; i++){
int k = i;
for(int j=0; j<size2; j++){
result[k++] += x[i]*y[j];
}
}

for( i=0; i<size; i++){
if(result[i] >= 0){
result[i+1] += result[i]/10;
result[i] %= 10;
}
}
for( i=size-1; i>=0; i--){
cout << result[i] << " ";
}
}

没做符号位处理。。。不过乘法的符号位的话,应该很容易吧
这是以前写的一段,直接贴上了。
大数加法比乘法还简单。。懒得自己写了,LZ看到应该会有思路吧?

16位以内计算机是可以装下的
比如
C++ 的 long long 可以装下20位整数,范围是-(2^63-1) 到 (2^63-1)