欧拉项目第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次方 值的各个位数上数值之和。
直接运算肯定是不行了,
思路是,把值直接分解成数组,如 :
循环处理,每次取上一个值,从个位数开始运算
中间取数,有其他方法
看到别人的思路,自己想复杂了,都忘了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);
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);
相关文章推荐
- xUtils3.0使用介绍:数据库模块
- Robotium导入被测源码遇到问题 had used a different Landroid/support/v4/view/ViewPager
- C# 性能优化
- 创新驱动的技术与管理
- 动画四大宝-平移、缩放、旋转、透明度
- 在一个字符串的相同指定长度间隔处插入指定字符串
- display: inline-block间隙问题
- 微信分享|如何在云中构建大规模分布式系统
- poj 1014 Dividing
- Tomcat 内存配置
- 二、软件测试的流程
- Redis for .NET 系列之实现分页需求
- redis两种持久化机制
- HDU1323_Perfection【水题】
- TCP/UDP网络编程
- Java.math.BigDecimal.movePointRight()方法实例
- 编程修养
- 浅谈Java中的hashcode方法
- VMware虚拟机文件夹中各文件作用详解
- 跟着Google学Android —— 0 积跬步 以至千里