题目
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10
100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
经验总结
一道比较简单的题。
先把输入的数的各位和计算出来,这个和不会超过4位数。
然后将和的每一位分出来,从高位到低位依次输出,对数字为“0”的数位判断是否应该输出“ling”。
注意每个数字输出后的空格和最后一位后直接换行没有空格。
AC代码
#include<iostream>
#include"stdio.h"
#include"math.h"
#include"string.h"
using namespace std;
int main()
{
char a[115];
int t=0;
string b[15]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
while(cin>>a)
{
int l=strlen(a);
for(int i=0;i<l;i++)
{
t=t+a[i]-48;
}
//cout<<t<<endl;
int k=0,x;
x=t/1000;
t=t%1000;
if(x!=0){
cout<<b[x]<<" ";
k++;
}
x=t/100;
t=t%100;
if(x!=0||k!=0){
cout<<b[x]<<" ";
k++;
}
x=t/10;
t=t%10;
if(x!=0||k!=0){
cout<<b[x]<<" ";
k++;
}
if(t!=0||k!=0){
cout<<b[t]<<endl;
}
}
return 0;
}
思路优化
看了大神的代码之后,觉得输出的部分可以优化一些。
得到各位数字和之后,先判断这个和是几位数。然后直接从高位输出到低位,可以省去对“0”的判断部分。
代码优化
#include<iostream>
#include"stdio.h"
#include"math.h"
#include"string.h"
using namespace std;
int main()
{
char a[115];
int t=0;
string b[15]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
while(cin>>a)
{
int l=strlen(a);
for(int i=0;i<l;i++)
{
t=t+a[i]-48;
}
//cout<<t<<endl;
int n=0,k=t;
while(t!=0){
t=t/10;
n++;
}
//cout<<n<<endl;
int p;
while(n>0){
p=pow(10.0,n-1);
cout<<b[k/p];
if(n>1) cout<<" ";
else cout<<endl;
k=k%p;
n--;
}
}
return 0;
}