就是乘法【NOIP2016提高A组模拟9.24】

来源:互联网 发布:软件系统安全 编辑:程序博客网 时间:2024/06/05 23:46

题目

这一天富爷又来找大头玩乘法游戏,然而不同于富爷的口算能力,大头只能列下了式子。第一题是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);    }}
0 0
原创粉丝点击