PAT(乙级)1002

1002. 写出这个数 (20)
读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10^100。

输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:

1234567890987654321123456789

输出样例:

yi san wu


分析这里要求n小于10^100,这个要求使得我们无法使用任何一种基本的数字数据类型来进程存储。因此考虑将数字保存为字符串形式。当我们计算每一位数字之和的时候,就将字符形式的数字转换为整形数字。由于n小于10^100,当每一位数字取9,并且n取10^100时,这个时候数字将会有101(1后面100个0),所以计算得到的各位数字之和为:9×101=909,因此,这个数字使用int保存足以。至于显示为汉语拼音,则使用数组保存0~9这10个拼音即可。将和的三位分解出来,分别去匹配汉语拼音即可。大致思路就是这样。下面上代码。

代码如下

#include<stdio.h>
#include<string.h>

#define size 101

int main(void)
{
	char num[size];
	int number = 0;
	int num1[3];	//保存和分解的三位数字
	int i;
	const char str[10][5] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
	scanf("%s",num);
	for(i = 0; i < strlen(num); i++)
	{
		number += num[i];	//对每一位字符求和
	}
	number = number - (30*i);	//转换成int形式的数字
	//分离每一位
	num1[2] = number % 10;
	num1[1] = (number/10) % 10;
	num1[0] = number / 100;
	
	if (0 == num1[0])	//百位为0
	{
		if (0 == num1[1])	//十位为0
		{
		printf("%s", str[num1[2]]);		//仅仅输出个位
		}
		else 
		printf("%s %s", str[num1[1]], str[num1[2]]);	//输出个位和十位
	}
	else
	{
		printf("%s %s %s", str[num1[0]], str[num1[1]], str[num1[2]]);//三位全输出
	}
	
	return 0;
}
如果有更好办解法请留言,欢迎交流讨论。



posted @ 2017-06-17 10:07  zy010101  阅读(139)  评论(0编辑  收藏  举报