算法题每日一练 --- 第 2 天:棋盘放麦子
一、问题描述
你一定听说过这个故事。国王对发明国际象棋的大臣很佩服,问他要什么报酬,大臣说:请在第 1 个棋盘格放 1 粒麦子,在第 2 个棋盘格放 2 粒麦子,在第 3 个棋盘格放 4 粒麦子,在第 4 个棋盘格放 8 粒麦子,......后一格的数字是前一格的两倍,直到放完所有棋盘格(国际象棋共有 64 格)。
国王以为他只是想要一袋麦子而已,哈哈大笑。
当时的条件下无法准确计算,但估算结果令人吃惊:即使全世界都铺满麦子也不够用!
请你借助计算机准确地计算,到底需要多少粒麦子。
二、题目要求
考察
三、解题思路
由题目可以得知,从第一个棋盘开始,后面的麦子数量逐渐增加是前一个的 2 倍,对于计算机来说主要有两种求解方法,一种借助公式、一种直接运算。
1.公式法
是公比为 2,首项为 1,求解第 4 位元素和的等比数列。
利用头文件 #include<math.h>数学公式里面的 pow(k,n),其中 k 表示数字,n 表示 k 的 n 次方
2.直接运算法
使用两重 for 循环循环 64 次,每一次结果乘以倍数 2。
定义 sum=1,在 for 循环中求出剩下 63 次倍数关系。
拓展
上述两种方法在代码编写的时候会遇到一个问题就是存储溢出,64 位数值的和太大,平时所定义的 int、long long 都不能够满足存储。
这时候可以用 unsigned long long 定义,unsigned long long 的最大值:1844674407370955161 最大 19 位,完全可以满足存储需求。定义所输出需要使用 %llu 或者 %I64u。
四、编码实现
1.公式法
2.直接运算法
五、输出结果
输出结果:18446744073709551615
版权声明: 本文为 InfoQ 作者【知心宝贝】的原创文章。
原文链接:【http://xie.infoq.cn/article/5620e2cdedba8d4ae491154c1】。文章转载请联系作者。
评论