您的位置:首页 > 编程语言 > C语言/C++

C语言大数相乘的问题

2014-02-28 16:12 323 查看
给你两个整数,请你计算A × B。

输入

数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数。

接着有T组数据,每组数据只有一行,包括两个非负整数A和B。

但A和B非常大,Redraiment能保证这些数用long来保存一定会溢出。

但A和B的位数最大不会超过100位。

输出

对应每组测试数据,你都要输出两行:

第一行为:"Case #:", # 代表这是第几组测试数据。

第二行是一个等式:"A * B = Sum", Sum 代表 A × B 的结果。

你要注意这个等式里包含了几个空格。

要求每组数据之间都需要保留一个空行。

样例输入

2

1 2

123456789 987654321

样例输出

Case 1:

1 * 2 = 2

Case 2:

123456789 * 987654321 = 121932631112635269

很显然对于100位的数据我们无法定义他的类型,因此只能用数组一位一位计算,然后输出结果,但应注意要把字符转换成数字,同样运算时千万要注意0的运算

#include<stdio.h>

#include<string.h>

#define MAX 10005

int main()

{

int n,i,j,t,s;

char a[102],b[102],temp[105]={0},sum[MAX]={0};

int lena,lenb,flag;

scanf("%d",&n);

while(n--)

{

flag=0;

scanf("%s%s",a,b);

lena=strlen(a);

lenb=strlen(b);

for(j=lenb-1;j>=0;j--)

{

for(t=lena,i=lena-1;i>=0;i--,t--)

{

temp[t]=(a[i]-0x30)*(b[j]-0x30);

}

for(t=lena;t>=1;t--)

{

if(temp[t]>9)

{

temp[t-1]+=temp[t]/10;

temp[t]%=10;

}

}

for(s=lena+lenb-flag,t=lena;t>=0;t--,s--)

sum[s]+=temp[t];

for(t=lena;t>=0;t--)

temp[t]=0;

for(s=lena+lenb;s>=1;s--)

{

if(sum[s]>9)

{

sum[s-1]+=sum[s]/10;

sum[s]%=10;

}

}

flag++;

}

sum[lena+lenb+1]='\0';

for(s=0;s<=lena+lenb;s++)

sum[s]=sum[s]+0x30;

for(s=0;s<lena+lenb;s++)

if(sum[0]==0x30)

{

for(t=0;t<=lena+lenb-s;t++)

sum[t]=sum[t+1];

}

else break;

printf("Case %d:\n",m);

printf("%s * %s = %s\n",a,b,sum);

if(n!=0)

printf("/n");

for(s=lena+lenb+1;s>=0;s--)

sum[s]=0;

}

return 0;

}

问题还可以扩展成大数相减,相加,阶乘问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: