各位数字之和——一个神奇的结论
今天下午翻了翻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
各位数字之和——一个神奇的结论相关推荐
- 23,148,855,308,184,500是一个神奇的数字,还是纯粹的机会?
新闻报道等这一指示上述号码可能出现的编程错误. 一名男子在美国突然出现在当地的加油站购买一包香烟 - 但却发现他的信用卡收费为23,148,855,308,184,500美元. 这是23亿美元(14亿 ...
- 输入一个正整数,求它各位数的数字之和
class Test{ public static void main(String[] args){ int iSum = 0; Scanner scan = new Scanner(System. ...
- Java黑皮书课后题第6章:*6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和。使用下面的方法头:public static int sumDigits(long n)
6.2(求一个整数各位数字之和)编写一个方法,计算一个整数各位数字之和.使用下面的方法头:public static int sumDigits(long n) 题目 题目概述 槽点 代码 运行示例 ...
- 练习:每一分钟产生一个文件,保存本分钟内所有数字之和。
命令nohup gendata 文件 #!/usr/bin/python import time,random, threadingdef gen():fname = '/tmp/log_'+str ...
- c++ pat 乙级 -------1002 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
1002 写出这个数 (20 分) 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 1 ...
- C++ PAT 乙级 ——1002 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
C++ PAT 乙级 --1002 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 题目分析 (1)由于自然数n的范围要求小于10^100,unsigned long long ...
- 拼题a答案c语言计算整数各位数字之和,这是小白刷的基础题,跪求大佬帮忙!!!题目:读入一个自然数n...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 这是小白刷的基础题,跪求大佬帮忙!!! 题目:读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例 ...
- 6.2(求一个整数各位数字之和)
计算一个整数各位数字之和.使用下面的方法头: public static int sumDigits(long n) 例如:sumDigits(234)返回9(2+3+4) 编写程序提示用户输入一个整 ...
- 输入一个4位以内的正整数,输出各位数字之和
问题描述: 输入一个4位以内的正整数,输出各位数字之和. 解题思路: 首先根据题意,我们先求出这个数的各个数位的数字是多少,然后再让它们相加.求各个数位的数字,最常见的方法是求余运算. 代码块: #i ...
最新文章
- 太好玩了,爬虫、部署API、加小程序,一条龙玩转知乎热榜!
- hibernate的一种报错
- react系列知识---11组件间抽象
- decode encode
- python刷题+leetcode(第二部分)
- SQLAlchemy 多条件查询
- 神州数码交换机enable密码清除
- matlab 矩阵求和计算
- canvas文字粒子动画js特效
- 如何解决竞价推广中的恶意点击?
- 微型打印机方案(包含原理图、PCB和BOM表)
- 【LeetCode】括号匹配问题(C语言)| 动图演示,超详细哦~
- 解决yum安装gcc报错:Error: Package: glibc-headers-2.17-317.el7.x86_64
- CS5211AN可兼容CH7511B,是一款EDP到LVDS的转换器
- XP默认输入法快捷键修复
- QGIS二次开发2:添加矢量、栅格图层及图层列表的实现
- docker安装mysql 并挂载目录
- python自动排版公众号_那些排版好看的公众号,都在偷偷使用这些神器
- 啥是认知智能? 认知智能和人工智能到底有啥区别? 你知道吗? 道翰天琼认知智能。
- python元组元素的提取_Python 元组拆包
热门文章
- 关于机器学习的十个实例
- python课堂点名_Python制作课堂点名器,原来还能这么玩!
- c++ list遍历_List集合就这么简单「源码剖析」
- json.loads解码字符串时出错:JSONDecodeError: Invalid \escape: line 1 column 2687 (char 2686)
- 【Java程序设计】运算符与优先级
- Hive排名函数入门
- HTTP协议请求中返回的各个状态码对应的状态信息
- 我的前端面试日记(一)
- 重磅进展,Intel已能够生产量子芯片硅晶圆
- Java 密码扩展无限制权限策略文件[转]