PAT乙级_1002 写出这个数

题目(20分)

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100

输出格式:

在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:

1234567890987654321123456789

结尾无空行

输出样例:

yi san wu

结尾无空行  

提交

19分

#include <bits/stdc++.h>
using namespace std;

int Plus(string n) {
    int num = 0;
    int len = n.length();
    for (int i = 0; i < len; i++) {
        char temp = n[i];
        num += temp - '0'; //隐式转换,char类型变int类型,从ASCII码表可以看出减去字符0对应的‘48’就是十进制
    }
    return num;
}

int reverse(int x) {
    int _x = 0;
    while (x != 0) {
        _x = _x * 10 + x % 10;
        x /= 10;
    }
    return _x;
}

void Word(int m) {
    while (1){
        int temp = m % 10;
        switch(temp) {
            case 0:
                cout << "lin";
                break;
            case 1:
                cout << "yi";
                break;
            case 2:
                cout << "er";
                break;
            case 3:
                cout << "san";
                break;
            case 4:
                cout << "si";
                break;
            case 5:
                cout << "wu";
                break;
            case 6:
                cout << "liu";
                break;
            case 7:
                cout << "qi";
                break;
            case 8:
                cout << "ba";
                break;
            case 9:
                cout << "jiu";
                break;
        }
        m /= 10;
        if (m != 0)
            cout << " ";
        else
            return;
    }
}

int main () {
    string n;
    cin >> n; //输入字符串
    int r = Plus(n); //计算数字的和
    int r1 = reverse(r); //翻转和
    Word(r1);//取余的模式输出拼音
}

思路:超出了long long,所以以字符串的形式cin,再统计数的和;用取余的方式输出拼音,所以先反转一下和。

这里有个误区,如果和是0结尾,反转和的时候0就不存在了(比如300→3)

就少了一分

解决(20分):

都用数组存放,0就不会消失了。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    char x[10000]; //字符数组 最后一个是 '\0'
    int s[10000];   //字符数组转换成int 数组
    int y[10000];   //反转和 数组
    int g = 0; //统计 反转和 数组的长度
    int sum = 0;//统计和
    cin >> x;
    //统计字符串的和 遇到\0就停止累加
    for (int i = 0; x[i] != '\0'; i++)
    {
        s[i] = x[i] - '0';
        sum += s[i];
    }
    
    if (sum == 0)
        cout << "ling";
    else //反转和,放进数组内
    {
        while (sum != 0)
        {
            int k;
            k = sum % 10;
            y[g++] = k;
            sum = sum / 10;
        }
    }
    //从数组最后往前输出 解决最后一个拼音不带空格的问题
    for (int i = g - 1; i >= 0; i--)
    {
        switch (y[i])
        {
        case 0:if (i != 0)cout << "ling" << " ";
               else cout << "ling"; break;
        case 1:if (i != 0)cout << "yi" << " "; else cout << "yi"; break;
        case 2:if (i != 0)cout << "er" << " "; else cout << "er"; break;
        case 3:if (i != 0)cout << "san" << " "; else cout << "san"; break;
        case 4:if (i != 0)cout << "si" << " "; else cout << "si"; break;
        case 5:if (i != 0)cout << "wu" << " "; else cout << "wu"; break;
        case 6:if (i != 0)cout << "liu" << " "; else cout << "liu"; break;
        case 7:if (i != 0) cout << "qi" << " "; else cout << "qi"; break;
        case 8:if (i != 0)cout << "ba" << " "; else cout << "ba"; break;
        case 9:if (i != 0)cout << "jiu" << " "; else cout << "jiu"; break;
        }
    }
    return 0;
}
上一篇:1002 写出这个数 (20 分)


下一篇:oracle中文乱码问题解决