Francis7023 发表于 2023-6-5 16:55:04

python作业提问

第一个问题:第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是起什么作用?谢谢

isdkz 发表于 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:这一句的作用是比较计算出的每位数字的立方和与原数是否相等。如果相等,就打印这个数,说明它是水仙花数。

sfqxx 发表于 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语句则是判断是否为水仙花数,并将符合条件的数字进行输出。

希望能够帮到您!

求最佳答案{:10_254:}

Francis7023 发表于 2023-6-7 11:53:27

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

temp //= 10是得出了倒数第二位,但是 为什么不算 temp //10的三次方?第一位数的三次方呢?

isdkz 发表于 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 操作,使得下一位数字变成新的最后一位数字,以供下一轮循环处理。
页: [1]
查看完整版本: python作业提问