HDU——Eddy's digital Roots

这道题目就是个位数相加,然后再一次相加,直到只剩下一位数。

考虑打表:

10  = 1

11 = 2

12 = 3 

13 = 4

14 = 5

15 = 6

16 = 7

17 = 8

18 = 9 

19 = 10 = 1

20 = 2

21 = 3

……

99   = 18 = 9

100 = 1

从规律可以看出,其实是有为9的循环节,也就是直接mod 9 就可以得到结论。如果mod 9 得到0 的话,应该打印出9.

证明:

如果是一位数A,答案就是A,也可以写成A mod 9;( 若A mod 9 == 0,打印出9)

如果是两位数(A * 10 + B ) mod 9  = (A mod 9 ) * ( 10 mod 9 ) + (B mod 9) mod 9;

拓展:

我记得有一个判断能否被3整除的方法是将所有位数相加起来,能被3整除的话就能,不能就不能,其实是同样的道理的。

也就是说每一个值都有一个“贡献”,因为A *10 = (A % 3) * (10 % 3) = A % 3,所以说A的贡献是不论它在哪个位置,都是A %3;

如果是N^N的话,属于N个N相乘,那么可以求出每一个N的贡献:

(N * N * N * N * N  * N * N ) = (N % 9) * ( N % 9)……用快速幂求得。


#include <cstdio>
#include <iostream>
using namespace std;

typedef long long _int64;

//计算幂取模,a^b mod n,O(logb)
int modular_exponent(int a,int b,int n)
{
    int ret=1;
    for(;b;b>>=1,a=(int)((_int64)a)*a%n)
        if(b&1) ret=(int)((_int64)ret)*a%n;
    return ret;
}


int main() {
    int n;
    while(scanf("%d", &n), n) {
        int tmp = modular_exponent(n, n, 9);
        if(tmp == 0) printf("9\n");
        else printf("%d\n", tmp);
    }
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值