大数相乘
大数相乘
代码1:
#include<stdio.h>
#include<string.h>
int main()
{
char a[110],b[110];
while(~scanf("%s %s",a,b))
{
int c[110],d[110],e[110];
memset(e,0,sizeof(e));
int i=0,j=0;
int la=strlen(a)-1;
int lb=strlen(b)-1;
while(la>=0)
{
c[i++]=a[la--]-'0';//反转
}
int ans=i;
while(lb>=0)
{
d[j++]=b[lb--]-'0';//反转
}
int cnt=j;
for(i=0; i<ans; i++)
{
for(j=0; j<cnt; j++)
{
e[i+j]+=c[i]*d[j];//记录两个数每一位相乘的积
}
}
int t=ans+cnt;
for(i=0; i<=t; i++)
{
e[i+1]+=e[i]/10;//进位
e[i]=e[i]%10;
}
for(i=t; i>=0; i--)
if(e[i])
break;//去除前面多余的0
if(i!=-1)
{
for(j=i; j>=0; j--)
printf("%d",e[j]);
}
else//当结果是0的时候
printf("0");
printf("\n");
}
return 0;
}
代码2:#include<stdio.h>
#include<string.h>
char a[50001],b[50001];
int c[50001],d[50001],e[50001];
int main()
{
while(~scanf("%s%*c%s",a,b))
{
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
memset(e,0,sizeof(e));
int i=0,j=0,la,lb,m,n,k,x,y,v,u;
la=strlen(a)-1;
lb=strlen(b)-1;
while(la>=0)
c[i++]=a[la--]-'0';
while(lb>=0)
d[j++]=b[lb--]-'0';
for(u=0;u<i;u++)
{
y=0;
x=u;
for(v=0;v<j;v++)
{
e[x]+=c[u]*d[v]+y;
e[x]=e[x]%10;
y=e[x]/10;
x++;
}
}
for(j=x+1;j>=0;j--)
{
if(e[j])
break;
}
for(i=j;i>=0;i--)
printf("%d",e[i]);
printf("\n");
}
return 0;
}
C++版:
int e[50001];
string mul(string a,string b)
{
if(a=="0"||b=="0")
return "0";
memset(e,0,sizeof(e));
int i=0,j=0;
int la=a.length();
int lb=b.length();
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
for(i=0; i<la; i++)
for(j=0; j<lb; j++)
e[i+j]+=(a[i]-'0')*(b[j]-'0');
int t=la+lb;
for(i=0; i<=t; i++)
{
e[i+1]+=e[i]/10;
e[i]=e[i]%10;
}
for(i=t; i>=0; i--)
if(e[i])
break;
string s="";
if(i!=-1)
{
for(j=i; j>=0; j--)
s+=(e[j]+'0');
}
else
s="0";
return s;
}
大数相加
C++版:
string add(string a,string b)
{
if(a=="0")
return b;
if(b=="0")
return a;
string s;
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
int i=0;
int m,k=0;
while(a[i]&&b[i]&&i<a.length()&&i<b.length())
{
m=a[i]-'0'+b[i]-'0'+k;
k=m/10;
s+=(m%10+'0');
++i;
}
if(i==a.size())
{
while(i!=b.size())
{
m=k+b[i]-'0';
k=m/10;
s+=(m%10+'0');
++i;
}
if(k)
s+=(k+'0');
}
else if(i==b.size())
{
while(i!=a.size())
{
m=k+a[i]-'0';
k=m/10;
s+=(m%10+'0');
++i;
}
if(k)
s+=(k+'0');
}
reverse(s.begin(),s.end());
return s;
}
C语言版:
#include<stdio.h>
#include<string.h>
char a[1005],b[1005];
int c[1005];
int main()
{
int t,m=1;
scanf("%d",&t);
while(m<=t)
{
memset(c,0,sizeof(c));
scanf(" %s %s",a,b);
int i,j,k,la,lb,cnt;
la=strlen(a);
lb=strlen(b);
cnt=la>lb?la:lb;
la-=1;
lb-=1;
for(i=0; la>=0; i++,la--)//反转大数
{
c[i]+=a[la]-'0';
}
for(i=0; lb>=0; i++,lb--)//反转并求和
{
c[i]+=b[lb]-'0';
if(c[i]>=10)//处理进位
{
c[i]-=10;
c[i+1]+=1;
}
}
while(c[i])
{
if(c[i]>=10)//处理进位
{
c[i]-=10;
c[i+1]+=1;
}
i++;
}
for(j=cnt; j>=0; j--)//去除前面多余的0
if(c[j]!=0)
break;
printf("Case %d:\n",m++);
printf("%s + %s = ",a,b);
if(j!=-1)//注意答案可能为0
{
for(i=j; i>=0; i--)
printf("%d",c[i]);
}
else
printf("0");
if((m-1)==t)
printf("\n");
else
printf("\n\n");
}
return 0;
}