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;
}