您的位置:首页 > 其它

欧拉项目第16题 Power digit sum

2016-03-16 16:22 447 查看
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: