常用算法——解析算法

解析算法,即解析法(analysis algorithm)是指用解析的方法找出表示问题的前提条件与结果之间关系的数学表达式,并通过表达式的计算来实现问题求解,其解题流程见图1。 

解析算法流程图

例1 使用一根长度为l厘米的铁丝,制作一个面积为s平方厘米的矩形框,要求计算该矩形框应有的高h和宽w。

 

铁丝制作矩形框参数关系图

分析:设矩形框的高为h、宽为w,则根据几何关系(参考图2)可得:

 所以h=h1,则w=h2;或者h=h2,则w=h1

d=l^{2}-16s,则当d<0时无解,当d=0时有两个相同解,当d>0时有两个不同解。程序流程如图3所示。

铁丝制作矩形框程序设计流程图

完整程序如下:

##############################################
# 设计 Zhang Ruilin    创建 2022-10-30 14:21 #
# 已知矩形周长(l)和面积(s),求其高(h)和宽(w) #
##############################################
l = float(input('请输入铁丝的长度'))
s = float(input('请输入矩形框面积'))
d = l * l - 16 * s
if d < 0:
    print(f'无实数解(长度为{l}厘米的铁丝制作'\
          f'不了面积为{s}平方厘米的矩形框)')
elif d == 0:
    h = w = l / 4
    print(f'长度为{l}厘米的铁丝制作面积为{s}平方厘米的'\
          f'矩形框,高为{h}厘米宽为{w}厘米')
else:
    h = (l - d ** 0.5) / 4
    w = (l + d ** 0.5) / 4
    print(f'长度为{l}厘米的铁丝制作面积为{s}平方厘米的'\
          f'矩形框,高为{h:.2f}厘米宽为{w:.2f}厘米')

执行结果如下:

 2 古代有个聪明人给国王送来了一种棋子,叫做象棋,棋盘上有六十四个格子,棋子上刻着皇帝”“皇后”“”“”“”……。下棋的人按照规则走动棋子,双方对阵,像打仗一样,看谁能把谁打败。国王玩得没有够,这象棋真的太好玩了。于是,国王把发明象棋的聪明人找来,高兴地说:这玩意儿确实使人玩不厌,我要重重赏你,你希望得到什么,我都能满足你的要求。

聪明人说:“我只要些米粒。”“米粒,几颗米粒算什么?”国王说:“你要多少?”聪明人说,“这样吧,您在第一格棋盘上放一粒,第二格棋盘上放两粒,第三格放上四粒……照这样放下去,每格比前一格加一倍,把八八六十四格棋盘都放满了,我也就满足了。”(参见图4)。

 64格棋盘上每格应放米粒数示意图

国王叫管粮食的大臣来计算,他一粒、两粒、四粒、八粒、十六粒……才放到二十格,一口袋大米就放完了,以后是二袋、四袋、八袋、十六袋……还没有放到棋盘的一半。粮仓里的粮食全放完了,他马上去报告国王:“不得了,不得了!”“什么事大惊小怪?”国王问。请计算放满64格棋盘需要多少粮食(1 千克大米约50000粒),以至于管粮食的大臣大喊“不得了,不得了!”。

解法一:如图4所示,总数s=2^{0}+2^{1}+2^{2}+2^{3}+...+2^{62}+2^{63}。计算程序如下:

#############################################
# 设计 Zhang Ruilin   创建 2022-10-31 09:01 #
# 棋盘上的米粒。64 格棋盘,第 1 格放 1 粒, #
# 第 2 格放 2 粒,程序后一格是前一格的一倍,#
# 求放满64格需要多少大米(1 千克约 50000 粒) #
#############################################
s = 0
for i in range(64):
    s += 2**i
print(f'{s}粒,约{s/50000:.2f}千克\n约{s/5e7:.2f}吨)')

运行结果为:

18446744073709551615粒,约368934881474191.06千克

约368934881474.19吨。

解法二:式s=2^{0}+2^{1}+2^{2}+2^{3}+...+2^{62}+2^{63}明显是个等比数列求和等比数列求和,设

 

 计算程序如下:

#############################################
# 设计 Zhang Ruilin   创建 2022-10-31 12:50 #
# 棋盘上的米粒。64 格棋盘,第 1 格放 1 粒, #
# 第 2 格放 2 粒,程序后一格是前一格的一倍,#
# 求放满64格需要多少大米(1 千克约 50000 粒) #
#############################################
a1 = 1
q = 2
n = 64
s = 2 ** 64 - 1
print(f'{s}粒,约{s/50000:.2f}千克\n约{s/5e7:.2f}吨)')

运行结果为:

18446744073709551615粒,约368934881474191.06千克

约368934881474.19吨

2021年度中国大米产量约为1.49亿吨

即需要按中国2021年的产量,2476.07年生产的大米才能满足要求。

猜你喜欢

转载自blog.csdn.net/hz_zhangrl/article/details/128710016