【字符串】【AOJ-152】A × B problem(大数相乘、高精度乘法)
Description
给你两个整数,请你计算A × B。
Input
数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数。
接着有T组数据,每组数据只有一行,包括两个正整数A和B(可能以0起头)。
但A和B非常大,Redraiment能保证这些数用long来保存一定会溢出。
但A和B的位数最大不会超过100位。
接着有T组数据,每组数据只有一行,包括两个正整数A和B(可能以0起头)。
但A和B非常大,Redraiment能保证这些数用long来保存一定会溢出。
但A和B的位数最大不会超过100位。
Output
对应每组测试数据,你都要输出两行:
第一行为:"Case #:", # 代表这是第几组测试数据。
第二行是一个等式:"A * B = Sum", Sum 代表 A × B 的结果。
你要注意这个等式里包含了几个空格。
要求每组数据之后都需要保留一个空行。
第一行为:"Case #:", # 代表这是第几组测试数据。
第二行是一个等式:"A * B = Sum", Sum 代表 A × B 的结果。
你要注意这个等式里包含了几个空格。
要求每组数据之后都需要保留一个空行。
Sample Input
2 1 2 123456789 0987654321
Sample Output
Case 1: 1 * 2 = 2 Case 2: 123456789 * 0987654321 = 121932631112635269
思路:
和高精度加法差不多 用字符串储存
把字符串中的字符转成数字存到一个int数组里 接着先进行乘法运算 然后处理进位移位 注意c[i+j]可以很好的处理空0的地方
参考代码:
#include <stdio.h> #include <string.h> #define LEN 110 void del(char *a,int n) { int i,len; len=strlen(a); for(i=0;i<len-n;i++) a[i]=a[i+n]; a[i]='\0'; } int main() { char a[LEN],b[LEN],sa[LEN],sb[LEN]; int s1[LEN],s2[LEN],c[2*LEN]; int t,flag=1; int i,j,n=0; int lena,lenb; scanf("%d",&t); while(t--) { scanf("%s%s",a,b); strcpy(sa,a); strcpy(sb,b); for(i=0,n=0;a[i]!='\0';i++) { if(a[i]=='0') n++; else break; } del(a,n); for(i=0,n=0;b[i]!='\0';i++) { if(b[i]=='0') n++; else break; } del(b,n);//删除前导0 memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2)); memset(c,0,sizeof(c)); lena=strlen(a); lenb=strlen(b); for(i=0;i<lena;i++) s1[i]=a[lena-1-i]-'0'; for(i=0;i<lenb;i++) s2[i]=b[lenb-1-i]-'0';//转换为数字 for(i=0;i<lena;i++) for(j=0;j<lenb;j++) c[i+j]+=s1[i]*s2[j];//计算 for(i=0;i<lena+lenb;i++)//处理进位 移位 { c[i+1]+=c[i]/10; c[i]=c[i]%10; } printf("Case %d:\n%s * %s = ",flag++,sa,sb); if(c[lena+lenb-1]==0) for(i=lena+lenb-2;i>=0;i--) printf("%d",c[i]); else for(i=lena+lenb-1;i>=0;i--) printf("%d",c[i]); printf("\n"); printf("\n"); } return 0; }