python问题(更新中)

 

目录

1.求素数(质数)问题

2.求素数问题

3. 递归斐波那契数列,案例来自菜鸟教程

4. 约瑟夫生者死者小游戏,来自菜鸟教程Python 约瑟夫生者死者小游戏 | 菜鸟教程

5. 五人分鱼,来自菜鸟教程Python 五人分鱼 | 菜鸟教程


1.求素数(质数)问题

i = 2
while(i < 100):
   j = 2
   while(j <= (i/j)):
      if not(i%j): break
      j = j + 1
   if (j > i/j) : (print i, " 是素数")
   i = i + 1
 
print ("Good bye!")

相当于

i = 2
while(i < 100):
   j = 2
   while(j <= (i/j)):
        if not(i%j):
            break
        else:
            j = j + 1
   if(j > i/j):
       print (i, " 是素数")
   i = i + 1
 
print ("Good bye!")

 从头解释一下代码。首先知道质数的定义是:在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。所以i和j的初始值都是2。i的范围为2-99。

代码中的 if not(i%j): break是指:当i可以整除j时,i%j=0,即布尔运算为false,这时用not(0),即将false转为了true,这样就可以运行break语句。

两个并列的选择结构whileifwhile(i < 100)中的每次循环都是从j=2开始,除了i=2,3时i/j<j,之后每次循环都会先进入while判别式。

while循环的作用是,如果i不能被2整除,那就试试能不能被3,4,5,6,7...整除,最终测试结果有两种:一是能被某一数整除,退出循环,i=i+1,进入下一循环;二是不能被整除,进入与while并列的if选择结构,得出是素数的结论,i=i+1,进入下一循环。

2.求素数问题

for num in range(10,20):  # 迭代 10 到 20 之间的数字
   for i in range(2,num): # 根据因子迭代
      if num%i == 0:      # 确定第一个因子
         j=num/i          # 计算第二个因子
         print ('%d 等于 %d * %d' % (num,i,j))
         break            # 跳出当前循环
   else:                  # 循环的 else 部分
      print ('%d 是一个质数' % num)

这里的问题主要是for和else的并列,这种情况很少见,查阅网上资料后得知原理为:如果else前不是break出的,就执行else语句。

3. 递归斐波那契数列,案例来自菜鸟教程

def recur_fibo(n):
# """递归函数
#    输出斐波那契数列"""
    if n <= 1:
        return n
    else:
        return(recur_fibo(n-1) + recur_fibo(n-2))
# 定义一个循环
while True:
    try:
        
        # 获取用户输入的数字
        nterms = int(input("您要输出几项? "))
        if nterms <= 0:
            print("输入正数")
        else:
            print("斐波那契数列:")
        for i in range(nterms):
            print(recur_fibo(i))
            
        #输出完斐波那契数列后退出while
        break
    except ValueError:
        # 检查输入的数字是否正确
        # 若输入的格式不正确则给予提醒
            print('请输入正整数或零')

首先解释一下递归函数(百度百科):直接或间接调用函数本身,则该函数称为递归函数。

本例recur_fibo函数存在else:return到recur_fibo函数,意即再次调用本函数。

对代码进行解释:

while True表示对其包含的代码进行无限循环,直至执行到break命令。

try...except ValueError表示,先执行try中的代码,如果try中的代码出现ValueError错误,那么就执行except中的代码,用这里是防止输入字母或者符号。

nterms获取到用户输入的数字,进入if...else...选择结构,当输入的数字小于等于0或不为数字时,提醒重新输入;否则调用递归函数,输出斐波那契数列。

4. 约瑟夫生者死者小游戏,来自菜鸟教程Python 约瑟夫生者死者小游戏 | 菜鸟教程

# 创建一个空字典用来给每个人编号并表示他们是否在船上
people={}
for x in range(1,31):
    people[x]=1
# print(people)
check=0
i=1
j=0
# 当编号小于等于三十一时,为一个循环
while i<=31:
#     如果编号等于31,那么从编号1继续
    if i == 31:
        i=1
#     如果船上剩余人数为15,退出while
    elif j == 15:
        break
#     在其他情况下执行以下语句
    else:
#         如果编号为i的人键值为0,意思是他已经不在船上了,那么编号+1,重新进入while循环
        if people[i] == 0:
            i+=1
            continue
#             编号为i的人键值不为0,执行以下语句
        else:
#             检查数+1
            check+=1
#             如果检查数为9,那么编号为i的人的键值变为0,输出编号下船,同时j+1表示下船的人数加一
            if check == 9:
                people[i]=0
                check = 0
                print("{}号下船了".format(i))
                j+=1
#             检查数加一的情况下不等于9,则编号加一,进入while循环
            else:
                i+=1
                continue

这个案例的难点在于嵌套层数过多,但是只要耐下心来一层一层去分析, 还是能够理解作者的用意。通过这个案例可以对字典嵌套语句有更好的掌握。

5. 五人分鱼,来自菜鸟教程Python 五人分鱼 | 菜鸟教程

# 定义主函数
def main():
    fish = 1
#   定义一个无限循环
    while True:
        total, enough = fish, True
#       '_'是一个循环标志,可以用其他任何字符来代替,不参与循环中的运算
#       range(5)表示要进行5次循环  
#       循环一开始,total=fish,每次循环后,total的值发生变化,变成了(total - 1)的五分之四
        for _ in range(5):
            if (total - 1) % 5 == 0:
                total = (total - 1)  //  5 * 4
#           当for循环的if条件无法完成时,enough赋值为False,下面的if条件无法运行,while循环继续进行,fish数量加一
            else:
                enough = False
                break
        if enough:
            print(f'总共有{fish}条鱼')
            break
        fish += 1
        
# if __name__ == '__main__':的作用是:只有在本程序中能执行,import到其它文件中不能执行
# 详细介绍请看https://blog.csdn.net/heqiang525/article/details/89879056
if __name__ == '__main__':
    main()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值