上一篇说了简单的大数乘以小数的问题,绝大多数的问题解决不了。
现在我们来说一下大数乘以大数。
大数乘以大数也是用来模拟手算。
举个例子吧!
先从个位开始一个一个的乘 乘完个位然后再乘十位,乘十位的时候要和个位的想成的结果相加。
这里注意乘十位的时候 就不要和乘个位数字的结果中的最后一位相加了 。就是如图搓位。
就是这样 。
下面先贴上我的代码。
#include<iostream>
#include<string.h>
using namespace std;
void mult(char a[],char b[])
{
int alen = strlen(a);
int blen = strlen(b);
if(alen%2)
{
for(int i=0;i<=alen/2;i++)
{
int t = a[i]-'0';
a[i]=a[alen-1-i]-'0';
a[alen-1-i]=t;
}
}
else
{
for(int i=0;i<alen/2;i++)
{
int t = a[i]-'0';
a[i]=a[alen-1-i]-'0';
a[alen-1-i]=t;
}
}
if(blen%2)
{
for(int i=0;i<=blen/2;i++)
{
int t=b[i]-'0';
b[i]=b[blen-1-i]-'0';
b[blen-1-i]=t;
}
}
else
{
for(int i=0;i<blen/2;i++)
{
int t=b[i]-'0';
b[i]=b[blen-1-i]-'0';
b[blen-1-i]=t;
}
}
int sum = 0;
int s[200]={0};
memset(s,0,sizeof(s));
int k=0;
for(int i=0;i<blen;i++)//这里操作了各位相乘 并把结果保留在了s中
{
k=i;
for(int j=0;j<alen;j++)
{
sum=b[i]*a[j]+s[k]+sum;
s[k++]=sum%10;
sum=sum/10;
}
if(sum)
s[k++]=sum;
}
for(int i=k-1;i>=0;i--)
{
cout<<s[i];
}
cout<<endl;
}
int main()
{
char a[50],b[50];
while(1)
{
cin>>a>>b;
char c[100];
mult(a,b);
}
system("pause");
return 0;
}
代码很长主要是中间处理两个数组的时候我费了很多劲,这里完全可以不用这么做,重新开辟一个数组很方便的。代码很短。主要看中间想成的那部分代码。
下面我贴上模板中的代码,我没有看懂,因为我看到代码处理时用到了二维数组,我觉得二维数组局限性就大了,比如位数不能太多等等。所以我就没仔细研究。
看以看看模板中怎么处理的数组,把我的那部分替换掉。
#include<iostream>
#include<string.h>
using namespace std;
void mult(char a[],char b[],char s[])
{
int i,j,k=0,alen,blen,sum=0,res[65][65]={0},flag=0;
char result[65];
alen=strlen(a);blen=strlen(b);
for(i=0;i<alen;i++)
for(j=0;j<blen;j++)
res[i][j]=(a[i]-'0')*(b[j]-'0');
for(i=alen-1;i>=0;i--)
{
for(j=blen-1;j>=0;j--)
{
sum=sum+res[i+blen-j-1][j];
cout<<i+blen-j-1<<" "<<res[i+blen-j-1][j]<<endl;
}
result[k]=sum%10;
k=k+1;
sum=sum/10;
}
for(i=blen-2;i>=0;i--)
{
for(j=0;j<=i;j++)
sum=sum+res[i-j][j];
result[k]=sum%10;
k=k+1;
sum=sum/10;
}
if(sum!=0){result[k]=sum;k=k+1;}
for(i=0;i<k;i++)
result[i]+='0';
for(i=k-1;i>=0;i--)
s[i]=result[k-1-i];
s[k]='\0';
while(1)
{
if(strlen(s)!=strlen(a)&&s[0]=='0')
strcpy(s,s+1);
else
break;
}
}
int main()
{
char a[50],b[50];
cin>>a>>b;
char c[100];
mult(a,b,c);
cout<<c<<endl;
cout<<endl;
cout<<endl;
system("pause");
return 0;
}
好了!
感谢自己坚持。