题目
1002 写出这个数 (20 分)
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10^100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
思路
本题可分为三步思考解决方案:
- 将读入的数字串识别为多个一位数字;
- 将各个数字加起来得到所求和;
- 将和的各位数字分离,分别转换为拼音输出。
本题解决思路:
- 用字符数组(n[100])来存储输入的数字串,如题意,这里保证n小于100位;
- 此时 n[i] 中存放的是字符 '1' '2' '3',所以需要将其转换为数字 1 2 3,以便求和(利用ASCII码差48求得);
- 循环累加求和,因为字符串末尾默认有 ‘\0’,故使用 '\0' 做结束标识;
- 利用求余(%)将和的各位数字记录进数组(su[4])中;
- 对于每一位数字,调用printNum函数,输出拼音。
代码
#include<cstdio>
#include<iostream>
using namespace std;
void printNum(int n);
int main(){
int sum=0,i,k;
int su[4]={0};
char n[100]={0};
//printf("Please input a num:\n");
scanf("%s",n);
for(i=0;n[i]!='\0';i++){
sum+=n[i]-48;//'0' ASCII: 48
}//get sum
//store reverseSum in su[4] ,maxSum is 900
//such as sum=345 su[4]={5,4,3,0}
i=0;
while(sum){
k=sum%10;
su[i++]=k;//i is how many digits
sum/=10;
}
//print output
//printf("this is answer:\n");
while(i--){
printNum(su[i]);//调用printNum
if(i!=0)
printf(" ");
}
return 0;
}
void printNum(int n){
switch(n){
case 0: printf("ling");break;
case 1: printf("yi");break;
case 2: printf("er");break;
case 3: printf("san");break;
case 4: printf("si");break;
case 5: printf("wu");break;
case 6: printf("liu");break;
case 7: printf("qi");break;
case 8: printf("ba");break;
case 9: printf("jiu");break;
}
}
易错点整理
- 其他函数写在主函数后面时,记得在前面声明函数。
- 注意存储的是字符还是数字,如果不进行转换为数字,则将以字符的ASCII码进行计算。
扩展:倒序输出整数
将一个int型整数倒序输出,即输入“1234”,输出“4321”。
方法一:非递归方法
【思路】可以用 “a%10” 的办法得到该整数的个位,用初始值为0的变量s记录倒序的数,如图1所示。
【代码】利用循环得到倒序:
//non-recursion
int reverseInt(int a){
int s=0;
while(a){
s=s*10 + a%10;
a/=10;
}
return s;
}
方法二:递归方法
【思路】递归应有 “递归体” 和 “递归出口”:
- 当a小于10时,执行“递归出口”:当待处理数(a)只剩一位时,所求倒序数字即s*10+a;
- 当a大于10时,执行“递归体”:一般地,假设此时传入的参数为:当前高位s=43,待处理数a=12(即a的末位 ‘3’ ‘4’ 已经转换到s中),则调用reverse函数后,应修改:当前的高位 = 之前的高位 * 10+ 之前的低位,如图2所示。递归调用此函数时,当前高位变成s=432,待处理数变成a=1。
【代码】
//recursion
int reverse(int a,int s){
if(a/10==0)
return s*10+a;
else
return reverse(a/10,s*10+a%10);
}
方法三:投机取巧方法
【思路】如果仅需输出此数,则可将各数位按单独位数输出,即实际输出 '3''2''1',而不是 '321' 。
【代码】
//another method
void reverseString(int a){
printf("This is a reverse string: ");
while(a){
printf("%d",a%10);//输出此时的个位
a/=10;//舍去个位
}
printf("\n");
}
- END -