2 ^ 15 = 32768,其数字之和为3 + 2 + 7 + 6 + 8 = 26.
数字2次幂1000(2 ^ 1000)的数字总和是多少?
任何人都可以在java中为这个问题提供解决方案或算法吗?
答案 0 :(得分:9)
这是我的解决方案:
public static void main(String[] args) {
ArrayList<Integer> n = myPow(2, 100);
int result = 0;
for (Integer i : n) {
result += i;
}
System.out.println(result);
}
public static ArrayList<Integer> myPow(int n, int p) {
ArrayList<Integer> nl = new ArrayList<Integer>();
for (char c : Integer.toString(n).toCharArray()) {
nl.add(c - 48);
}
for (int i = 1; i < p; i++) {
nl = mySum(nl, nl);
}
return nl;
}
public static ArrayList<Integer> mySum(ArrayList<Integer> n1, ArrayList<Integer> n2) {
ArrayList<Integer> result = new ArrayList<Integer>();
int carry = 0;
int max = Math.max(n1.size(), n2.size());
if (n1.size() != max)
n1 = normalizeList(n1, max);
if (n2.size() != max)
n2 = normalizeList(n2, max);
for (int i = max - 1; i >= 0; i--) {
int n = n1.get(i) + n2.get(i) + carry;
carry = 0;
if (n > 9) {
String s = Integer.toString(n);
carry = s.charAt(0) - 48;
result.add(0, s.charAt(s.length() - 1) - 48);
} else
result.add(0, n);
}
if (carry != 0)
result.add(0, carry);
return result;
}
public static ArrayList<Integer> normalizeList(ArrayList<Integer> l, int max) {
int newSize = max - l.size();
for (int i = 0; i < newSize; i++) {
l.add(0, 0);
}
return l;
}
这段代码可以通过多种方式进行改进......只是为了证明你可以在没有BigInts的情况下完美地完成它。
捕捉是将每个数字转换为列表。这样你可以做基本的总和,如:
123456
+ 45
______
123501
答案 1 :(得分:6)
int result = 0;
String val = BigInteger.valueOf(2).pow(1000).toString();
for(char a : val.toCharArray()){
result = result + Character.getNumericValue(a);
}
System.out.println("val ==>" + result);
如果你知道如何使用biginteger,这很简单。
答案 2 :(得分:4)
我不会提供代码,但java.math.BigInteger
应该使这一点变得微不足道。
答案 3 :(得分:4)
创建长度为302的向量,长度为2 ^ 1000。然后,在索引0处保存2,然后加倍1000次。只要查看每个索引,如果之前的代码为10,则将1添加到下一个索引。然后将其总结一下!
答案 4 :(得分:3)
这个问题不只是问你如何找到最近的大整数库,所以我会避免这个解决方案。 This page has a good overview这个特殊问题。
答案 5 :(得分:1)
final String bignumber = BigInteger.valueOf(2).pow(1000).toString(10);
long result = 0;
for (int i = 0; i < bignumber.length(); i++) {
result += Integer.valueOf(String.valueOf(bignumber.charAt(i)));
}
System.out.println("result: " + result);
答案 6 :(得分:1)
如何交替表达2 ^ 1000?
我在数学时代记不得太多,但也许像(2 ^(2 ^ 500))?怎么能表达出来呢?
找到一种简单的方法来计算2 ^ 1000,将结果放在BigInteger中,其余的可能是微不足道的。
答案 7 :(得分:1)
这是我的代码......请提供运行此代码的必要参数。
import java.math.BigInteger;
public class Question1 {
private static int SumOfDigits(BigInteger inputDigit) {
int sum = 0;
while(inputDigit.bitLength() > 0) {
sum += inputDigit.remainder(new BigInteger("10")).intValue();
inputDigit = inputDigit.divide(new BigInteger("10"));
}
return sum;
}
public static void main(String[] args) {
BigInteger baseNumber = new BigInteger(args[0]);
int powerNumber = Integer.parseInt(args[1]);
BigInteger powerResult = baseNumber.pow(powerNumber);
System.out.println(baseNumber + "^" + powerNumber + " = " + powerResult);
System.out.println("Sum of Digits = " + Question1.SumOfDigits(powerResult));
}
}
答案 8 :(得分:0)
2 ^ 1000是一个非常大的值,你必须使用BigIntegers。算法类似于:
import java.math.BigInteger;
BigInteger two = new BigInteger("2");
BigInteger value = two.pow(1000);
int sum = 0;
while (value > 0) {
sum += value.remainder(new BigInteger("10"));
value = value.divide(new BigInteger("10"));
}
答案 9 :(得分:0)
或者,你可以获得一个双倍manipulate its bits。如果数字是2的幂,则不会出现截断错误。然后你可以将它转换为字符串。
话虽如此,它仍然是一种蛮力的方法。必须有一个很好的数学方法来实现它而不实际生成数字。
答案 10 :(得分:-2)
In[1162] := Plus @@ IntegerDigits[2^1000]
Out[1162] = 1366