蓝桥杯 棋盘放麦子

填空题 2012 蓝桥杯 省赛 棋盘放麦子

问题描述
 你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第 11 个棋盘格放 11 粒麦子,在第 22 个棋盘格放 22 粒麦子,在第 33 个棋盘格放 44 粒麦子,在第 44 个棋盘格放 88 粒麦子,…后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有 6464 格)。

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

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

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

解析:天真的我还以为long long可以了,结果一直错误,发现要用unsigned long long 才可以
  1. long long
    所占内存:所占内存大小:8byte=64bit;
    所能表示范围:-9223372036854775808 ~ 9223372036854775807; (即-263~263-1)
  2. unsigned long long
    8byte=64bit:
    所能表示范围:0~1844674407370955161;
    (即0~264-1)

这时候需要分析题目:

  1. 第一个棋盘: 20 = 1
  2. 第二个棋盘: 21 = 2;
  3. 第64个棋盘: 263

可见第64个棋盘的米 就已经爆了long long
而且我们要求的是全部的米 所以 需要用到 unsigned long long
其实也是刚刚够用

#include <iostream>
using namespace std;
typedef unsigned long long LL;
LL res = 0;
int main()
{
  for(int i = 0; i <= 63; i ++)
  {
    res += (LL)1 << i; //每个棋盘都加起来 (左移操作 详情百度)
  }
  cout << res;
  return 0;
}

优化代码:20 + 21 + … +263 = 264 - 1

#include <iostream>
using namespace std;
typedef unsigned long long LL;
int main()
{
    LL res = 0;
    res = (1 >> 64) - 1;
    cout << res;
    return 0;
}

本题:棋盘放麦子

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值