题目
这一天富爷又来找大头玩乘法游戏,然而不同于富爷的口算能力,大头只能列下了式子。第一题是432 × 5678:
432
5678
-------
3456
3024
2592
2160
-------
2452896
作为环保主义者的大头,认为最后一行的答案一定不能有任何的前导空格,当然了,对于某些行来说前导空格不能省。但是,珍惜资源的大头,认为任何一行都不能有任何的后导空格。作为完美主义者的大头,认为每一行的长度都应该和最后的答案行匹配。
啊,对了,有时大头还会遇到富爷的坑,假如第二个乘数有一个位置是0的话,你会发现一个0就是对应行的答案,那就把0挪到下一行,并省去这一行~~举个例子,对于200001 × 90040:
200001
90040
-----------
8000040
180000900
-----------
18008090040
第四行的最右边是一个0,就是前一行(已省去)挪下来的,而第五行的最后两个0,则是由前两行(已省去)挪下来的。
最后一个坑,对于那些只有一行中间答案的,那么最后一部分也可以省略,
246 × 70:
246
70
-----
17220
在富爷压迫下的人民,你们准备好了吗?
样例输入:
输入文件有多组测试数据,每行包含两个正数a,b,保证a,b均不超过6位。
当a = b = 0时,该数据结束,该组并不需要输出。
432 5678
200001 90040
246 70
0 0
样例输出:
剖解题目
求两个不超过 107 的数的乘积,并按要求写出过程。
思路
模拟。
然而比赛时进位没有处理好,就挂了。
解法
模拟,可以用字符串,用数时记得开longlong。
代码
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
#define fo(i,a,b) for (int i=a;i<=b;i++)
#define down(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
ll ans[15][15],x1,x2,x3;
int main()
{
//freopen("T.in","r",stdin);
// freopen("T.out","w",stdout);
int time=0;
scanf("%lld%lld",&x1,&x2);
while (x1&&x2) {
x3=x1*x2;
ll xx1=x1,xx2=x2,num3=0;
ll hg=x3,bn=0;
memset(ans,255,sizeof(ans));
while (hg) {
++num3;
hg/=10;
}
for(int pos=num3;xx1;pos--){
ans[1][pos]=xx1%10;
xx1/=10;
}
for(int pos=num3;xx2;pos--){
ans[2][pos]=xx2%10;
if (ans[2][pos]!=0) ++bn;
xx2/=10;
}
fo(i,1,num3) ans[3][i]=45;
xx2=x2;
int kh=4,kl=0;
while (xx2){
ll now=xx2%10,pos=0;
xx2/=10;
if (now){
xx1=x1;
while (xx1){
ll u=xx1%10; xx1/=10;
if (ans[kh][num3-pos-kl]==-1) ans[kh][num3-pos-kl]=0;
ans[kh][num3-pos-kl]=u*now+ans[kh][num3-pos-kl];
if (ans[kh][num3-pos-kl]/10!=0)
ans[kh][num3-pos-kl-1]=ans[kh][num3-pos-kl]/10;
ans[kh][num3-pos-kl]=ans[kh][num3-pos-kl]%10;
++pos;
}
++kh;
}
else ans[kh][num3-pos-kl]=0;
++kl;
}
if (bn!=1){
fo(i,1,num3) ans[kh][i]=45;
++kh;
for(int pos=num3;x3;pos--){
ans[kh][pos]=x3%10;
x3/=10;
}
} else --kh;
printf("Problem %d\n",++time);
fo(i,1,kh) {
fo(j,1,num3)
if (ans[i][j]==-1) printf(" ");
else if (ans[i][j]==45) printf("-");
else printf("%d",ans[i][j]);
printf("\n");
}
scanf("%d%d",&x1,&x2);
}
}