1. 程式人生 > 其它 >PAT乙級_1002 寫出這個數

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;
}