<取余取不同位置数>数的变换

一、题目

 数的变换

【问题描述】

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

【输入形式】

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 不大于 2,147,483,647。

【输出形式】

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

【样例输入】

2147483647

【样例输出】

si liu

二、思路讲解

题目要求是计算正整数n的各位数字之和,就要分别取出每个位置上的数字。


取出各位数字

以n=96853为例,要想先取出个位上的数字3,就直接对进行取余10的操作,取出个位

 接下来是取出十位上的5,首先将个位的3去掉(除以十),然后是进行取余10的操作,取出在十位上的数字

 接下来是取出百位上的8,先是将已经取出的5删掉,同样是用到对n除以10的方法,然后对n取余10,取出数字8

 接下来取出剩下数字的方法都是一样的,先去掉n的最后一位数字,再用取余的方法取出目标数字,直到n变为0;

(通过上面的方法可以总结出这样一条小知识,对数字%10可以得到这个数字的最后一位数字,对数字/10可以消除数字的最后一位数字。)

题目要求得到各位数字之和,那么只需要创建一个整型变量sum,其初始值为零,在每一次n取出一位数字的时候,把取出的数字加进sum中去即可(sum+)。

 题目最后让输出的是用汉语拼音写出和的每一位数字,那么就用上面用到的相同的方法,分别提取出和的各位数字,再将他们变成拼音输出

接下来也就到了本题的难点,将单个数字转换成拼音输出

 单个数字转换成拼音输出

因为要提前储存0~9数字对应的拼音,拼音是字符组成的,c语音中的数组没有能让其元素储存的是字符串,只能用char类型的数组来储存拼音字符串

如图这一个一维数组,用来代表0的拼音。如果想让0-9的拼音都放在一个数组里面,就将这个一维数组扩展成二维数组,如图

 注意:二维数组pinyin[10][5],每一行代表每个数字的拼音,它的列代表拼音的长度,第四列图上是空着的,并不是没用,那是用来存储‘\0’字符串的结束标志。

接下来是舒服的输出环节

 题目这里保证 n 不大于 2,147,483,647,也就是间接告诉我们sum最多就是两位数,

通过对上面的二维数组进行观察,我们可以投机取巧,

通过观察发现,第一行的位置下标是0,这一行的拼音刚好就是拼音“ling”

 第二行位置下标是一,拼音也刚好是一的拼音”yi“

第三行位置下标是二,拼音也刚好是二的拼音”er“

......

也就是说,我们要是想我们如果想输出数字0的拼音,就直接将该数字作为二维数组的下标,返回数组这个位置上的值pinyin[0],就是该输出数字的汉语拼音

三、代码展示

#include<stdio.h>
#include<stdlib.h>
int main(){
	int n;
	int sum=0;
	scanf("%d",&n);
	while(n!=0){
		sum+=n%10;
		n/=10;
	}
	int n2=sum%10;
	int n1=sum/10%10;
	char piny[10][6]={
		"ling",
		"yi",
		"er",
		"san",
		"si",
		"wu",
		"liu",
		"qi",
		"ba",
		"jiu"
	};
	if(n1!=0){//如果sum是两位数
	printf("%s %s",piny[n1],piny[n2]);
	}
	else printf("%s",piny[n2]);//如果sum是一位数的情况
	return 0;
	
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值