ACM之数论数字根

先来看一道杭电的数字根问题
ACM之数论数字根_第1张图片
此题的大大意是输入一个数,如果它不是一位的数字的话,那么我们就将它的每一位都相加,相加后如果还是两位或者更多的话那么我们继续取出它的每一位数字进行相加,知道等到单个数字为止。
初次看到这道题,并没有看n的取值范围,便直接写了个int类型的,不一会就写出来了,测试,通过。然而呢,当我提交的时候才知道,正因为没有给出n的取值范围,所以你需要考虑大数的问题!
当然数论的题,常常包含着我们或许不知道的定理啊,什么的,毕竟像ACM之类的题,我们通常不能直接按照题目的叙述直接做,比如求各数字,相加等等·····当然有些题还是可以在保证时间和空间都不超的情况下,这样试试!此题也不例外,
先是两种按照题意做的ACM之数论数字根_第2张图片
这篇代码是我按照题意建立字符数组写的,但最坑的是题意的n只写了一个more,就是这个more让我程序卡了一天,我最初定义的字符数组长度为1000,刚好处在这个边界值上,1001都可以过,注意,注意,注意!

这种算法采用了递归的思想和第一种方法大同小异吧!
接下来便是才用9余数的方法去求数字根,先贴代码
下一道题将会介绍9余数:

下面这道题,则既用了数字根,也用了快速幂
ACM之数论数字根_第3张图片
对于这道题,先介绍两个重要的东西
1.九余数定理:如果把一个大数的各位数字相加得到一个和,再把这个和的各位数字相加又得一个和,再继续作数字和,直到最后的数字和是个位数为止,
这最后的数称为最初那个数的“数字根”。这个数字根等于原数除以9的余数,因此这个计算过程常常称为“合九法”
2.快速幂:(同余定理)如果两个乘积除以m的余数等于这两个数分别除以m的余数积。
例如:7%3=1 5%3=2 7*5/3=2=1*2
求快速幂的代码如下:
ACM之数论数字根_第4张图片
灰常有用的!
最后附上此题代码:
ACM之数论数字根_第5张图片
——- 2016.3.29晚于电子楼311

你可能感兴趣的:(ACM)