ACM之数论数字根

Posted 码路编

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM之数论数字根相关的知识,希望对你有一定的参考价值。

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

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
























以上是关于ACM之数论数字根的主要内容,如果未能解决你的问题,请参考以下文章

AcWing3449. 数字根 (数论思维模拟)

AcWing3449. 数字根 (数论思维模拟)

数论之 HDU 2866

数论 之 3012 Fibnacci Numbers

ACM数论之旅4---扩展欧几里德算法(欧几里德(???)?是谁?)

ACM数论之旅9---中国剩余定理(壮哉我大中华╰(*°▽°*)╯)