CSU

来源:互联网 发布:复杂网络中心性 编辑:程序博客网 时间:2024/04/30 19:45

题目:

http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1850

题意:

模拟乘法竖式,不过有以下几点不同:
- 竖式运算中间过程中某一行为全部0时,此行不输出,而在下一行输出后补0,若下一行也是0,那么就在下下行补两个0,以此类推
- 按照上述规则,若中间的运算步骤只有一行且就是最后乘积,那么省略中间过程

思路

很恶心的一个模拟题,主要是格式比较麻烦。首先算出乘积,决定输出的列数。对于某一行全为0的情况,开一个计数变量,遇到不为0的某一行时,把0补在后面,并把计数清空。如果某一行的值等于乘积(实际此时就只有一行),直接break,防止多输出中间过程,其余的看代码和注释

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1010;int cas = 0;void print_char(int n, char ch){    for(int i = 0; i < n; i++) printf("%c", ch);}int main(){    ll a, b;    while(scanf("%lld%lld", &a, &b), a || b)    {        ll res = a*b;        int len = log10(1.0*res) + 1, len_a = log10(1.0*a) + 1, len_b = log10(1.0*b) + 1;        printf("Problem %d\n", ++cas);        print_char(len-len_a, ' '); printf("%lld\n", a);        print_char(len-len_b, ' '); printf("%lld\n", b);        print_char(len, '-'); printf("\n");        int num = 0;        bool flag = true;        for(int i = 0; b; i++, b /= 10)        {            int t = b % 10;            if(t == 0)//乘数为0,当前行数字必为0,计数变量加1            {                num++; continue;            }            ll c = t * a;            int t_num = num;            ll t_c = c;            while(t_num--) t_c *= 10;            if(t_c == res)//判断有没有某一行数字等于乘积,若等于就跳出            {                flag = false; break;            }            int len_c = log10(1.0*c) + 1;            print_char(len-len_c-i, ' ');//前面所打印的空格应该是总列数-当前行数字长度-当前行数字后面的空格            printf("%lld", c);            print_char(num, '0');//补0            print_char(i-num, ' ');//减去补0的数目,才是真正要打印的空格数目            num = 0;            printf("\n");        }        if(flag)        {            print_char(len, '-'); printf("\n");        }        printf("%lld\n", res);    }    return 0;}
0 0
原创粉丝点击