我試圖將陣列轉換為整數 sum=999999999999 (12 9) ,當我將陣列限制為小于 10 個 9 時,它給出了結果,但是當我給出了超過 10 個 9 的陣列時,它給出了一個意想不到的結果結果,請解釋一下這對我很有幫助
int[] arr={9,9,9,9,9,9,9,9,9,9,9,9};
int p=arr.length-1;
int m;
int num=0;
for (int i = 0; i <= p; i ) {
m=(int) Math.pow(10, p-i);
num = arr[i]*m; // it is executing like: 900 90 9=999
}
uj5u.com熱心網友回復:
發生這種情況是因為您超出了Integer.MAX_VALUE.
你可以在這里閱讀。
您可以使用代替intalong來存盤較大的值,如果這對您來說還不夠,您可以使用 -BigInteger
BigInteger num = BigInteger.valueOf(0);
for (int i = 0; i <= p; i ) {
BigInteger m = BigInteger.valueOf((int) Math.pow(10, p-i));
BigInteger next = BigInteger.valueOf(arr[i]).multiply(m));
num = num.add(BigInteger.valueOf(arr[i]*m));
}
uj5u.com熱心網友回復:
這是因為 int 編碼為 4 位元組,所以從技術上講,您只能從 -2,147,483,648 變為 2,147,483,647。考慮使用長型別。
uj5u.com熱心網友回復:
有幾件事。
- 你不需要使用
Math.pow. - 對于最多 18 位,您可以使用 a
long進行計算。 - 我添加了一些額外的數字來演示
int[] arr={9,9,9,9,9,9,9,9,9,9,9,9,1,1,2,3,4};
long sum = 0; // or BigInteger sum = BigInteger.ZERO;
for (int val : arr) {
sum = sum * 10 val; // or sum.multiply(BigInteger.TEN).add(BigInteger.valueOf(val));
}
System.out.println(sum);
印刷
99999999999911234
這是順序,1,2,3,4因此您可以看到正在發生的事情。
- sum = 0
- sum = sum(0) * 10 1 (sum is now 1)
- sum = sum(1) * 10 2 (sum is now 12)
- sum = sum(12)* 10 3 (sum is now 123)
- sum = sum(123)*10 4 (sum is now 1234)
uj5u.com熱心網友回復:
嘗試使用 long(或任何其他可以表示更大數字的型別)而不是 int。我建議這樣做是因為 int 溢位:請參閱https://en.wikipedia.org/wiki/Integer_overflow
uj5u.com熱心網友回復:
因為它溢位整數邊界
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/454371.html
