PAT乙级 1002

题目详情

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

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

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

输入样例:
1234567890987654321123456789
输出样例:
yi san wu

错漏

开始时未给字符串预留 ‘\0’ 导致溢出
后发现输入赋值判断条件似乎仍有问题
报错代码部分如下:

char a[101];
for (i = 0; cin.get() != '\n'; i++)
{
	cin >> a;  
}
int div,ten,hun,tho;
for(i=0;i<=100&&a[i]!=0;i++)
{
	sum+=a[i]-48;
}

猜测原因为cin输入与判断条件cin.get矛盾(不确定)
换用getchar进行判断赋值

代码与优化

弟弟思路(我的):

#include<iostream>
using namespace std;
int main()
{
	int i = 0, sum = 0;
	char a[101];
	 while((n=getchar())!='\n')		//算出总和
    {
        sum+=n-48;						         
    }				
	int div, ten, hun, tho;			//笨办法,将总和各位数分别表示
	div = sum % 10;					//个位
	sum /= 10;					
	ten = sum % 10;					//十位.....
	sum /= 10;
	hun = sum % 10;
	sum /= 10;
	tho = sum % 10;
	switch (tho)					//switch输出对应拼音
	{
	case 0:break;					//千位数为0则只有三位,不输出
	case 1:cout << "yi "; break;
	case 2:cout << "er "; break;
	case 3:cout << "san "; break;
	case 4:cout << "si "; break;
	case 5:cout << "wu "; break;
	case 6:cout << "liu "; break;
	case 7:cout << "qi "; break;
	case 8:cout << "ba "; break;
	case 9:cout << "jiu "; break;
	}
	switch (hun)
	{
	case 0:
		if (tho == 0)   //千位百位都为0,则只有两位,不输出						
			tho = 0; //凑个整语句					
		else   //千位补位0则百位有意义,输出
			cout << "ling ";  
		break;								//
	case 1:cout << "yi "; break;
	case 2:cout << "er "; break;
	case 3:cout << "san "; break;
	case 4:cout << "si "; break;
	case 5:cout << "wu "; break;
	case 6:cout << "liu "; break;
	case 7:cout << "qi "; break;
	case 8:cout << "ba "; break;
	case 9:cout << "jiu "; break;
	}
	switch (ten)
	{
	case 0:
		if (tho == 0 && hun == 0)		//同上
			tho = 0;
		else
			cout << "ling ";
		break;
	case 1:cout << "yi "; break;
	case 2:cout << "er "; break;
	case 3:cout << "san "; break;
	case 4:cout << "si "; break;
	case 5:cout << "wu "; break;
	case 6:cout << "liu "; break;
	case 7:cout << "qi "; break;
	case 8:cout << "ba "; break;
	case 9:cout << "jiu "; break;
	}
	switch (div)
	{
	case 0:						//n为自然数,不可能sum=0
		cout << "ling ";
		break;
	case 1:cout << "yi "; break;
	case 2:cout << "er "; break;
	case 3:cout << "san "; break;
	case 4:cout << "si "; break;
	case 5:cout << "wu "; break;
	case 6:cout << "liu "; break;
	case 7:cout << "qi "; break;
	case 8:cout << "ba "; break;
	case 9:cout << "jiu "; break;
	}
	return 0;
}

优化后(大佬思路):
使用字符串或二维数组表示拼音
利用c语言中printf特性,进行对应输出
(看来printf的输出相较cout确实更好用)

#include<stdio.h>
int main()
{
	char py[][9] = { "ling","yi","er","san","si","wu","liu","qi","ba","jiu" };
	char n;
	int sum = 0;
	while ((n = getchar()) != '\n')
	{
		sum += n - 48;
	}
	int a[100], t = 0;				//int数组a不需留一个空,a[100]即可
	while (sum)
	{
		a[t] = sum % 10;
		sum /= 10;
		t++;
	}

	for (; t != 0; t--)
	{
		printf("%s", py[a[t - 1]]);	//将二维字符数组按顺序当作一维表示输出
		if (t != 1)printf(" ");       //t=0时是最后一位,不需输出“ ”
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值