一、题目详情
问题描述:写出这个数
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100。
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:
1234567890987654321123456789
输出样例:
yi san wu
代码长度限制:16 KB
时间限制:400 ms
内存限制:64 MB
二、题目解析
代码:
#include <stdio.h>
#include <string.h>
int main()
{
/*
* hzStr[10][4]:用于存储数字0~9对应的汉语拼音
* num[100]:用于存储输入的正整数n
* sum:用于存储各位数字之和,初始化为0
* sumStr:将sum转换为字符串并存储在sumStr中
* len:用于存储字符串sumStr的长度
* i:循环变量
*/
char hzStr[10][4] = {"ling", "yi", "er", "san", "si",
"wu", "liu", "qi", "ba", "jiu"};
char num[100], sumStr[10];
int sum = 0, i, len;
scanf("%s", num);//读取正整数n
//计算正整数n各位数字之和
for(i=0;num[i]!='\0';i++)
{
sum += num[i] - '0';
}
//将数字之和sum转换为字符串sumStr
sprintf(sumStr, "%d", sum);
//计算字符串sumStr的长度
len = strlen(sumStr);
//按位输出sumStr对应的汉语拼音
for(i=0;i<len;i++)
{
if(i<len-1)//非末位
printf("%s ", hzStr[(int)sumStr[i]-48]);
else//末位
printf("%s", hzStr[(int)sumStr[i]-48]);
}
return 0;
}
提交结果(分数/满分):
19分/20分
测试点1:答案错误
表明:您的程序未能对评测系统的数据返回正确的结果。原因不详,高手指点,拜谢!
提示:
1. 正整数n的输入问题
Visual C++ 6.0 开发环境下,int 型数据占 4 个字节:
#include <stdio.h>
int main()
{
printf("%d", sizeof(int));
return 0;
}
输出结果:
4
在Visual C++ 6.0 开发环境下,int 型整数可表示的范围:
可通过一下代码加以验证:
#include <stdio.h>
int main()
{
int i,n=1;
for(i=1;i<32;i++)//4 Byte = 32 Bit
{
n *= 2;
}
printf("可表示的最小整数为:%d\n", n);
printf("可表示的最大整数为:%d\n", n-1);
return 0;
}
输出结果:
可表示的最小整数为:-2147483648
可表示的最大整数为:2147483647
因此,在代码中无法通过 int num 读取输入样例 1234567890987654321123456789 如此大的数据,转而通过 char num[100] 读取该值。
2. 计算正整数n各位数字之和问题
关键点:获取字符对应的数字
原理:将每个字符的 ASCII 码值减去字符 '0' 的 ASCII 码值,即可获取其对应的数字
#include <stdio.h>
int main()
{
/*
* 功能:获取字符对应的数字
* i:循环变量
* str[11]:字符数组元素个数>=字符串中字符个数+1
*/
int i;
char str[11] = "0123456789";
for(i=0;str[i]!='\0';i++)
{
// str[i]的ASCII码值减去字符'0'的ASCII码值
printf("%d ", str[i]-'0');
}
return 0;
}
输出结果:
0 1 2 3 4 5 6 7 8 9
3. 按位输出字符串 sumStr 对应的汉语拼音问题
1) 获取字符串长度 len
- 通过函数 strlen() 获取字符数组 sumStr 的长度,便于后续循环处理
- 若使用函数 strlen(),需增加头文件 string.h
2) 按位输出汉语拼音
- 通过 i<len-1 判断是否为字符串 sumStr 的最后一个字符,如果不是,需要在输出对应汉语拼音后补充一个空格符,否则,只需输出对应的汉语拼音即可
- 通过 (int)sumStr[i]-48 获取字符数组 hzStr[10] 中预留的汉语拼音,其中,字符 '0' 的 ASCII 码值为 48,将字符 sumStr[i] 通过强制类型转换 (int) 转换为其对应的 ASCII 码值,并减去 48,即可得到字符数组 hzStr 的索引值,随即输出最终结果