• 优化:一个简单小题


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



  • 相关阅读:
    Python 常用Web框架的比较
    数据库SQL优化大总结之 百万级数据库优化方案
    百万级数据下的mysql深度解析
    微信小程序:bindtap等事件传参
    微信小程序:POST请求data数据请求不到
    动软代码生成器分页存储过程
    微信 获取wx.config 参数 基类
    小程序中的block
    提高商城系统响应速度
    时光煮雨 Unity3D让物体动起来③—UGUI DoTween&Unity Native2D实现
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2390805.html
Copyright © 2020-2023  润新知