你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第 11 个棋盘格放 11 粒麦子,在第 22 个棋盘格放 22 粒麦子,在第 33 个棋盘格放 44 粒麦子,在第 44 个棋盘格放 88 粒麦子,......后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有 6464 格)。
国王以为他只是想要一袋麦子而已,哈哈大笑。
当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!
请你借助计算机准确地计算,到底需要多少粒麦子。
这里我用的是JAVA。
主要是数据过于的大,这里导出BigInteger包
简单的一句BigInteger m = BigInteger.valueOf(2).pow(64).subtract(BigInteger.valueOf(1));便能清
楚的算出来了。
以下是基本的使用方法:
使用valueOf 将普通数据转换成大数据。
//1.加
BigInteger bigNum1 = a.add(b);
//2.减
BigInteger bigNum2 = a.subtract(b);
//3.乘
BigInteger bigNum3 = a.multiply(b);
//4.除
BigInteger bigNum4 = a.divide(b);
//5.取模(需 b > 0,否则出现异常:ArithmeticException("BigInteger: modulus not positive"))
BigInteger bigNum5 = a.mod(b);
//6.求余
BigInteger bigNum6 = a.remainder(b);
//7.平方(需 n >= 0,否则出现异常:ArithmeticException("Negative exponent"))
BigInteger bigNum7 = a.pow(n);
//8.取绝对值
BigInteger bigNum8 = a.abs();
//9.取相反数
BigInteger bigNum9 = a.negate();
import java.math.BigInteger;
public class Main {
public static void main(String[] args) {
BigInteger m = BigInteger.valueOf(2).pow(64).subtract(BigInteger.valueOf(1));
System.out.println(m);
}
}
同时附上C++的代码,采用的是循环。
#include <iostream>
using namespace std;
int main()
{
unsigned long long sum=1,a=1;
for(int i=0;i<64;i++)
{
a=a*2;
sum+=a;
}
printf("%llu",sum);
return 0;
}