hdoj1013(数根,大数,九余数算法)
Digital Roots
Problem Description
The digital root of a positive integer is found by summing the digits of the integer. If the resulting value is a single digit then that digit is the digital root. If the resulting value contains two or more digits, those digits are summed and the process is repeated. This is continued as long as necessary to obtain a single digit.
For example, consider the positive integer 24. Adding the 2 and the 4 yields a value of 6. Since 6 is a single digit, 6 is the digital root of 24. Now consider the positive integer 39. Adding the 3 and the 9 yields 12. Since 12 is not a single digit, the process must be repeated. Adding the 1 and the 2 yeilds 3, a single digit and also the digital root of 39.
Input
The input file will contain a list of positive integers, one per line. The end of the input will be indicated by an integer value of zero.
Output
For each integer in the input, output its digital root on a separate line of the output.
Sample Input
24 39 0
Sample Output
6 3
第一次做直接用递归,然后wa。看了discuss后才明白。
两点:1.大数;2.九余数算法。
题目并没有说输入的数的大小,所以用int是不行的,可以用char数组来存数据。然后是九余数算法,先给出AC代码,后面介绍九余数算法:
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char s[10000]; //考虑到大数,使用char数组
while(cin>>s&&s[0]!='0'){
int sum=0;
for(int i=0;i<strlen(s);i++)
sum+=s[i]-'0';
cout<<(sum-1)%9+1<<endl;
}
return 0;
}
九余数算法:
我们都知道对于十进制数,只要这个数能除尽3/9则他个位数字之和也能除尽3/9,以前只知道用没有证明过,下面来简单证明一下。
对于十进制数,举个简单的例子,这个数是abcd,他表示的大小就是 x=1000*a+100*b+10*c+d ,
我们对他进行转化 x=999*a+99*b+9*c+(a+b+c+d)
因为9一定能除尽3和9,所以对于x,只要(a+b+c+d)能除尽3和9,则x也能除尽3和9.
上面只是举了一个数,下面来针对任意进制P(P>2)证明,
假设一个n位的P进制数x是 anan-1an-2.......a3a2a1
则x=an*Pn-1+an-1*Pn-2+an-2*Pn-3+......+a3*P2+a2*P1+a1*P0.
类似于上面的操作,我们凑出来一个各位数之和,
x=(an*(Pn-1-1)+an-1*(Pn-2-1)+an-2*(Pn-3-1)+......+a3*(P2-1)+a2*(P1-1))+(a1+a2+a3+......an-2+an-1+an)
观察发现Pn-1=(Pn-1-1)*P+(P1-1) (n>=2) 展开后发现所有的项都含有(P-1),也就是说Pn-1一定能除尽(P-1),所以也能除尽P-1的因子,所以对于任意的(P-1)得因子q,只要各位数之和(a1+a2+......+an)能除尽q,那么x也能除尽q。
九余数算法两种用途:第一,验证:两个或多个数的加减乘除得到的结果的数根等于对应各个数的数根的加减乘除的结果的树根;第二,一个数的数根(特殊情况,如果数根为9,按0算)等于该数对9取余的结果。
其实九余数还是很有用的,拿一道题(从网上找来的)来说吧:
1234567891011121314……201020112012除以9,商的个位数字是多少?
【解析】根据“弃9法”原理,判断这个多位数除以9 的余数可以直接看数字和除以9的余数,这个多位数是由1,2,3,4,5,6,……,2011,2012这些连续的自然数构成,而对于每一个自然数来说,除以9都是同余于它的各个位上数字之和,于是有:
1+2+3+….+2011+2012≡2025078≡2+2+2+5+0+7+8(mod 9),所得余数为6,这就说明123456….20112006是9的倍数,那么商的个位数字就是4。(4×9=36)
hdoj1013(数根,大数,九余数算法)的更多相关文章
- 如何证明一个数的数根(digital root)就是它对9的余数?
数根就是不断地求这个数的各位数之和,直到求到个位数为止.所以数根一定和该数模9同余,但是数根又是大于零小于10的,所以数根模9的余数就是它本身,也就是说该数模9之后余数就是数根. 证明: 假设有一个n ...
- UVA-10929-You can say 11(秦九昭算法+同余与模算术)
原题链接 1000位大数取余: 秦九昭算法+同余与模算术: 1314 = (((1)*10+3)*10+1)*10+4 ( a + b ) % n = ( ( a % n ) + ( b % n ) ...
- [hdu5389 Zero Escape]数根的性质,DP
题意:把n个数(1-9)放到A集合和B集合里面去,使得A集合里面的数的数根为a,B集合里面的数的数根为b,也可以只放在A或B任一个集合里面.求方法总数.比如A={2,4,5},则A的数根为[2+4+5 ...
- Digital root(数根)
关于digital root可以参考维基百科,这里给出基本定义和性质. 一.定义 数字根(Digital Root)就是把一个数的各位数字相加,再将所得数的各位数字相加,直到所得数为一位数字为止.而这 ...
- 如何运用同余定理求余数【hdoj 1212 Big Number【大数求余数】】
Big Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- 【分享】改变未来的九大算法[pdf][清晰扫描版]
[下载地址]http://www.colafile.com/file/1179688 图书信息:中文名: 改变未来的九大算法作者: 约翰·麦考密克译者: 管策图书分类: 软件资源格式: PDF版本: ...
- Openjudge-NOI题库-数根
题目描述 Description 数根可以通过把一个数的各个位上的数字加起来得到.如果得到的数是一位数,那么这个数就是数根.如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来.如此进行下去, ...
- 数学#素数判定Miller_Rabin+大数因数分解Pollard_rho算法 POJ 1811&2429
素数判定Miller_Rabin算法详解: http://blog.csdn.net/maxichu/article/details/45458569 大数因数分解Pollard_rho算法详解: h ...
- C++:函数求数根(总算写出来了。。。。)
[问题描述] 数根问题递归求解:输入n个正整数(输入格式中第一行为整数个数n,后续行为n个整数),输出各个数的数根.数根的定义:对于一个正整数n,我们将它的各个位相加得到一个新的数字,如果这个数字是一 ...
随机推荐
- zip和zipPartitions
zip函数用于将两个RDD组合成Key/Value形式的RDD,这里默认两个RDD的partition数量以及元素数量都相同,否则会抛出异常. scala> val aa=sc.makeRDD( ...
- 机器学习进阶-图像形态学操作-腐蚀操作 1.cv2.erode(进行腐蚀操作)
1.cv2.erode(src, kernel, iteration) 参数说明:src表示的是输入图片,kernel表示的是方框的大小,iteration表示迭代的次数 腐蚀操作原理:存在一个ker ...
- matplot读取文本文件画图
# -*- coding: utf-8 -*- """ Created on Fri Sep 7 18:38:35 2018 @author: manuel " ...
- 03_JSX理解和使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- R-CNN 学习记录
CNN是一个运用卷积神经网络进行图片分类的开山之作.RCNN是第一个把图片分类和目标检测连接起来的作品. RCNN主要解决的问题是: 1.怎样用深度神经网络进行目标定位:2.怎样用小批量的标注数据来训 ...
- Zeosdbo-Query使用
with DataModule1.Zlxz_zy_Query do begin Close; SQL.Clear; SQL.Add( ...
- Oracle问题小结
1.win8.1安装Oracle11g后,重启电脑,出现黑屏. 解决办法:安全模式下,找到以oracle开头的全部服务,所有“自动”或者“自动(延迟启动)”的都设置为“手动”,只需要开启OracleO ...
- data型怎么转换格式
data型如何转换格式01-1月 -03 如何转成 YYYY-MM-DD 的格式 本来就是date了 ------解决方案--------------------to_char ...
- Mac下如何安装WebStorm + 破解
1.官网下载 下载地址 选择好系统版本以后,点击DOWNLOAD 2.安装 双击下载好的安装包.将WebStromt拖入application文件夹,然后在Launchp ...
- JQuery+Ajax实现唯一性验证、正则
//唯一性验证 public function Only(){ //实例化模型层 $model = new User(); $res = $model->Only(); echo $res; } ...