目录
一.题目引出
你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第 11 个棋盘格放 11 粒麦子,在第 22 个棋盘格放 22 粒麦子,在第 33 个棋盘格放 44 粒麦子,在第 44 个棋盘格放 88 粒麦子,......后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有 6464 格)。
国王以为他只是想要一袋麦子而已,哈哈大笑。
当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!
请你借助计算机准确地计算,到底需要多少粒麦子。
思考:
如果这题用java写的话,我们知道,java最大的基本数据类型为long类型,而由粗略计算可知不满足条件,至少为unsigned long long的数据类型才可以满足条件,用c语言是可以写出来的,但是用java基本数据类型是无法写出来的
但是我们知道JAVA里面有一个类为BigInteger类可以满足:
java.math包的Biglnteger可以表示不可变的任意精度的整数。BigInteger提供所有Java的基本整数操作符的对应物,并提供java.lang.Math的所有相关方法。另外,Biglnteger 还提供以下运算:模算术、GCD计算、质数测试、素数生成、位操作以及一些其他操作。
二.BigInteger了解
1.赋值
BigInteger提供两种赋值方法
BigInteger a=new BigInteger("15"); 默认为10进制形式转换为BigInteger
System.out.println(new BigInteger("15"));//15
BigInteger b=BigInteger.valueOf(1); 为long类型的数字,为10进制
System.out.println(BigInteger.valueOf(15));//15
BigInteger c=new BigInteger("1",int radix);填一个进制,相当于Integer.parseInt(String s,int radix)
将一个radix进制的数转换为BigInteger,也就是Integer数存入
System.out.println(new BigInteger("1001",2)); //9 System.out.println(new BigInteger("AA",16)); //170
2.运算:
①a. add(b);
System.out.println(BigInteger.valueOf(15).add(BigInteger.valueOf(15))); //30
②subtract(); 相减
System.out.println(BigInteger.valueOf(15).subtract(BigInteger.valueOf(10))); //5
③multiply(); 相乘
System.out.println(BigInteger.valueOf(2).multiply(BigInteger.valueOf(10)));//20
④divide(); 相除取整
System.out.println(BigInteger.valueOf(20).divide(BigInteger.valueOf(10))); //2
⑤remainder(); 取余
System.out.println(BigInteger.valueOf(11).remainder(BigInteger.valueOf(6))); //5
⑥pow(); a.pow(b)=a^b 要注意b为int类型
System.out.println(BigInteger.valueOf(2).pow(5)); //32
⑦gcd(); 最大公约数
System.out.println(BigInteger.valueOf(2).gcd(BigInteger.valueOf(10))); //2
⑧abs(); 绝对值
System.out.println(BigInteger.valueOf(-10).abs()); //10
⑨negate(); 取反数
System.out.println(BigInteger.valueOf(10).negate()); //-10
⑩mod(); a.mod(b)=a%b=a.remainder(b);
3.对比
两个bigInteget不能直接比较大小,但是可以判断是否相等
比如a==b,返回boolean(true or false)
int compare = a.compareTo(b);; 如果a>b,就返回1,相等返回0,a<b返回-1
BigInteger max = a.max(b); 返回a和b中较大的那个值
4.转换进制
a.toString(int radix),将BigInteger的数转换为radix进制的数,最后的结果为字符串
如:System.out.println(new BigInteger("15").toString(2));//1111
3.输出
由于BigInteger重写了toString方法,所以可以直接输出
System.out.println(a);
三.解答
了解了之后我们便可以根据BigInteger写出这一题的结果
import java.util.Scanner;
import java.math.BigInteger;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
BigInteger count= BigInteger.valueOf(0);
BigInteger x= BigInteger.valueOf(1);
BigInteger a= BigInteger.valueOf(2);
for(int i=0;i<64;i++){
count=count.add(x);
x=x.multiply(a);
}
System.out.println(count);
scan.close();
}
}