PAT 1002 解析


一、题目详情


问题描述:写出这个数

读入一个正整数 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 的索引值,随即输出最终结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值