PTA乙级1002【写出这个数】思路及代码(C语言/补充cpp及python解法)

题目

PTA乙级1002【写出这个数】思路及代码(C语言/补充cpp及python解法)_第1张图片

基本思路
相信大家能找到这个博客肯定都是有对这道题经过一定思考之后再搜索的,想分享一下一个计算机系大二学渣的基本思路,目前我们还没有学【数据结构】之类的专业课,和其他大佬们比起来我唯一的优势或许就是能够解释的比较通俗易懂啦。其实开博客的,目的也就只是想要记录一下自己解这些题目的时候的思维,方便日后查漏补缺和更新。
以下是我的剖析:

  1. 首先是输入要求,是一个自然数,且不超过101位,有一定基础的同学肯定就已经知道了这个数过大超过了int、long之类的范围,只能通过char来定义了(非常惭愧的表示我好像java学的比c好一点,最近才开始补c可能废话会比较多)
  2. 输入问题解决了之后我们就要开始想下一步,也就是如何把这一串字符单个还原成int类型进行加运算。这里我搜了两个方法。一个是使用指针,btw这个不熟,我们用更简单的方法,直接ASCII码转换,用字符1减去48或者减去‘0’,这样我们就能得到整型的1
  3. 每一位数相加用for循环遍历 这个很简单就不多提
  4. 最后是输出拼音数字的问题,最开始我想用switch来实现,但是那样的话代码就太长了看着非常不清晰,最后我选择了定义一个字符串数组去存储我要输出的那十个数字拼音。(说来好笑,我还是算了一遍确定了无论如何之前求得的数字和都不会多过三位数才放心用if去做输出的。)
    ###其他一些琐碎的东西###
    最开始输出我用了switch嘛,其实非要用也可以的,定义一个函数也是很简单的。但关键是–最开始我完全没有想过用函数,记录一下最开始这个输出的傻代码。
switch(i/100)
	{
		case 0: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;
	}
	if(i/100==0)
	{
		switch(i/10)
		{
			case 0: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;
		}
	}else{switch(i/10)
		{
			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;
		}
		
	}
	if(i/10!=0){
	switch(i%10)
		{
			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;
		}
	}else{
			switch(i%10)
		{
			case 0: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;
		}
	}

对,如果你有耐心看就会发现…我把空格都直接在输出那儿控制住了。因为发现如果是个两位数的话我还用i/100求整也就算了,但是那样就会导致比如23输出ling er san,这就很尴尬了,答案必然报错。所以就有了之前这么一大串很繁琐的if来区分最后和的位数。还好最后想到了其他方法,数组真好用!(我的代码真的很丑了那个时候还没看《代码整洁之道》,呜呜呜弟弟代码)

最终代码

#include
int main() {
	char n[100];	//定义一个数组,开空间方便大数输入
	int j, i = 0;
	scanf("%s", &n);	//字符串输入要用%s
	    
    /*数组声明之后开的空间如果没有被输入的数填满的话会默认为'\0',设置成这样就不会做无谓的循环啦*/
	for( ;n[i] != '\0'; i++) {
		j += (n[i]-'0');   //类型转换
	}
	/*printf("%d",j);这是我写的时候做的一个小测试,输出一下判断第一部分的计算有没有错,
	我直接copy题目里样例试的*/
	
	char pin[10][5] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
	if(j > 99) {
		printf("%s ", pin[j/100]);
		printf("%s ", pin[j%100/10]);
		printf("%s", pin[j%100%10]);
	}else if(j > 9) {
		printf("%s ", pin[j/10]);
		printf("%s", pin[j%10]);
	}else{
		printf("%s", pin[j]);
	}
	return 0;
}

一些我知道的不足之处
就是最后定义拼音字符串的时候我完全不知道为什么要定义成二维的
(习惯了Java直接把字符串输入进去…)
(好啦我知道这些都不是我懒惰的借口)
粗略搜了一下改成这样的—char[10][10],之后有机会把书看完我会回来改的。
有时间二刷的话我会用Java和C++还有c#尝试一遍的。
2020更新一下
知道为啥用二维数组了,早就知道了…忘记这里还有个坑没有填了。C因为没有字符串类型,所以每次需要使用到字符串的情况就需要char数组,但大家都知道char是单个字符,而我们如果是一个字符串就相当于一个一维的字符数组,此时字符数组的长度就是字符串的长度,而多个字符串就意味着多了一个“一维数组”但这个数组里保存的是字符串,所以集合成了字符二维数组。该二维数组行定义的时候就表示字符串的个数(适当加大点容量,防止有可能发生的段错误),列是字符串的长度。

2019.7.27
补充C++解法
to_string()是C11特性,如果需要在Dev里编译需要在tool编译器选项里加入【-std=c++11]

#include 
#include 
using namespace std;
int main() {
	int sum = 0;
	string s;
	cin >> s;
	string piny[] = { "ling", "yi", "er", "san", "si", "wu", "liu","qi","ba","jiu"};

	for (int i = 0; i < s.size(); i++)
		sum += stoi(s.substr(i, 1));
	string num = to_string(sum);
	for (int i = 0; i < num.size(); i++) {
		if(i != 0) cout << " ";
		cout << piny[num[i] - '0'];
	}
	return 0;
}

PTA乙级1002【写出这个数】思路及代码(C语言/补充cpp及python解法)_第2张图片
补充Python解法

n = input()
cnt = 0
for i in n:
	cnt = cnt + int(i)
temp = ['ling', 'yi', 'er', 'san', 'si', 'wu', 'liu', 'qi', 'ba', 'jiu']
res = str(cnt)
for i in res[:-1]:
	print(temp[int(i)], end = ' ')
print(temp[int(res[-1])])

PTA乙级1002【写出这个数】思路及代码(C语言/补充cpp及python解法)_第3张图片

你可能感兴趣的:(PAT)