C语言大数相乘A × B problem

给你两个整数,请你计算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

题目来源

ZJGSU

    

       很显然对于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,m=0; scanf("%d",&n); while(n--) {m++; 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; }
问题还可以扩展成大数相减,相加,阶乘问题。

转载于:https://www.cnblogs.com/Joyin/archive/2009/04/19/2262136.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值