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