题目来源
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输入样例:
yi san wu
题目解析:
难点1:
题目要求输入一串正整数,而这串正整数比较大,最高可达,这个数值远超int 和long int的存储上限,一个8字节的long int 的范围约在~之间,所以不能直接用:
long int n;
scanf("%d", &n);
这里我的思路是,创建一盒长度为100的字符数组:
char n[100];
每个元素存一个数字的字符量,然后再用字符量的ASCII值减去0字符的ASCII值得到整形值,如下:
sum += n[i] - '0';//获取整形值
难点2:
为了最后能输出0 ~ 9数字的拼写:ling ~ jiu。我们需要一个字符串表,用来查找这些拼写,这里有两种方法:
方法1,创建一个二维字符数组:
const char dic[10][] = {"ling","yi","er",\ //这是一个换行符
"san","si","wu","liu","qi","ba","jiu"}
方法2,创建一个一维字符指针数组,数组的每一个元素都是一个字符指针,指向我们定义的拼写字符的地址:
const char *dic[] = {"ling","yi",\ //这是一个换行符
"er","san","si","wu","liu","qi","ba","jiu"};
之所以用了const,是因为我这里的元素都是常量,不希望被修改。
完整代码:
#include <stdio.h>
int main(){
char n[100];
const char *p[3];//定义一个指针,用来指向要输出的拼写的地址,
//为什么是3个,这里可以思考一下下
int index,i;
const char *dic[] = {"ling","yi",\ //换行符
"er","san","si","wu","liu","qi","ba","jiu"};
int sum = 0,j = 0;
scanf("%s", n);//字符化读入
for (i = 0; n[i] != '\0'; i++){
sum += n[i] - '0';
}//遍历求和
if (sum == 0){
index = 0;
printf("%s", dic[index]);
}else{
while(sum>0){
index = sum%10;
sum /= 10;
p[j] = dic[index];
j++;
}//遍历sum,使指针指向字母拼写的地址
while(j>0){
j -- ;
printf("%s", p[j]);
if (j != 0){
printf(" ");
}
}//遍历指针输出字母拼写
}
return 0;
}
网友评论