我正在为学生创建一个小游戏,在一个地方,它必须显示2 7830457 +1
的值如果数字不是那么大,我可以调用BigInteger的pow()方法。由于数量很大,这种方法毫无用处。我怎样才能找到这种数字的巨大力量?请帮忙!
答案 0 :(得分:8)
二进制文件只有10000...01
,其中有7830456个零。
在十进制中,将有大约两百万个数字,大约2兆字节的存储空间。这完全在具有默认堆大小的BigInteger
的可行性范围内。
实际上,它甚至使用exponentiation by squaring来快速计算它(尽管规范不能保证)。但是,转换为String
需要一些时间,因为它是线性时间操作。
import java.math.BigInteger;
public class BigPow {
public static void main(String[] args) {
BigInteger result = (new BigInteger("2")).pow(27830457).add(BigInteger.ONE);
System.out.println(result);
}
}
这是一个会慢慢打印数字的版本:
import java.math.BigInteger;
public class BigPow {
public static void main(String[] args) {
BigInteger result = (new BigInteger("2")).pow(27830457).add(BigInteger.ONE);
BigInteger powten = BigInteger.TEN.pow(2357202);
while(powten.compareTo(BigInteger.TEN) > 0) {
BigInteger digit = result.divide(powten).mod(BigInteger.TEN);
System.out.print(digit);
powten = powten.divide(BigInteger.TEN);
}
}
}
第一个数字是:
2733738639062831355730724885773203300816855642973807879176160716054994495451063785500541771864696516354635136598485776179684795037788083629143424452902991927170627198252340568713433469269134447753848945097109143746316094037162464703006474196843640156671125528435369044827054540244464154703039922824374331519360871014872164887908559269991329974578539260930177418542736743078283429062926585907381446668771440843602580986046292627561008735459599243600018721615295454277499150999237498553887988089790263960045162791492304348343651441954441330639127852930365011277329750209061945916788856327407158784862308588006709196891123629673211925293749715276954157951615065942499704196821312245056836412197647426909791063564122792292339809224240975555411598585583101545920478039147059154328126737371655627225938668386453826392239872360221017380015140533210027591361955956357582949836980695703152607725823630518625426905681113413513335093692429410134529433569886633956191885758422974427790118079202918015648500008 6528174400878657004645726892816943589969701053158760210512171516969813345080894134663207988962182426459128577282934948790911691329475034324656384238413230485050607666988301932660490870167246016897007835866691705399794247746213819662270451531049826029606671683482160663572103374
由WolframAlpha确认。
答案 1 :(得分:4)
我不知道为什么你认为BigInteger
不符合这一点:
import java.math.BigInteger;
public class Test {
public static void main(String[] args) throws Exception {
BigInteger big = BigInteger.valueOf(2)
.pow(7830457)
.add(BigInteger.ONE);
System.out.println(big);
}
}
需要一段时间(特别是最后的字符串转换),但这是完全合理的。
正如彼得所指出的那样,转移ONE
离开7830457更加整洁,请注意。我认为它不太清楚 - 当然它在字符串转换部分没有帮助。
编辑:几乎所有的时间都花在字符串转换上。它最后在我的盒子上完成了。我再也看不到它的开始,但它以......结尾。
08570502260645006898157834607641626568029302766491883299164453304032280181734737
79366998940913082443120328458954436211937775477966920836932628607888755839700303
873
答案 2 :(得分:2)
你应该可以用BigInteger来计算它。
System.out.println(BigInteger.ONE.shiftLeft(7830457).add(BigInteger.ONE));
答案 3 :(得分:1)
尝试这样的事情:
BigInteger mant = new BigInteger("2");
BigInteger result = mant.pow(7830457).add(BigInteger.ONE);