每日一题:由棋盘放麦子引出Java的BigInteger

目录

一.题目引出

二.BigInteger了解

1.赋值

2.运算:

3.对比

4.转换进制

3.输出

 三.解答


一.题目引出

你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第 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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

允歆辰丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值