鱼C论坛

 找回密码
 立即注册
查看: 2213|回复: 5

[已解决]练习题目的不懂之处

[复制链接]
发表于 2022-9-18 16:20:47 | 显示全部楼层 |阅读模式
18鱼币
本帖最后由 霞明玉映 于 2022-9-18 16:22 编辑

题目:角谷猜想的内容是:任意给定一个正整数,若它为偶数则除以 2,若它为奇数则乘以 3 再加 1,得到一个新的自然数,按照这样的方法计算下去,最终的结果必将是 1。比如给定的自然数是 5,则 5 * 3 + 1 = 16 -> 16 / 2 = 8 -> 8 / 2 = 4 -> 4 / 2 = 2 -> 2 / 2 = 1。
现在要求大家编写一个验证角谷猜想的程序



①n为变量 ,int是可以变为整数,input是用户输入数值
②while循环 n大于0,如果n余(%)2相等于0,就打印n本身的数值,“/2= ”的意思是什么哦,是n/2的值吗?n//2,是n地板除以2,sep=' '是以空格分隔2个数字
问题来了,若它为偶数则除以 2,只需要一个数值,为什么还要/2,n//2的操作?

③n = n//2,为什么还要操作多一步

④print(n, "*3+1 = ", n * 3 + 1, sep='')中"*3+1 = "是因为n等于奇数才会被执行这一个公式吗?为什么还要在后面接一个n * 3 + 1

⑤n = n * 3 + 1是打印上面的条件得出n,再来 n * 3 + 1的吗?

⑥如果n等于1就利用break退出循环,如果不等于1继续while循环
最佳答案
2022-9-18 16:20:48
本帖最后由 ZhKQYu 于 2022-9-18 17:30 编辑

对于问题二,python对于除法操作,不论是否可以整除,其结果都为浮点型,而地板除的意思是让除法之后的结果为整数,还有就是print里面的"n/2"就是去打印这三个字符,而不是真正做了除法
对于问题三,在问题二里的n // 2虽然做了除法,但是n却没有被更新,也就是说,n还是原来的n,并没有被重新赋值,因此才需要再去运行一次n = n // 2
对于问题四,当然是n为奇数才会执行,因为上面的if条件是偶数执行if里的语句,如果不是偶数就执行else里面的语句,而且"*3+1=",这个东西仅仅是一个字符串,并不是表达式
对于问题五,和问题3一样,不再赘述
对于问题六,因为你输入的n肯定是大于零的,在经过了一系列操作之后,一定还是大于零的,唯一的出口就是n==1,当然会一直执行,知道n在某一次操作之后更新为1

  1. n = int(input("请输入一个正整数 : "))

  2. while n != 1 and n > 0:
  3.     print(n, "/ 2 =", n := n // 2, sep=" ") if n % 2 == 0 else print(n, "* 3 + 1 = ", n := n*3+1, sep=" ")
复制代码
cc.jpg

最佳答案

查看完整内容

对于问题二,python对于除法操作,不论是否可以整除,其结果都为浮点型,而地板除的意思是让除法之后的结果为整数,还有就是print里面的"n/2"就是去打印这三个字符,而不是真正做了除法 对于问题三,在问题二里的n // 2虽然做了除法,但是n却没有被更新,也就是说,n还是原来的n,并没有被重新赋值,因此才需要再去运行一次n = n // 2 对于问题四,当然是n为奇数才会执行,因为上面的if条件是偶数执行if里的语句,如果不是偶数就 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-18 16:20:48 | 显示全部楼层    本楼为最佳答案   
本帖最后由 ZhKQYu 于 2022-9-18 17:30 编辑

对于问题二,python对于除法操作,不论是否可以整除,其结果都为浮点型,而地板除的意思是让除法之后的结果为整数,还有就是print里面的"n/2"就是去打印这三个字符,而不是真正做了除法
对于问题三,在问题二里的n // 2虽然做了除法,但是n却没有被更新,也就是说,n还是原来的n,并没有被重新赋值,因此才需要再去运行一次n = n // 2
对于问题四,当然是n为奇数才会执行,因为上面的if条件是偶数执行if里的语句,如果不是偶数就执行else里面的语句,而且"*3+1=",这个东西仅仅是一个字符串,并不是表达式
对于问题五,和问题3一样,不再赘述
对于问题六,因为你输入的n肯定是大于零的,在经过了一系列操作之后,一定还是大于零的,唯一的出口就是n==1,当然会一直执行,知道n在某一次操作之后更新为1

  1. n = int(input("请输入一个正整数 : "))

  2. while n != 1 and n > 0:
  3.     print(n, "/ 2 =", n := n // 2, sep=" ") if n % 2 == 0 else print(n, "* 3 + 1 = ", n := n*3+1, sep=" ")
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-19 15:33:51 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-19 15:36 编辑
  1. def foo(n):
  2.     if n > 1:
  3.         return foo(n // 2) if n % 2 == 0 else foo(n * 3 + 1)
  4.     else:
  5.         return n
  6. x = foo(int(input('输入一个正整数:')))
  7. print('Bingo .') if x == 1 else print('Failure .')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-19 16:26:52 | 显示全部楼层
  1. s = int(input())

  2. while s != 1:   #↑直接跳输出end
  3.     #判断基偶
  4.     if s % 2 == 0:
  5.         k = s // 2
  6.         print(str(s)+'/'+'2='+ str(k))
  7.         s = s // 2
  8.     else:
  9.         k = s*3+1
  10.         print(str(s)+'*3+1='+str(k))
  11.         s = s *3+1
  12. print('End')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-19 20:43:46 | 显示全部楼层
ZhKQYu 发表于 2022-9-18 17:22
对于问题二,python对于除法操作,不论是否可以整除,其结果都为浮点型,而地板除的意思是让除法之后的结果 ...

对于问题二,python对于除法操作,不论是否可以整除,其结果都为浮点型,而地板除的意思是让除法之后的结果为整数,还有就是print里面的"n/2"就是去打印这三个字符,而不是真正做了除法

我这里可不可以用int让数字变成整数,这样就不需要用“/2= ,n//2”,可以吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-19 22:54:38 | 显示全部楼层
霞明玉映 发表于 2022-9-19 20:43
对于问题二,python对于除法操作,不论是否可以整除,其结果都为浮点型,而地板除的意思是让除法之后的结 ...

当然可以了,做数据类型转化也是可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 04:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表