欧拉项目第16题 Power digit sum

来源:互联网 发布:mybatis显示sql语句 编辑:程序博客网 时间:2024/06/05 00:43

215 = 32768 and the sum of its digits is 3 + 2 + 7 + 6 + 8 = 26.

What is the sum of the digits of the number 21000?


求2的1000次方 值的各个位数上数值之和。

直接运算肯定是不行了,

思路是,把值直接分解成数组,如 :

<span style="white-space:pre"></span>map.put(1, new Integer[]{2});        map.put(2, new Integer[]{4});        map.put(3, new Integer[]{8});        map.put(4, new Integer[]{6,1});

循环处理,每次取上一个值,从个位数开始运算

 public static void main(String... args) {        long start = System.currentTimeMillis();        Map<Integer, Integer[]> map = new HashMap<Integer, Integer[]>();        map.put(1, new Integer[]{2});        map.put(2, new Integer[]{4});        map.put(3, new Integer[]{8});        map.put(4, new Integer[]{6,1});                Integer end = 1000;        for(int i=4;i<end;i++){            Integer[] last = map.get(i);            Integer xyz = (last[last.length-1] * 10 + last[last.length-2]) * 2;            Integer[] this_=null;            if(xyz > 99) { //计算本次数组位数                this_ = new Integer[last.length + 1];            } else {                this_ = new Integer[last.length];            }                        int index=0;            int is_u = 0;//处理下一位数是否需要+1            for(Integer la : last) {                if(la*2 >= 10) {//*2 结果大于10,值减去10,下一位数 +1;                    this_[index] = la*2 % 10 + is_u;                    is_u = 1;                } else {                    this_[index] = la*2 + is_u;                    is_u = 0;                }                index++;            }            if(is_u == 1) {                this_[index] = is_u;            }            map.put(i + 1, this_);        }              Integer[] i_1000 = map.get(end);       long xxxx = 0;       for(Integer i : i_1000) {           if(i == null) break;           xxxx+=i;       }       System.out.println(System.currentTimeMillis() - start);       System.out.println(xxxx);    }


中间取数,有其他方法

<span style="white-space:pre"></span>for(int i=4;i<end;i++){            Integer[] last = map.get(i);            Integer xyz = (last[last.length-1] * 10 + last[last.length-2]) * 2;            Integer[] this_=null;            if(xyz > 99) { //计算本次数组位数                this_ = new Integer[last.length + 1];                this_[last.length] = 1;//最后一位肯定是1            } else {                this_ = new Integer[last.length];            }                        int index=0;            for(Integer la : last) {                if(index==0) {                    this_[index] = la*2%10;                } else {                    int o = (last[index-1] + la*10)*2; //后两位数 * 2 ,取余100,除以10就是本次的值                    this_[index]=(o % 100 )/10;                }                index++;            }            map.put(i + 1, this_);        }



看到别人的思路,自己想复杂了,都忘了math.power()函数了。。。

<span style="white-space:pre"></span>BigInteger a = new BigInteger("2").pow(1000);        String as = a.toString();        int out = 0;        for (int i = 0; i < as.length(); ++i) {            char c = as.charAt(i);            out += (c-'0');        }        System.out.println(out);





0 0
原创粉丝点击