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,我们将它的各个位相加得到一个新的数字,如果这个数字是一 ...
随机推荐
- Linux 指令(一)文件/目录操作
1. 创建目录 mkdir 格式 mkdir [OPTION]... DIRECTORY... 选项 -p 递归创建 -v 创建时提示 例: root@ubuntu:/home/eko/x# mkdi ...
- vue-router 动态导航 router-link :to属性
经常碰到这类需求,从后台获取数据后再前程连接,参数id动态获取 <el-row v-for="item in Travels"> <el-col :span=&q ...
- 配置tomcat的开发环境
第一步:鼠标右键计算机->属性->高级系统设置,进去之后,点击环境变量,如下图所示: 第二步:开始配置tomcat的环境变量,新建系统变量名CATALINA_BASE,值tomcat的安装 ...
- dubbo 搭建以及使用笔记
公司使用dubbo做为rpc框架,有必要简单学习一番(自己搭建),自己做下学习记录. dubbo认识: dubbo是分布式SOA(面向服务)架构的rpc服务治理框架.可兼容各种rpc,强势的地方主要还 ...
- CC攻击与DDOS攻击区别
二者的攻击方式主要分为三种:直接攻击.代理攻击.僵尸网络攻击 CC攻击是DDOS(分布式拒绝服务)的一种,相比其它的DDOS攻击CC似乎更有技术含量一些.这种攻击你见不到虚假IP,见不到特别大的异常流 ...
- RH_KABI_RESERVE的使用
struct mm_struct { .......... #if defined(__GENKSYMS__) || !defined(CONFIG_SPAPR_TCE_IOMMU) /* We're ...
- fopen的type的值的意思
┌──┬────┬───────┬────────┐ │type│读写性 │文本/2进制文件│建新/打开旧文件 │ ├──┼────┼───────┼────────┤ ...
- [PHP]快速实现:将二维数组转为一维数组
如何将下面的二维数组转为一维数组. $msg = array( array( 'id'=>'45', 'name'=>'jack' ), array( 'id'=>'34', 'na ...
- webkit内核自定义隐藏滚动条
1,在主页面可以拿到iframe,也可以为iframe注册onload等事件.document.getElementById('iframeId').onload 2,在主页面操作其中的iframe的 ...
- Android 性能优化 SparseArray【转载】
原文地址:Android学习笔记之性能优化SparseArray 学习内容: 1.Android中SparseArray的使用.. 昨天研究完横向二级菜单,发现其中使用了SparseArray去替 ...