填空题 2012 蓝桥杯 省赛 棋盘放麦子
问题描述
你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第 11 个棋盘格放 11 粒麦子,在第 22 个棋盘格放 22 粒麦子,在第 33 个棋盘格放 44 粒麦子,在第 44 个棋盘格放 88 粒麦子,…后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有 6464 格)。
国王以为他只是想要一袋麦子而已,哈哈大笑。
当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!
请你借助计算机准确地计算,到底需要多少粒麦子。
解析:天真的我还以为long long可以了,结果一直错误,发现要用unsigned long long 才可以
- long long
所占内存:所占内存大小:8byte=64bit;
所能表示范围:-9223372036854775808 ~ 9223372036854775807; (即-263~263-1) - unsigned long long
8byte=64bit:
所能表示范围:0~1844674407370955161;
(即0~264-1)
这时候需要分析题目:
- 第一个棋盘: 20 = 1
- 第二个棋盘: 21 = 2;
- 第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;
}
本题:棋盘放麦子