BOJ 469. 暑假作业题

来源:互联网 发布:小米摄像头app软件 编辑:程序博客网 时间:2024/05/17 21:54

题意:给出一个数,输出中文读法

思路:巨坑的模拟题。我的方法是分治法。因为最后处理的其实是万以内的数。所以,我们先判断是否大于亿,在判断是否大于万,最后只对万以内的数处理。

          其中有一个问题是:是否有多余的0需要读。

          处理方法是这样的:1.对于千位的处理:传入一个标识变量,表示千以前是否有数。如果有数且千位为0且整个千位数不为0,那就必须要多读一个0.

                                          2.对于其他位的处理:首先要读出一个不是0的数,如果此数后一位为0且后面还有不为0的数,那接下来就要多读一个0;

          其他细节请看代码。

坑:只有0需要读0

代码如下:

#include <cstdio>#include <cstring>#include <cmath>#include <vector>#include <iostream>#include <map>#include <queue>#include <stack> using namespace std; const long long E = 100000000LL;const long long W = 10000LL;char c[4] = {0,'S','B','Q'}; void solve(long long num,bool signal){    if(num / E > 0){        solve(num / E,false);        putchar('E');        solve(num % E,true);    }    else if(num / W > 0){        solve(num / W,signal);        putchar('W');        solve(num % W,true);    }    else{        int a[4]={0};        int cnt = 0;        for(int i = 0 ; num;++i, num/=10){            a[i] = num % 10;            if(a[i] != 0) cnt++;        }        if(cnt != 0 && a[3] == 0 && signal)            putchar('0');        for(int i = 3; i > 0; i--){            if(a[i] != 0){                putchar(a[i] + '0'),putchar(c[i]),cnt--;                if(cnt != 0 && a[i-1]==0)                putchar('0');            }        }        if(a[0] != 0)            putchar(a[0] + '0');    }} int main(void){    //freopen("input.txt","r",stdin);    int n;    scanf("%d", &n);    while(n--){        long long num;        scanf("%lld", &num);        if(num==0)            puts("0");        else{            solve(num,false);            puts("");        }    }    return 0;}

0 0