A × B problem
题目描述
Redraiment碰到了一个难题,需要请你来帮忙:给你两个整数,请你计算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
数组模拟,要细心。
#include<iostream> #include<cstring> #include<queue> using namespace std; int a[1000]={0},b[1000]={0},mm[5000]={0}; void daozhi(string s,int a[])//数据倒置存入数组中; { int i,m=0; for(i=s.size()-1;i>=0;i--) { a[m++]=s[i]-'0'; } } void rebuild(string s,string ss,int a[],int b[],int mm[])//乘法的模拟 { int n,k,i,j; for(i=0;i<s.size();i++) { n=i; for(j=0;j<ss.size();j++) { k=(mm[n]+(a[i]*b[j])%10)/10; mm[n]=(mm[n]+(a[i]*b[j])%10)%10; mm[n+1]+=((a[i]*b[j])/10+k); n++; } } } int main() { int n,count,i; cin>>n; count=n; while(n--) { string c,d; cin>>c>>d; cout<<"Case "<<count-n<<":"<<endl; daozhi(c,a); daozhi(d,b); rebuild(c,d,a,b,mm); cout<<c<<" *"<<" "<<d<<" ="<<" "; for(i=4999;i>=0;i--) { if(mm[i]) break; } for( ;i>=0;i--) { cout<<mm[i]; } cout<<endl; if(n) cout<<endl; memset(mm,0,sizeof(mm)); } return 0; }