zoukankan      html  css  js  c++  java
  • Project Euler 80:Square root digital expansion 平方根数字展开

    Square root digital expansion

    It is well known that if the square root of a natural number is not an integer, then it is irrational. The decimal expansion of such square roots is infinite without any repeating pattern at all.

    The square root of two is 1.41421356237309504880…, and the digital sum of the first one hundred decimal digits is 475.

    For the first one hundred natural numbers, find the total of the digital sums of the first one hundred decimal digits for all the irrational square roots.


    平方根数字展开

    众所周知,如果一个自然数的平方根不是整数,那么就一定是无理数。这样的平方根的小数部分是无限不循环的。

    2的平方根为1.41421356237309504880…,它的小数点后一百位数字的和是475。

    对于前一百个自然数,求所有无理数平方根小数点后一百位数字的总和。

    解题

    问题:如何求无理数的一百位小数?这真是无理取闹

    参考博客

    在上面给的博客中给了一个很好的方法

    对于 数 n 我们需要去根号n,如下很有意思的规律

    def Suqareroot(n,digits):
        limit = 10**(digits+ 1)
        a = 5*n 
        b = 5 
        while b < limit:
            if a>= b:
                a -= b 
                b +=10
            else:
                a *= 100 
                b = int(b/10) * 100 + 5
        return int(b/100)

    说明下:

    1.题目让求的是小数点前100位的值,包括整数位

    2.上面算法只有最后b/100 是根号n的近似解,这里是去小数点的,只有为什么不是b表示不理解

    JAVA 

    package Level3;
    
    import java.math.BigInteger;
    import java.util.ArrayList;
    
    public class PE080{
        
        void run(){
            int j = 1;
            int res = 0;
            for(int i=1;i<=100;i++){
                if(j*j==i){
                    j++;
                    continue;
                }
                res += Int_Sum(Squareroot(i,100));
            }
            System.out.println(res);
        }
        private Integer Int_Sum(BigInteger b){
            int res = 0;
            String str = b.toString();
            for(int i=0;i<str.length() ;i++){
                res += str.charAt(i) - '0';
            }
            return res;
        }
        private BigInteger Squareroot(int n,int digits){
            // 定义上界 
            BigInteger limit = new BigInteger("10").pow(digits+1);
            BigInteger five = new BigInteger("5");
            BigInteger ten = new BigInteger("10");
            BigInteger hunderd = new BigInteger("100");
            BigInteger a = new BigInteger(n+"").multiply(five);
            BigInteger b = five;
            while( b.compareTo(limit) < 0){
                if(a.compareTo(b) >=0){
                    a = a.subtract(b);
                    b = b.add(ten);
                }else{
                    a = a.multiply(hunderd);
                    b = b.divide(ten).multiply(hunderd).add(five);
                }
            }
            return b.divide(hunderd);
        } 
        
    
        public static void main(String[] args){
            long t0 = System.currentTimeMillis();
            new PE080().run();
            long t1 = System.currentTimeMillis();
            long t = t1 - t0;
            System.out.println("running time="+t/1000+"s"+t%1000+"ms");
            
        }
    }

    40886
    running time=0s34ms

     

    Python

    import time ;
    
    def Suqareroot(n,digits):
        limit = 10**(digits+1)
        a = 5*n 
        b = 5 
        while b < limit:
            if a>= b:
                a -= b 
                b +=10
            else:
                a *= 100 
                b = int(b/10) * 100 + 5
        return int(b/100)
    
    def Int_Sum(n):
        res = sum(map(lambda x:int(x),unicode(n)))
        return res 
    if __name__=='__main__':
        t0 = time.time()
        limit = 1000000
        result = 0
        j = 1 
        for i in range(1,101):
            if j*j == i:
                j+=1
                continue
            result += Int_Sum(Suqareroot(i,100)) 
        print result 
        t1 = time.time()
        print "running time=",(t1-t0),"s"
    
    # 40886
    # running time= 0.039999961853 s
                

     这样的 程序好无节操

    from decimal import Decimal,getcontext
    getcontext().prec=102
    N = set(range(2,100)) - set([4,9,16,25,36,49,64,81])
    s = 0
    for n in N:
            d = Decimal(n).sqrt()
            s += sum([int(i) for i in str(d).replace(".","")[:100]])
    print(s)
  • 相关阅读:
    Java 模板权重随机
    Linux java 启动脚本
    Resin Thread Dump
    Spring Cloud微服务实战 打造企业级优惠券系统 7-17 模板微服务网关路由配置定义
    Spring Cloud微服务实战 打造企业级优惠券系统 6-6 阶段总结 【优惠券系统业务思想与架构总结】
    Spring Cloud微服务实战 打造企业级优惠券系统 6-5 架构设计
    Spring Cloud微服务实战 打造企业级优惠券系统 5-5 阶段练习题
    Spring Cloud微服务实战 打造企业级优惠券系统 5-4 阶段说明[微服务通用模块说明]
    Spring Cloud微服务实战 打造企业级优惠券系统 5-3 统一异常代码编写
    Spring Cloud微服务实战 打造企业级优惠券系统 5-2 统一响应代码编写
  • 原文地址:https://www.cnblogs.com/bbbblog/p/4986652.html
Copyright © 2011-2022 走看看