鱼C论坛

 找回密码
 立即注册
查看: 2275|回复: 4

python作业提问

[复制链接]
发表于 2023-6-5 16:55:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
第一个问题:第14讲课后作业最后一题,根据利润算奖金,为什么用浮点数不用decimal函数?
第二个问题:第18讲动动手第一题,算100~999 之间的所有水仙花数

for i in range(100, 1000):
    sum = 0
    temp = i
   
    while temp:
        sum = sum + (temp % 10) ** 3
        temp //= 10
   
    if sum == i:
        print(i)

到 temp //= 10这一步,不是只得到了倒数第二位吗,算3次方和第一位的3次方呢?没理解这里。然后 while if是起什么作用?谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-5 16:57:18 | 显示全部楼层
第一个问题:在处理金钱或者需要很精确小数位的数字时,通常推荐使用  decimal  类型而不是  float  类型,因为  float  类型可能会因为精度问题导致出现一些不准确的情况。但在一些简单的数学计算中,使用  float  类型一般也足够了。也可能是因为  decimal  类型需要额外的导入步骤,并且在处理数学运算时比  float  类型稍微复杂一些。总的来说,这取决于你的需求,有时使用  float  更方便,有时使用  decimal  更精确。

第二个问题:这是一个关于找出所有水仙花数的问题。水仙花数也被称为阿姆斯特朗数,它是一个三位数,该数字每个位上数字的立方之和正好等于它本身。

你提供的代码将一个数从个位数开始,依次取出每个位的数字,计算该数字的立方,并将所有立方的和与原数进行比较。如果两者相等,则这个数就是水仙花数。

在代码中:

·  temp % 10  是用来获取数字的最后一位。
·  (temp % 10) ** 3  是将取得的最后一位数字立方。
·  sum = sum + (temp % 10) ** 3  是将每一位数字的立方和加在一起。
·  temp //= 10  是将数字除以 10,然后去掉小数部分,这样就可以去掉最后一位,相当于数字向右移动一位。
·  while temp:  这个循环将会持续进行,直到  temp  为0(即所有的位都被计算过了)。

所以,每次循环都会取出一位数字,并计算其立方和,最后比较所有立方和与原数是否相等,来确定是否是水仙花数。

if sum == i:  这一句的作用是比较计算出的每位数字的立方和与原数是否相等。如果相等,就打印这个数,说明它是水仙花数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-5 17:37:42 | 显示全部楼层
本帖最后由 sfqxx 于 2023-6-5 17:57 编辑

对于第一个问题,使用浮点数进行计算的原因是,课后作业中所涉及的数值范围都比较小,而且精度要求不是非常高,用浮点数已经足够满足需求了。decimal模块主要是用来高精度地处理十进制数的,如果没有必要,使用浮点数也能够满足我们的需求,而且更加简便。

对于第二个问题,当temp //= 10这一步执行时,是将temp的数值从末尾去掉了一位,例如,当temp的值为123时,执行完temp //= 10之后,temp的值变为了12,也就是说,此时得到了原数字的倒数第二位,接下来在while循环中,通过对最后一位进行操作,继续得到了该数字的每一位。例如,当i的值为153时,首先算出1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153,满足条件,于是将其打印出来。

在本段代码中,while循环起到了计算该数字的每一位的作用,而if语句则是判断是否为水仙花数,并将符合条件的数字进行输出。

希望能够帮到您!

求最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-7 11:53:27 | 显示全部楼层
isdkz 发表于 2023-6-5 16:57
第一个问题:在处理金钱或者需要很精确小数位的数字时,通常推荐使用  decimal  类型而不是  float  类型, ...

temp //= 10是得出了倒数第二位,但是 为什么不算 temp //10的三次方?第一位数的三次方呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-7 12:03:40 | 显示全部楼层
Francis7023 发表于 2023-6-7 11:53
temp //= 10是得出了倒数第二位,但是 为什么不算 temp //10的三次方?第一位数的三次方呢?

这段代码会重复进行 temp //= 10 这个操作,而且在每次操作之前,都会先计算最后一位数字的立方(temp % 10) ** 3)并加到 sum 中。通过 temp //= 10 操作,原来的倒数第二位数字会变成新的最后一位数字,原来的第一位数字会变成新的倒数第二位数字,等等。这样,在几轮操作后,所有的位都会被依次处理到。

例如,对于数字 153:

1. 初始时,temp = 153,temp % 10 的结果为 3,计算3的立方并加到 sum 中。
2. 执行 temp //= 10 后,temp 变为 15。
3. 下一轮循环,temp % 10 的结果为 5,计算5的立方并加到 sum 中。
4. 再次执行 temp //= 10 后,temp 变为 1。
5. 最后一轮循环,temp % 10 的结果为 1,计算1的立方并加到 sum 中。
6. 再次执行 temp //= 10 后,temp 变为 0,这时所有的位都处理完了,跳出循环。

所以,这段代码其实是处理了每一位数字的立方,并把他们加起来。在每轮循环中,都是处理当前最后一位数字的立方,然后通过 temp //= 10 操作,使得下一位数字变成新的最后一位数字,以供下一轮循环处理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 11:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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