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

输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10
的100次方
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
我的代码是
#include
#include
#include
using namespace std;
int main()
{
int sum=0,len,i;
string str;
cin>>str;
len=str.length();
for(i=0;i {sum=sum+str[i]-'0';};
string a[10]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
int x,y,z;//x为个位,y为十位,z为百位。
if(sum>99)
{
z=sum/100;
y=(sum/10)%10;
x=sum%10;
cout<<a[z]<<' '<<a[y]<<' '<<a[x]<<endl;
}
if(sum<100)
{
y=(sum/10)%10;
x=sum%10;
cout<<a[y]<<' '<<a[x]<<endl;
}
return 0;
}
第二节点过不去是怎么回事

c++

1个回答

你这个逻辑有问题吧!你对sum的分类为,sum>99和sum小于100是不对的,根据题目要求n小于10的100次方,所以各位数字之和最大不会超过909;
所以,如果你采用分类讨论,应该分0到9,10到99,100到999三种情况;

int x,y,z;//x为个位,y为十位,z为百位。
    if(sum>=0&&sum<=9)//sum只有一位数字
        cout<<a[sum]<<endl;
    if(sum>=10&&sum<=99) {//sum有两位数字 
        y=(sum/10)%10;
        x=sum%10;
        cout<<a[y]<<' '<<a[x]<<endl;
    }
    if(sum>=100&&sum<=999) {//sum有三位数字 
        z=sum/100;
        y=(sum/10)%10;
        x=sum%10;
        cout<<a[z]<<' '<<a[y]<<' '<<a[x]<<endl;
    }
其实还有一种更简单的方法,一个while循环就搞定了,
截取数字上各位数字,但是这种方法不能处理数字0的特殊情况,所以需要单独对sum为0的情况进行处理。以后有什么问题可以问我哦!
直接上代码:
if(sum==0)
        cout<<a[0]<<endl;
    else {
        while(sum!=0) {
            b[k++]=sum%10;
            sum=sum/10;
        }
        for(int j=k-1; j>0; j--)  //注意这里要倒序输出,因为whike循环是从数字的低位开始截取的
            cout<<a[b[j]]<<" ";
        cout<<a[b[0]];//为了防止最后一个拼音后有空格
    }
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问