欧拉工程第16题

题目链接:https://projecteuler.net/problem=16
求2的1000次方各位数字之和。
思路:
1.数据很大,不能直接计算,用字符串来解决问题
2.先求出2的1000次方,存在字符串中
2.1 字符串的乘法,本题只是一个字符串乘以一个0-9的数字(2),长字符串乘以个位数
2.2表面上很简单的。各位分别乘以2,结果大于9的进位,在链接成一个新的字符串。但是注意:乘到最高位时候可能进位,需要考虑到。
3. 这个就简单了,根据结果求字符串各位数字之和

package projecteuler11to20;

import java.util.Date;

class level16{
    void solve(){
        int x=2;
        int y=1000;
        String resultString=String.valueOf(x);
        for(int i=1;i<y;i++){
            resultString=StringMultiply(resultString,x);
        }
        long result=sumString(resultString);
        System.out.println("2的1000次方各位数字之和:"+result+"\n 结果是: "+resultString);

    }
    long sumString(String str){
        long sum=0;
        for(int i=0;i<str.length();i++){
            String subStr=str.substring(i,i+1);
            long num= Long.parseLong(subStr);
            sum+=num;
        }
        return sum;
    }
    String StringMultiply(String str,int x){
        //str * x,x只能是个0-9的数字
        //注意可能在进位的时候超过了最高位。
        int before=0;
        String result="";

        for(int i=str.length();i>0;i--){
            String subStr=str.substring(i-1,i);
            int mul=before+Integer.parseInt(subStr)*x;
            if(i==1 && mul>9){//最高位进位
                String temp=  String.valueOf(mul);
                result=temp.concat(result);
            }else if( mul>9){//中间进位

                String temp=  String.valueOf(mul%10);
                result=temp.concat(result);
                before=mul/10;
            }else{
                result=String.valueOf(mul).concat(result);
                before=0;
            }

        }
        return result;
    }

}
public class Problem16 {
    public static void main(String[] args) {
        Date beginTime=new Date();
        new level16().solve();//1366
        Date endTime=new Date();
        long Time=endTime.getTime()-beginTime.getTime();
        System.out.println("Time="+Time/1000+"秒"+Time%1000+"毫秒");
    }

}

你可能感兴趣的:(java,欧拉工程)