原题目:
读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10^100^。
输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
分析:
- 对于最大为10的100次方的大数,普通的方式不好存储,我们采用字符串保存。【gets(ch);】
- 由于字符采用ASC II 码值的保存方式,每位数字字符减去字符0的ASC II 码值即可即可得到每位的数值,再求和即可求得各位数字之和。
- 输入之数每位数字最大之和不超过900,故可以省力直接将和的百十个位直接分解,若其他题目可能出现较大数,可采用数组保存每位的数。
- 对于百位和十位有可能出现0的情况进行讨论,个位则可以直接在最后打印
百位 | 十位 | 处理 |
为0 | 为0 | 无操作 |
为0 | 非0 | 打印十位 |
非0 | 为0 | 依次打印百位十位 |
非0 | 非0 | 依次打印百位十位 |
5.每个数字的中文保存成字符串数组,最后直接调用打印,注意每个中文数字后有空格,但最后一个没有。
代码:
C语言版:
#include <stdio.h>
#include <string.h>
int main()
{
//用于保存输入的数,直接存为字符串
char ch[101];
//将中文数字直接保存为字符串数组,需要时直接使用,从0开始到9,方便调用,因为数组下标从0开始
char Num[10][5]={"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
int i,j,k,p=0;
gets(ch);
for(i=0;i<strlen(ch);i++)
{
//将字符串中的每一位减去字符'0'的ASC ii码值,即可得到每一位的大小,并与之前的数求和保存
p+=ch[i]-'0';
}
//直接分解,百位为i,十位为j,个位为k,也可以采用数组保存
i=p/100;
j=(p/10)%10;
k=p%10;
//分情况处理,打印结果
if(i==0&&j==0)
{
//
}
else if(i==0&&j!=0)
{
printf("%s ",Num[j]);
}
else
{
printf("%s ",Num[i]);
printf("%s ",Num[j]);
}
printf("%s",Num[k]);
return 0;
}