解法:既然一个变量无法表示一个超长整数,那么我们使用多个变量好了。当然这使用阵列最为方便,整型数值最大可以存储至65535,为了方便以符合使用十进制的习惯,让每一个阵列元素存储四个位数,也就是0到9999的数,
高位数 | 低位数 | ||
A[0] | A[1] | A[2] | A[3] |
1234 | 5678 | 2234 | 5678 |
B[0] | B[1] | B[2] | B[3] |
3345 | 1458 | 2345 | 3453 |
+ - * /加减乘除C[N]用于存放结果
C[0] | C[1] | C[2] | C[3] |
???? | ???? | ???? | ???? |
//超长整数运算研究#includeusing namespace std;#define N 1000//大数相加,a:被加数,b:加数,c:运算结果void add(int *a, int *b, int *c){ int i = 0,carry = 0; for(i = N-1; i >= 0; i--) { c[i] = a[i] + b[i] + carry; if(c[i] < 10000) { carry = 0; } else//进位 { c[i] = c[i] - 10000; carry = 1; } }}//大数相减,a:被减数,b:减数,c:运算结果void sub(int *a, int *b, int *c){ int i, borrow = 0; for(i = N-1; i >= 0; i--) { c[i] = a[i] - b[i] - borrow; if(c[i] >= 0) borrow = 0; else //借位 { c[i] = c[i] + 10000; borrow = 1; } }}//大数相乘,a:被乘数,b:乘数,c:运算结果//这里的b只是一个正常数,不属于大数,如果是两个大数相乘只能是,先相乘再相加,得到最终结果void mult(int *a, int b, int *c){ int i,tmp,carry = 0; for(int i = N-1; i >= 0; i--) { tmp = a[i] * b + carry; c[i] = tmp % 10000; carry = tmp / 10000; }}//大数相除,a:被除数,b:除数,c:运算结果//如果是两个大数相除,只能通过减的方式,一直减,直到小于减数为止,得到的数是余数,减的次数,就是商//比如 121 30 121-4*30=1,1是余数,4是商void div(int *a, int b, int *c){ int i,tmp,remain = 0; for(i = 0; i < N; i++) { tmp = a[i] + remain; c[i] = tmp / b; remain = (tmp%b)*10000; }}void result(int *c){ for(int i = 0; i < 4; i++) { cout << c[i]; }}int main(void){ int a1[N] = {3345,1458,3423,2345}; int b1[N] = {1234,5678,2234,5678}; int c1[N]; add(a1,b1,c1); result(c1); sub(a1,b1,c1); result(c1); }