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(数根,大数,九余数算法)的更多相关文章

  1. 如何证明一个数的数根(digital root)就是它对9的余数?

    数根就是不断地求这个数的各位数之和,直到求到个位数为止.所以数根一定和该数模9同余,但是数根又是大于零小于10的,所以数根模9的余数就是它本身,也就是说该数模9之后余数就是数根. 证明: 假设有一个n ...

  2. UVA-10929-You can say 11(秦九昭算法+同余与模算术)

    原题链接 1000位大数取余: 秦九昭算法+同余与模算术: 1314 = (((1)*10+3)*10+1)*10+4 ( a + b ) % n = ( ( a % n ) + ( b % n ) ...

  3. [hdu5389 Zero Escape]数根的性质,DP

    题意:把n个数(1-9)放到A集合和B集合里面去,使得A集合里面的数的数根为a,B集合里面的数的数根为b,也可以只放在A或B任一个集合里面.求方法总数.比如A={2,4,5},则A的数根为[2+4+5 ...

  4. Digital root(数根)

    关于digital root可以参考维基百科,这里给出基本定义和性质. 一.定义 数字根(Digital Root)就是把一个数的各位数字相加,再将所得数的各位数字相加,直到所得数为一位数字为止.而这 ...

  5. 如何运用同余定理求余数【hdoj 1212 Big Number【大数求余数】】

    Big Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  6. 【分享】改变未来的九大算法[pdf][清晰扫描版]

    [下载地址]http://www.colafile.com/file/1179688 图书信息:中文名: 改变未来的九大算法作者: 约翰·麦考密克译者: 管策图书分类: 软件资源格式: PDF版本: ...

  7. Openjudge-NOI题库-数根

    题目描述 Description 数根可以通过把一个数的各个位上的数字加起来得到.如果得到的数是一位数,那么这个数就是数根.如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来.如此进行下去, ...

  8. 数学#素数判定Miller_Rabin+大数因数分解Pollard_rho算法 POJ 1811&2429

    素数判定Miller_Rabin算法详解: http://blog.csdn.net/maxichu/article/details/45458569 大数因数分解Pollard_rho算法详解: h ...

  9. C++:函数求数根(总算写出来了。。。。)

    [问题描述] 数根问题递归求解:输入n个正整数(输入格式中第一行为整数个数n,后续行为n个整数),输出各个数的数根.数根的定义:对于一个正整数n,我们将它的各个位相加得到一个新的数字,如果这个数字是一 ...

随机推荐

  1. twisted的DelayedCall

    >>> l=[,,,,] >>> del l[:]#只是删除列表的部分元素,列表仍然存在 >>> l [, ] #reactor循环执行的函数de ...

  2. python大法好——python的下载与安装、第一个程序

    吃够了java的苦,所以python好. 打今天起,要走python了. 首先呢,学习python需要python环境.和一款得心应手的集成开发环境. python环境下载:https://mirro ...

  3. ubuntu 上 SSH scp 技巧

    参考:https://deepzz.com/post/how-to-setup-ssh-config.html SSH(Secure Shell)是什么?是一项创建在应用层和传输层基础上的安全协议,为 ...

  4. ThinkCentre进入BIOS,设置intel virtualization technology

    VMware安装提示cpu虚拟化intel virtualization technology ThinkCentre重启长按F1 按enter,开启intel virtualization tech ...

  5. ADOQuery.Parameters: Property Parameters does not exist

    Exception class EReadError with message 'Property Parameters does not exist'. Exception class EReadE ...

  6. Dubbo的优化 --- 开发时使用

    开发时的三个优化: 1.开发者在本地开发的时候启动Dubbo比较麻烦,所以采用直接连接的配置: 2.开发者本地开发时会打断点调试,会超过Dubbo默认的超时时间1s,所以需要全局设置超时时间: 3.开 ...

  7. 批量杀死多个进程 linux kill

    批量杀进程 -| “grep -v grep”是在列出的进程中去除含有关键字“grep”的进程. “cut -c 9-15”是截取输入行的第9个字符到第15个字符,而这正好是进程号PID,也有使用aw ...

  8. Vue router 的使用--初级

    在说 VueRouter 之前,首先要弄明白vueRouter 是干什么的,有什么用 说出来其实很简单,就是一个模板替换的问题,当路由改变的时候,把和路由相关的模板显示出来,就是这么简单.但是,当我们 ...

  9. JSP基本_JSPの構成要素、アクション、ディレクティブ

    1.JSPの構成要素[コア要素] JSP文法のコアとなる要素で.サーブレットソースに変換される. ・宣言: <%! - %> (宣言で指定した変数は.Javaの「フィールド変数」になる.ス ...

  10. The value for the useBean class attribute xxx is invalid

    JSP页面报这个错可能的原因: 1:指定的 Bean 类没找到 2:该类不是 public 的,或者找到的 class 文件是 interface 或抽象类 3:Bean 类中没有 public 的无 ...