PTA | 1002 写出这个数 一次过

106 阅读1分钟

PTA | 1002 写出这个数 这道题实际考察我们拆位映射

相加求和 首先我们需要把输入的数字每一位都进行相加,这里我们可以利用一个sum,每输入一位就加到sum上。我们可以用string获取输入的个数,然后再转化为数字,遍历所有数字进行相加即可。

拆和

然后把总和拆成每一位,比如135,拆完之后,number里存的就是[5,3,1](因为取模是取的后面的数)

映射输出

所以输出的时候应该从最高位开始输出,即先输出1,再输出3,最后输出5。

我们手动建立映射

第一次直接输出1对应的映射关系,第二次输出之前判断当前位置是否是起始位置(最高位),如果不是就空一个空格,继续输出。

#include<iostream>
#include<string>
using namespace std;
  int sum ,number[3],j;
int main()
{

   
    //统计输入的数字各位之和
    string x;cin>>x;
     for (int i = 0;i < x.size();i++)
        sum += x[i] - '0';

    
  //总和拆位
    while(sum>0)
    {
        number[j]=sum%10;
        sum/=10;
        j++;
    }

       for (int i = j - 1;i >= 0;i--)
    {
        if (i != j - 1) cout << ' ';//如果不是最高位就都打印一个空格
        switch (number[i]) {
                case 0:cout << "ling";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;
        }
    }

    return 0;
}

image.png

二刷

#include<bits/stdc++.h>
using namespace std;
int sum;
vector<string>ans;
string haxi[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
int main()
{
  string s;cin>>s;

    for(int i=0;i<s.size();i++)
    {
     sum+=s[i]-'0';
    }

         while(sum){
             ans.push_back(haxi[sum%10]);
             sum/=10;
         }

   reverse(ans.begin(),ans.end());
    for(int i=0;i<ans.size();i++)
    {
        if(i)cout<<" ";
        cout<<ans[i];
    }
return 0;

}

image.png