今天下午翻了翻XX大学的ACM模版,作为新手,当然挑能看懂的来看,结果就看到了这样一个简单的问题:

题目是这样的,输入一个正整数,将它的各位数字加起来,如果得到的不是一位数,将这个和的各位数字再加起来,如此循环,直到得到一个一位数,最后输出这个个位数。

最简单的方法是使用递归模拟上述求和过程,直到和小于10:

# include <stdio.h>

int dig_sum(int x){int sum = x;if (x < 10) return sum;else    {        sum = 0;while (x > 0)        {            sum += x%10;            x /= 10;        }return dig_sum(sum);    }}

int main(){int x;

while (~scanf("%d", &x))        printf("%d\n", dig_sum(x));

return 0;}

递归方法思路很清晰,但是递归往往很耗时,将递归用循环代替,就变成了下面的:

# include <stdio.h>int main(){int x, sum;

while (~scanf("%d", &x))    {        sum = x;while (sum > 9)        {            sum = 0;while (x > 0)            {                sum += x%10;                x /= 10;            }            x = sum;        }        printf("%d\n", sum);    }

return 0;}

但是,问题来了:这样的问题有没有更好的方法,来更快速地得出结果呢?

题目本身给出了两种方法的代码,第一种是上面的递归,第二种则是下面的:

int dig(int x) {return (x+8)%9+1;}

在这段代码的上面还有一句话:【不太明白。。。】
看到这句话和这个只有一句代码的方法,让我开始思考。

一个十进制的正整数可以表示为:

                       也可以写作:

                  而,

                所以

              所以

       如果令

              ,       那么,

              

到这里,就可以发现,如果 x 按照题目要求的最终得到了 数字 c (0<c<10,c 一定不为 0),那么

            

到这里,得到了标题中“神奇的结论”:x 和 c 模 9 同余!而 c 是1~9中的一个数字,所以不难通过 x%9 求得c:

  如果 c<9,那么 c=x%9;

  如果c=9,那么x%9=0。

为了方便,调整一下,写成一句代码,即:c = (x+8)%9+1;

到这里,终于明白了第二种方法是怎么回事了。

当时在上课,瞥见了这道题,本来想用手机搜搜,结果手机欠费了。。。看来以后遇到问题要多锻炼思考。

转载于:https://www.cnblogs.com/JMDWQ/archive/2012/03/06/2382359.html

各位数字之和——一个神奇的结论相关推荐

  1. 23,148,855,308,184,500是一个神奇的数字,还是纯粹的机会?

    新闻报道等这一指示上述号码可能出现的编程错误. 一名男子在美国突然出现在当地的加油站购买一包香烟 - 但却发现他的信用卡收费为23,148,855,308,184,500美元. 这是23亿美元(14亿 ...

  2. 输入一个正整数,求它各位数的数字之和

    class Test{ public static void main(String[] args){ int iSum = 0; Scanner scan = new Scanner(System. ...

  3. Java黑皮书课后题第6章:*6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和。使用下面的方法头:public static int sumDigits(long n)

    6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和.使用下面的方法头:public static int sumDigits(long n) 题目 题目概述 槽点 代码 运行示例 ...

  4. 练习:每一分钟产生一个文件,保存本分钟内所有数字之和。

    命令nohup gendata  文件 #!/usr/bin/python import time,random, threadingdef gen():fname = '/tmp/log_'+str ...

  5. c++ pat 乙级 -------1002 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

    1002 写出这个数 (20 分) 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 1 ...

  6. C++ PAT 乙级 ——1002 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

    C++ PAT 乙级 --1002 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 题目分析 (1)由于自然数n的范围要求小于10^100,unsigned long long ...

  7. 拼题a答案c语言计算整数各位数字之和,这是小白刷的基础题,跪求大佬帮忙!!!题目:读入一个自然数n...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这是小白刷的基础题,跪求大佬帮忙!!! 题目:读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例 ...

  8. 6.2(求一个整数各位数字之和)

    计算一个整数各位数字之和.使用下面的方法头: public static int sumDigits(long n) 例如:sumDigits(234)返回9(2+3+4) 编写程序提示用户输入一个整 ...

  9. 输入一个4位以内的正整数,输出各位数字之和

    问题描述: 输入一个4位以内的正整数,输出各位数字之和. 解题思路: 首先根据题意,我们先求出这个数的各个数位的数字是多少,然后再让它们相加.求各个数位的数字,最常见的方法是求余运算. 代码块: #i ...

最新文章

  1. 太好玩了,爬虫、部署API、加小程序,一条龙玩转知乎热榜!
  2. hibernate的一种报错
  3. react系列知识---11组件间抽象
  4. decode encode
  5. python刷题+leetcode(第二部分)
  6. SQLAlchemy 多条件查询
  7. 神州数码交换机enable密码清除
  8. matlab 矩阵求和计算
  9. canvas文字粒子动画js特效
  10. 如何解决竞价推广中的恶意点击?
  11. 微型打印机方案(包含原理图、PCB和BOM表)
  12. 【LeetCode】括号匹配问题(C语言)| 动图演示,超详细哦~
  13. 解决yum安装gcc报错:Error: Package: glibc-headers-2.17-317.el7.x86_64
  14. CS5211AN可兼容CH7511B,是一款EDP到LVDS的转换器
  15. XP默认输入法快捷键修复
  16. QGIS二次开发2:添加矢量、栅格图层及图层列表的实现
  17. docker安装mysql 并挂载目录
  18. python自动排版公众号_那些排版好看的公众号,都在偷偷使用这些神器
  19. 啥是认知智能? 认知智能和人工智能到底有啥区别? 你知道吗? 道翰天琼认知智能。
  20. python元组元素的提取_Python 元组拆包

热门文章

  1. 关于机器学习的十个实例
  2. python课堂点名_Python制作课堂点名器,原来还能这么玩!
  3. c++ list遍历_List集合就这么简单「源码剖析」
  4. json.loads解码字符串时出错:JSONDecodeError: Invalid \escape: line 1 column 2687 (char 2686)
  5. 【Java程序设计】运算符与优先级
  6. Hive排名函数入门
  7. HTTP协议请求中返回的各个状态码对应的状态信息
  8. 我的前端面试日记(一)
  9. 重磅进展,Intel已能够生产量子芯片硅晶圆
  10. Java 密码扩展无限制权限策略文件[转]