解法:既然一个变量无法表示一个超长整数,那么我们使用多个变量好了。当然这使用阵列最为方便,整型数值最大可以存储至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] |
???? | ???? | ???? | ???? |
//超长整数运算研究
#include<iostream>
using 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);
}