2 ^ 1000 = 2147483647,现在我想在答案中加上所有个别数字(例如2 + 1 + 4 + 7 + 4 ......) 这是我的代码,但我得到答案为-10。这是我的逻辑: 将2147483647转换为字符串 将该字符串转换为char 创建一个char数组并将所有char放入该数组中 创建一个int数组并将所有这些字符放入该数组中,然后将元素加起来
我的代码
int total = 0;
int x = (int) Math.pow(2, 1000);
System.out.println("2^1000 = " + x);
String power = Integer.toString(x);
ArrayList<Integer> powstoint = new ArrayList<Integer>();
//From string to char
char[] stringtochar = power.toCharArray();
for(int b = 0; b<stringtochar.length;b++){
powstoint.add(b, power.indexOf(Integer.parseInt(power)));
total = total + powstoint.get(b);
}
System.out.println(total);
}
答案 0 :(得分:1)
2^anything
不能是奇数。
2^1000
远远超过2147483647
。
整数溢出再次发生。 int
无法适应2^1000
。
答案 1 :(得分:1)
尽管您的整数溢出,但问题是power.indexOf(Integer.parseInt(power))
将始终返回-1
(请参阅docs)
由于您的号码中有10位数字,因此输出为-10。
要实现您的目标,请使用Character.getNumericValue(char ch)
。
char[] stringtochar = power.toCharArray();
for(int b = 0; b<stringtochar.length;b++){
powstoint.add(b, Character.getNumericValue(stringtochar[b]));
total = total + powstoint.get(b);
}
您的程序中无需使用List
。你可以直接执行这样的总和:
for(char c : power.toCharArray()){
total += Character.getNumericValue(c);
}
看起来你正在做欧拉项目问题#16:
使用BigDecimal
存储您的号码并避免溢出:
BigDecimal x = new BigDecimal(Math.pow(2, 1000));
然后获取char数组,使用相同的过程:
char[] array = x.toString().toCharArray();
答案 2 :(得分:0)
largest possible int value为214783647
,即2^31-1
。
正在发生的事件2^1000
大于int
的最大可能值,因此它只是使其成为最大值(214783647
)。