棋盘放麦子

14天阅读挑战赛

一、问题描述

古时候,印度有个国王爱玩,经常要大臣们为他想一些新奇的玩法,谁发明的玩具有意思,国王就会给他奖赏。

一次,一个聪明的大臣发明了一种棋,这种棋变幻无穷,国王久玩不厌。国王十分高兴,要大赏那个大臣,便对他说:“你想要什么奖赏,我都可以满足你。”

那个大臣没有要金银珠宝之类的,也没有要城堡土地。他对国王说:“我只要一些麦粒。”

“麦粒?哈!”国王觉得好笑,“你要多少呢?”

“国王陛下,你在第一个方格棋盘上放一粒,第二个放2粒,第三个放4粒,第四个放8粒……照这样放下去,每格比前一格多放一倍,把64个格棋盘放满就行了。”

二、解题思路

由题目可以得知,从第一个棋盘开始,后面的麦子数量逐渐增加是前一个的2倍,对于计算机来说主要有两种求解方法,一种借助公式、一种直接运算。

1.公式法

• 是公比为2,首项为1,求解第4位元素和的等比数列。
• 利用头文件#include数学公式里面的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.公式法

#include
#include <math.h>//定义头文件
unsigned long long result;//定义unsigned型result
int main()
{
result = pow(2,64)-1;//利用pow公式计算等比数列第64位的数值
printf(“%llu”,result);//特定格式输出结果
return 0;
}

2.直接运算法

#include
using namespace std;
unsigned long long n,sum=0,m;//在main函数外面定义,取值范围会增大
int main()
{
for(int i=1;i<=64;i++)//循环64次
{
m=1;//定义m
for(int j=1;j<i;j++)//求和
{
m=2*m;//彼此相乘
}
sum+=m;//等比数列求和
}
cout<<sum;//输出结果
return 0;
}

四、输出结果

输出结果:18446744073709551615

算法设计技巧之回溯法

一、基本概念

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。

回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。

二、基本思想

在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。

若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。

三、解题步骤

(1)针对给定问题,定义问题的解空间树:首先应明确定义问题的解空间,问题的解空间应至少包含问题的一个(最优)解;
(2)确定结点的扩展搜索规则;
(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

【感悟】
不要小看知识的作用,知识是一笔财富,它能让你受用一生。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值