zoukankan      html  css  js  c++  java
  • HDOJ 1163 Eddy's digital Roots 九余数定理+简单数论

    我在网上看了一些大牛的题解,有些知识点不是太清楚, 因此再次整理了一下。

    转载链接:

    http://blog.csdn.net/iamskying/article/details/4738838

    http://www.2cto.com/kf/201405/297531.html

    题目描述:
    求n^n次的digital root(数根),例如root(67)=6+7=root(13)=1+3=4;

    一类解法:


    求解思路:
    现在分析一个问题,假设将十位数为a,个位数为b的一个整数表示为ab,则推导得
    ab*ab = (a*10+b)*(a*10+b) = 100*a*a+10*2*a*b+b*b
    根据上式可得:root(ab*ab) = a*a+2*a*b+b*b = (a+b)*(a+b);[公式一] 
    同理也可证得:root(ab*ab*ab) = (a+b)*(a+b)*(a+b);[公式二] 
    可以看出,N个相同整数的乘积总值的树根 = 每一项元素的树根的乘积

    再设另外一个整数cd,且cd!=ab
    ab*cd = (a*10+b)*(c*10+d) = 100*a*c+10*(a*d+b*c)+b*d
    根据上式可得:root(ab*cd) = a*c+a*d+b*c+b*d = (a+b)*(c+d);[公式三] 
    可见,对于两个不相同整数也成立。

    最后将上面证得的结果一般化:
    N个整数的乘积总值的数根 = 每个项元素的数根的乘积 

    提示:本题只需根据[公式三] 即可AC.

    二类解法:

    九余数定理:

    一个数字n的树根 == n%9(n == 0 则为9)

    运用9余数定理 + 公式3    我们就可以很简单的写出程序

    #include <iostream>>
    using namespace std;
    int main()
    {
        int n;
        while( cin >> n, n)
        {
            int sum = 1;
    
            for(int i=1; i<=n; i++)
            {
                sum = (n*sum)%9;
                if(!sum)
                    sum = 9;
            }
            cout << sum << endl;
        }
        return 0;
    }
  • 相关阅读:
    2019年11月28日开发手记
    2019年11月26日开发手记
    2019年11月25日开发手记
    2019年11月24日开发手记
    2019年11月23日开发手记
    R学习
    python学习目录
    自动化测试appium
    python爬虫的进阶用法
    asyncio
  • 原文地址:https://www.cnblogs.com/chenchengxun/p/4105142.html
Copyright © 2011-2022 走看看