P1002 写出这个数(Basic Level)

转跳点:🐏

  作为第二题,拿字符串刚刚好。不过这道题我卡了一下,还是太弱了。看题

  题目意思很明确,就是想让你把输入的每一位数字加起来,再输出各个位的拼音。这道题一看int型就存不下long long也别想 10100 就别想那么多了,肯定是字符数组。唉不过丢连丢到家了我去算了一下 10100 是多少后直接断言说数组装不下。当时脑子一抽就觉得 10100 就该有 10100 位,丢脸啊。这玩意数组最大开个110就行了,真的是瞎了。这道题第一个难点讲完了,至于求和,很简单,让str[i]-'0'即可得到整数,外面套个循环就求出来了。另外一个难点就是求每一位的循环的停止条件应该是

if (0 != sum / 10 || 0 != sum % 10) //缺一不可

  || 后面是用来预防相加之后只有一位数, 前面是用来预防sum是10 的倍数。

2020-02-15 10:22:21更新:回来看才发现我当初停止条件好蠢,其实每一次都对sum/10,所以最后sum一定会等于0,所以,停止条件应该如此

if (!sum) 或者 if (sum > 0)

最后说说输出,反正我是switch case,也可以用 if……else……,随意。目前我是想不到更好的办法了。现在我想出来了所以划掉(其实当时是我懒不想写那种方法)可以用字符串呦,将各个位取出存入字符串种再在将数组套另一个字符串数组中做索引,就像这样:

                 num[str[i]-'0'];//num是“ling”,“yi”……的字符串数组 

 

最后当然是愉快的贴上 AC 代码啦(上一次的,全新版本在下面)

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main()
 5 {
 6     char str[110];
 7     while (~scanf("%s", str))
 8     {
 9         int sum = 0;
10         for (int i = 0; str[i] != '\0'; i++)
11         {
12             sum += str[i] - '0';
13         }
14         int i = 0;
15         while (0 != sum % 10 || 0 != sum / 10)
16         {
17             str[i] = sum % 10 + '0';
18             i++;
19             sum /= 10;
20         }
21         str[i] = '\0';
22         int len = strlen(str);
23         for (i = len - 1; i >= 0; i--)
24         {
25             switch (str[i] - '0')
26             {
27             case 0:
28                 printf("ling");
29                 break;
30             case 1:
31                 printf("yi");
32                 break;
33             case 2:
34                 printf("er");
35                 break;
36             case 3:
37                 printf("san");
38                 break;
39             case 4:
40                 printf("si");
41                 break;
42             case 5:
43                 printf("wu");
44                 break;
45             case 6:
46                 printf("liu");
47                 break;
48             case 7:
49                 printf("qi");
50                 break;
51             case 8:
52                 printf("ba");
53                 break;
54             case 9:
55                 printf("jiu");
56                 break;
57             }
58             if (i != 0)
59             {
60                 printf(" ");
61             }
62         }
63         putchar('\n');
64         getchar();
65     }
66     return 0;
67 }
旧版

  哦,最后差点忘了,因为评测机可能是多组输入所以记得用getchar()吞回车哦!

 

2020-01-06

  为了那位机智而又迷人的小姐姐,我来更新一下博客,下面的代码,是新的解法,其实就是换成了字符串而已,压缩了一下代码

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 //数字的字符数组
 5 const char num[10][6] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
 6 
 7 int main()
 8 {
 9 
10     char str[110];
11     scanf("%s", str);
12     
13     //求和
14     int sum = 0;
15     for (int i = 0; str[i] != '\0'; i++)
16     {
17         sum += str[i] - '0';
18     }
19 
20     //取各个位数上的数
21     int i = 0;
22     while (sum != 0)
23     {
24         str[i++] = sum % 10 + '0';
25         sum /= 10;
26     }
27     str[i] = '\0';//隔断字符串
28 
29     //输出
30     int len = strlen(str);
31     for (i = len - 1; i >= 0; i--)
32     {
33         i == 0 ? printf("%s\n", num[str[i] - '0']) : printf("%s ", num[str[i] - '0']);
34     }
35     return 0;
36 }
这是一个全新的版本

  所以,要加油呦,小姐姐!

算法不易,诸君共勉

posted @ 2019-10-01 20:30  秦_殇  阅读(229)  评论(0编辑  收藏  举报