我们知道,计算机存储的数值是有位宽限制的,比如char占一个字节,int占四个字节(先不考虑平台限制了)。总之一个数值总是有长度限制的。可我们在科学数值计算中,就会出现问题,比如一个位数为128位的数*一个位数为128位的数,先不说乘法的结果放在什么样的类型中长度是合适的。但就操作数本身而言,就没有数据结构来存。我们的思想是:利用字符串来存,每个操作数中一个数占一个字符。源码如下:
int main()
{
string num1,num2; // 初始状态用string来存储大数
cout<<"现在,来两个大数吧! "<<endl;
cin>>num1>>num2;
const char *p1=num1.c_str(); //将string转为 const char *
const char *p2=num2.c_str(); //将string转为 const char *
multiply(p1,p2);
return 0;
}
void multiply(const char *a,const char *b)
{
int i,j,ca,cb,*s;
ca=strlen(a);
cb=strlen(b);
s=(int *)malloc(sizeof(int)*(ca+cb)); //分配存储空间,两数相乘,结果最长为两数位数的长度和
for(i=0;i<ca+cb;i++)
s[i]=0; // 每个元素赋初值0
for(i=0;i<ca;i++)
for (j=0;j<cb;j++)
s[i+j+1]+=(a[i]-'0')*(b[j]-'0');
for(i=ca+cb-1;i>=0;i--) // 这里实现进位操作
if (s[i]>=10)
{
s[i-1]+=s[i]/10;
s[i]%=10;
}
char *c=(char *)malloc((ca+cb)*sizeof(char)); //分配字符数组空间,因为它比int数组省!
i=0;
while(s[i]==0) i++; // 跳过头部0元素
for(j=0;i<ca+cb;i++,j++)
c[j]=s[i]+'0';
c[j]='\0';
for(i=0;i<ca+cb;i++)
cout<<c[i];
cout<<endl;
free(s);
}
下面给出上面的算法过程,手工模拟一下: