放麦子_蓝桥杯题目

今天做了个蓝桥杯的题目,放麦子。题目简单,确发掘了几种解法,感受到编程的魅力,记录分享一下。


你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,

问他要什么报酬,大臣说:请在第1个棋盘格放1粒麦子,

在第2个棋盘格放2粒麦子,在第3个棋盘格放4粒麦子,

在第4个棋盘格放8粒麦子,......后一格的数字是前一格的两倍,

直到放完所有棋盘格(国际象棋共有64格)。

国王以为他只是想要一袋麦子而已,哈哈大笑。

当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!

请你借助计算机准确地计算,到底需要多少粒麦子。


当然,这道题也是考察对大整数的计算,本题的数字一定是用BigInteger类型才能解决的,不然蓝桥杯不至于考这么low的题目。

第一种方法使用了递归。

import java.math.BigInteger;
public class Q_12 {
	public static void f(BigInteger sum,int k){
		if(k==64){
			System.out.println(sum);
			return;
		}
		sum = sum.add(BigInteger.valueOf(	(long)(Math.pow(2,k))	));
		//sum = sum.add(new BigInteger("2").pow(k));
		//两种算法均可
		f(sum,k+1);
	}
    public static void main(String[] args) {
    	BigInteger sum = BigInteger.ZERO;
    	
    	f(sum,0);
    }
}


第二种解法,其实这样小的程序,使用递归反而占用了更多的资源,不如直接使用一个for循环。

第三种解法,算了半天,笨的我就是没想到,这个数就是(2^64-1) 。这道题简单的居然一行输出语句就能解决的地步。真是应该做很多反思,编程的目的是为了解放双手,

我们能用一行代码解决的问题却又花了大把时间去搞递归、循环,呵呵。生活中的事情不也是如此吗? 反思,切记。

import java.math.BigInteger;
public class Q_12 {
	public static void main (String[] args) {
	BigInteger sum = BigInteger.ZERO;
	BigInteger base = new BigInteger("2");
	for(int i=0;i<64;i++){
		sum = sum.add(	base.pow(i)	);
	}
	
	System.out.println(sum);
	
	//一行解决问题
	System.out.println(	base.pow(64).subtract(BigInteger.ONE));
	}
}


  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值