zoukankan      html  css  js  c++  java
  • 优化:一个简单小题

    题目来源于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 }



  • 相关阅读:
    树状数组
    #135. 二维树状数组 3:区间修改,区间查询
    poj 2155 (二维树状数组 区间修改 求某点值)
    #133. 二维树状数组 1:单点修改,区间查询
    poj 3468 (区间修改 区间查询)
    树状数组 模板
    1535:【例 1】数列操作
    最通俗全面理解application context中的context是什么意思
    牛客哈理工小乐乐下象棋(深度理解bfs好题)
    牛客哈理工小乐乐打游戏(bfs深度理解好题)
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2390805.html
Copyright © 2011-2022 走看看