优化:一个简单小题

题目来源于HDOJ1013

把一个正整数的各位数字之和加起来,如果得到一个个位数,就打印它,否则重复对和的各位数字相加,直到得到个位数,打印它;若输入为 0 则结束。

这个题要处理比较大的数(字符串表示)

放弃了在 while((ch=getchar() != EOF)) 下分情况讨论后(详情自己试),容易想到下面的方法:

 1 # include <stdio.h>
2
3 int main()
4 {
5 char ch;
6 int ans;
7
8 while (ch=getchar() != '0')
9 {
10 ans = (ch-'0')%9;
11 while ((ch=getchar()) != '\n')
12 ans += (ch-'0')%9;
13 printf("%d\n", (ans+8)%9+1);
14 }
15
16 return 0;
17 }

上面的代码有一个错误,导致初步测试结果不对:while (ch=getchar != '0') (优先级!)

改正后:

 1 # include <stdio.h>
2
3 int main()
4 {
5 char ch;
6 int ans;
7
8 while ((ch=getchar()) != '0')
9 {
10 ans = (ch-'0')%9;
11 while ((ch=getchar()) != '\n')
12 ans += (ch-'0')%9;
13 printf("%d\n", (ans+8)%9+1);
14 }
15
16 return 0;
17 }

这里还有一种写法(结构不同代表思路不同!):

 1 /* digit root */
2
3 # include <stdio.h>
4
5 char ch;
6 int ans;
7
8 int main()
9 {
10 while (1)
11 {
12 if ((ch=getchar()) == '0') break;
13 ans = 0;
14 while (ch != '\n')
15 {
16 ans += ch-'0';
17 ch=getchar();
18 }
19 printf("%d\n", (ans+8)%9+1);
20 }
21
22 return 0;
23 }

这种结构明显不如前一种思路清晰,但是效率却高于前一种,原因在于去掉了多余且耗时的取模运算!而这道题 int 型足够保存一个字符串表示的大数的各位数字的和。因此有了下面的写法:

 1 /* digit root */
2
3 # include <stdio.h>
4
5 char ch;
6 int ans;
7
8 int main()
9 {
10 while ((ch=getchar()) != '0')
11 {
12 ans = (ch-'0')%9;
13 while ((ch=getchar()) != '\n')
14 ans += ch-'0';
15 printf("%d\n", (ans+8)%9+1);
16 }
17
18 return 0;
19 }



原文地址:https://www.cnblogs.com/JMDWQ/p/2390805.html