【PAT】B1002 写出这个数(C++)

题目

1002 写出这个数 (20 分)

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

输入格式:

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

输出格式:

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

输入样例:

1234567890987654321123456789

输出样例:

yi san wu

 

思路

本题可分为三步思考解决方案:

  1. 将读入的数字串识别为多个一位数字;
  2. 将各个数字加起来得到所求和;
  3. 将和的各位数字分离,分别转换为拼音输出。

本题解决思路:

  1. 用字符数组(n[100])来存储输入的数字串,如题意,这里保证n小于100位;
  2. 此时 n[i] 中存放的是字符 '1' '2' '3',所以需要将其转换为数字 1 2 3,以便求和(利用ASCII码差48求得);
  3. 循环累加求和,因为字符串末尾默认有 ‘\0’,故使用 '\0' 做结束标识;
  4. 利用求余(%)将和的各位数字记录进数组(su[4])中;
  5. 对于每一位数字,调用printNum函数,输出拼音。

 

代码

#include<cstdio>
#include<iostream>
using namespace std;
void printNum(int n);

int main(){
	int sum=0,i,k;
	int su[4]={0};
	char n[100]={0}; 
	//printf("Please input a num:\n");
	scanf("%s",n);
	for(i=0;n[i]!='\0';i++){
		sum+=n[i]-48;//'0' ASCII: 48
	}//get sum
	
	//store reverseSum in su[4] ,maxSum is 900
	//such as sum=345 su[4]={5,4,3,0}
	i=0;
	while(sum){
		k=sum%10;
		su[i++]=k;//i is how many digits
		sum/=10;
	}
	
	//print output
	//printf("this is answer:\n");
	while(i--){
		printNum(su[i]);//调用printNum 
		if(i!=0)
			printf(" ");
	}
	return 0;
}
void printNum(int n){
	switch(n){
		case 0: printf("ling");break;
		case 1: printf("yi");break;
		case 2: printf("er");break;
		case 3: printf("san");break;
		case 4: printf("si");break;
		case 5: printf("wu");break;
		case 6: printf("liu");break;
		case 7: printf("qi");break;
		case 8: printf("ba");break;
		case 9: printf("jiu");break;
	}
}

 

易错点整理

  1. 其他函数写在主函数后面时,记得在前面声明函数。
  2. 注意存储的是字符还是数字,如果不进行转换为数字,则将以字符的ASCII码进行计算。

 

扩展:倒序输出整数

将一个int型整数倒序输出,即输入“1234”,输出“4321”。

方法一:非递归方法

【思路】可以用 “a%10” 的办法得到该整数的个位,用初始值为0的变量s记录倒序的数,如图1所示。

图1 运算过程表

【代码】利用循环得到倒序:

//non-recursion
int reverseInt(int a){
	int s=0;
	while(a){
		s=s*10 + a%10;
		a/=10;
	}
	return s;
}

方法二:递归方法

【思路】递归应有 “递归体” 和 “递归出口”:

  • 当a小于10时,执行“递归出口”:当待处理数(a)只剩一位时,所求倒序数字即s*10+a;
  • 当a大于10时,执行“递归体”:一般地,假设此时传入的参数为:当前高位s=43,待处理数a=12(即a的末位 ‘3’ ‘4’ 已经转换到s中),则调用reverse函数后,应修改:当前的高位 = 之前的高位 * 10+ 之前的低位,如图2所示。递归调用此函数时,当前高位变成s=432,待处理数变成a=1。
图2 递归体执行过程

 

【代码】

//recursion
int reverse(int a,int s){
	if(a/10==0)
		return s*10+a;
	else
		return reverse(a/10,s*10+a%10);
}

方法三:投机取巧方法

【思路】如果仅需输出此数,则可将各数位按单独位数输出,即实际输出 '3''2''1',而不是 '321' 。

【代码】

//another method
void reverseString(int a){
	printf("This is a reverse string: ");
	while(a){
		printf("%d",a%10);//输出此时的个位
		a/=10;//舍去个位
	}
	printf("\n");
}

 

- END -

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值