【大数】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

分析:大数乘法,注意0N或N0或00;
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int T,f[10001],l;
string a,b;
cin>>T;
for (int i=1;i<=T;i++)
{
cout<<“Case “<<i<<”:”<<endl;
cin>>a>>b;
if (a[0]‘0’||b[0]‘0’)
{
cout<<a<<" * “<<b<<” = 0"<<endl;
if (i!=T) cout<<endl;
continue;
}
memset(f,0,sizeof(f));//初始化
int la=a.length(),lb=b.length();
for (int j=0;j<la;j++)
{
for (int k=0;k<lb;k++)
{
f[j+k]+=(a[la-j-1]-‘0’)
(b[lb-k-1]-‘0’);
l=j+k;
while(f[l]>=10)//进位
{
f[l+1]+=f[l]/10;
f[l]%=10;
l++;
}
}
}
l=10000;
while(f[l]==0) l–;
cout<<a<<" * “<<b<<” = ";
for (int j=l;j>=0;j–)
cout<<f[j];
cout<<endl;
if (i!=T) cout<<endl;
}
return 0;
}

发布了40 篇原创文章 · 获赞 0 · 访问量 671

猜你喜欢

转载自blog.csdn.net/Skynamer/article/details/103652563