题目
- 输入一个3位整型数并提示“请输入一个3位数(类型为整型):”;
- 用if语句判断,如果这个数是520,则输出“I 520 China”;
- 如果这个数比520小则利用for循环语句打印出该3位数以内所有的“水仙花数”。“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如,153 是一个“水仙花数”,因为“153=13+53+33”。;
- 否则对其进行因式分解。例如,10=2*5,60=2*2*3*5。若无法因式分解,则直接输出“※ Surprise ※”。
做题
注意:
- 在Python里
#
为注释符号,在#
后面的内容都不会被计算机运行,在下面解析里的代码框会频繁用到注释以进行讲解,以及每一小节新增的代码也会在旁进行注释标注! 拥有这种文字样式的语句
通常为代码- 我认为部分需要特别关注的内容会进行 加粗!
- 在部分小节的解析下面会有 这种样式文字的句子 为解析的补充讲解,可能字有点小,但为了做出差异化请谅解
- 每完成一小节可以尝试运行一下代码,比如完成了 ②if判断 小节可以尝试运行一下看看运行结果
- 为了阅读方便,编写的解析内容在代码下面
①输入整数
- 输入一个3位整型数并提示“请输入一个3位数(类型为整型):”;
s5 = int(input("请输入一个3位数整数:"))
在开头定义一个 自变量s5 并用 int 转换为 整数
- 输入一个3位整型数并提示“请输入一个3位数(类型为整型):”;
本小节任务完成了哦,但是先不用运行,因为没有内容被输出捏~
②if判断
- 用if语句判断,如果这个数是520,则输出“I 520 China”
s5 = int(input("请输入一个3位数整数:"))
if s5 == 520 : #使用if判断自变量s5
print("I 520 China") #打印 I 520 China
使用if判断 自变量s5 if s5 == 520 :
,如果输入的数等于520则打印 I 520 China print("I 520 China")
- 用if语句判断,如果这个数是520,则输出“I 520 China”;
本小节任务完成了哦,可以 运行一下代码 看看运行结果捏~
③计算水仙花数
- 如果这个数比520小则利用for循环语句打印出该3位数以内所有的“水仙花数”。
“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如,153 是一个“水仙花数”,因为“153=13+53+33”。;
s5 = int(input("请输入一个3位数整数:"))
if s5 == 520 :
print("I 520 China")
elif s5 < 520 : #使用elif判断自变量s5
for i5 in range(100,s5+1): #使用整数序列进行for循环
使用elif判断 自变量s5 是否小于520 elif s5 < 520 :
,如果小于则进行for循环。
在for循环中定义一个 自变量i5 并使用 整数序列range 确定赋值与循环范围 range(开始数,结束数,步长)
这里用不到步长 ,然后水仙花数是指一个 三位数 所以开始数为 100 ,因为是求 自变量s5 前面的水仙花数,所以结束数为 自变量s5,又因为range的结束数只能取到 本身的前一位 ,为了让 自变量s5 本身参与运算所以结束数要写成 s5+1 ,即为range(100,s5+1)
如果if判断为False(判断成功则为True,失败则为False)则轮到elif判断,如果elif也为False则轮到else执行。elif与else为可选项目,选择需要的使用即可
s5 = int(input("请输入一个3位数整数:"))
if s5 == 520 :
print("I 520 China")
elif s5 < 520 :
for i5 in range(100,s5+1):
#↓计算并判断是否为水仙花数
if (i5//100)**3+(i5//10%10)**3+(i5%10)**3==i5 :
print("找到一个水仙花数:",i5) #如果是则输出这个数
将 自变量s5 的三位数分别单独取出来,使用 取模运算 % 进行提取
取百位时直接除以100得到一个带小数的百位例如3.21,使用 整数除 // 或是用 int() 将算式套起来能得到不带小数的百位。 i5//100
取十位时先 整除10 再 取10的模 即可。 i5//10%10
取个位直接 取10的模 即可。 i5%10
取个十百位数的式子都写出来后再 立方3 一下。乘方运算符为 ** ,立方则写做 **3
再将三个式子相加,(i5//100)**3
+ (i5//10%10)**3
+ (i5%10)**3
再进行if判断是否等于 自变量s5 ,如果是则输出这个数 print("找到一个水仙花数:",i5)
- “水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如,153 是一个“水仙花数”,因为“153=13+53+33”。;
- 取模运算可简单理解为求余数,例如32取10的模就是2,数学算式为:32÷10=3······2
- 通过整除和int()的形式将浮点数转换为整数不会进行四舍五入,使用int转整数再立方的写法为:int(i5/100)**3
- 如果这个数比520小则利用for循环语句打印出该3位数以内所有的“水仙花数”。
本小节任务完成了哦,可以 运行一下代码 看看运行结果捏~
④因式分解
- 否则对其进行因式分解。例如,10=2*5,60=2*2*3*5。
- 若无法因式分解,则直接输出“※ Surprise ※”。
s5 = int(input("请输入一个3位数整数:"))
if s5 == 520 :
print("I 520 China")
elif s5 < 520 :
for i5 in range(100,s5+1):
if (i5//100)**3+(i5//10%10)**3+(i5%10)**3==i5 :
print("找到一个水仙花数:",i5)
else: #else不是判断语句,是前面的if都没有判断成功后才执行的语句,可不写,不写则不执行
d = 2 #用于因式分解的除数
ss5 = s5 #用于因式分解的被除数
如果这个数既不等于520也不小于520则认为这个数大于520,可以用else来执行在if和elif都没有判断成功(True)后的代码
定义两个自变量,一个为 d 并赋值2,用于因式分解的 除数 ;一个为 ss5 ,将 s5 的值赋值给 ss5 用于因式分解计算的 被除数
else不是判断语句,是前面的if都没有判断成功后才执行的语句,如果不写则不执行
s5 = int(input("请输入一个3位数整数:"))
if s5 == 520 :
print("I 520 China")
elif s5 < 520 :
for i5 in range(100,s5+1):
if (i5//100)**3+(i5//10%10)**3+(i5%10)**3==i5 :
print("找到一个水仙花数:",i5)
else:
d = 2
ss5 = s5
while ss5 > 1 : #因式分解整数通常从数字2开始
if ss5%d==0 : #因式分解判断
print(d) #打印能整除的除数d
ss5/=d #调整数值以进行下一轮分解
else: #分解失败
d+=1 #将除数+1
使用 while循环 进行因式分解,因式分解整数通常从数字2开始,所以while循环判断条件写 ss5 > 1
在循环里写一个if开始判断是否能被因式分解,因式分解从最小的素数开始除,也就是前面赋值2的 自变量d
- 使用 取模 求余数并判断是否能被整除(等于0)
if ss5%d==0 :
,如果能整除(没有余数)则代表成功因式分解了一次,因此在if判断成功后打印 除数dprint(d)
并将 ss5 除以 d 的数赋值给 ss5 本身ss5/=d
以进行下一次因式分解。 - 如果不能整除则代表当前 除数d 可能太小,使用else执行将 除数d 本身 自增 1个数
d+=1
好进行下一次因式分解的计算判断。
- while循环为判断时结果为True才执行 本次循环 ,否则则结束循环
- 因式分解整数通常从数字2开始。这是因为2是最小的素数,同时素数无法被因式分解
- 请注意, 整除不是整数除 ,别看错了!
- ss5/=d 为 ss5=ss5/d的简写;d+=1也一样是d=d+1的简写,同时也可以说是d自增1个数
在做格式化文本前你也可以尝试 运行一下代码 看看 没有格式化文本 的情况下运行的结果是什么哦~
s5 = int(input("请输入一个3位数整数:"))
if s5 == 520 :
print("I 520 China")
elif s5 < 520 :
for i5 in range(100,s5+1):
if (i5//100)**3+(i5//10%10)**3+(i5%10)**3==i5 :
print("找到一个水仙花数:",i5)
else:
d = 2
ss5 = s5
d2 = 0 #用于辅助格式化文本
while ss5 > 1 :
if ss5%d==0 :
d2+=1 #因式分解成功后自增1个数用于计数
#print(d) 请注意我被删掉了哦~
if d2==1 : #判断是不是第一个因式分解出的数
print(s5,end="=") #打印自变量s5和等号(=)
print(d,end="") #打印可以整除自变量s5的 除数d
ss5/=d
else:
d+=1
- 否则对其进行因式分解。例如,10=2*5,60=2*2*3*5。
格式化一下文本,使其符合题意
在while循环前新定义一个 自变量d2 用于计数以辅助格式化文本
在判断因式分解 成功 的执行语句里让 d2 自增1个数并删除原先的 print(d)
if判断 d2 是否为1 if d2==1 :
,如果为1则代表这是第一个因式分解出的数,先打印出你输入的数 自变量s5 ,再自定义 结束语句 end=""
将 等号(=) 打印到 自变量s5 的后面 print(s5,end="=")
打印完 自变量s5 和 等号(=) 后再打印可以整除自变量s5的 除数d ,结束语留空以让下一句print 不换行 print(d,end="")
- 在print()里,使用end=""可以自定义结束语句,默认是换行,你可以自定义后不写,这样print后下一句print输出的内容就不会换行啦
- 为什么不使用print(s5,"=",d,end="")来输出s5=d而是使用两个print?因为我实践发现使用一条语句时在用
,
隔开的地方在输出时会有空格
s5 = int(input("请输入一个3位数整数:"))
if s5 == 520 :
print("I 520 China")
elif s5 < 520 :
for i5 in range(100,s5+1):
if (i5//100)**3+(i5//10%10)**3+(i5%10)**3==i5 :
print("找到一个水仙花数:",i5)
else:
d = 2
ss5 = s5
d2 = 0
while ss5 > 1 :
if ss5%d==0 :
d2+=1
if d2==1 :
print(s5,end="=")
print(d,end="")
else: #如果不是第一个因式分解出的数则按另一种格式输出
print("x",end="") #打印英文字母 **x**
print(d,end="") #打印可以整除自变量s5的 除数d
ss5/=d
else:
d+=1
如果不是第一个因式分解出的数则按另一种格式输出,使用给if兜底的else进行输出
为了美观选择用英文字母 x 来代替电脑上的 乘号(*) 进行打印,然后和上一步一样结束语留空 print("x",end="")
打印完 x 后再打印可以整除自变量s5的 除数d ,结束语留空 print(d,end="")
- 否则对其进行因式分解。例如,10=2*5,60=2*2*3*5。
在做无法因式分解的输出前你也可以尝试 运行一下代码 看看你刚刚格式化完的文本运行的结果是样的~
s5 = int(input("请输入一个3位数整数:"))
if s5 == 520 :
print("I 520 China")
elif s5 < 520 :
for i5 in range(100,s5+1):
if (i5//100)**3+(i5//10%10)**3+(i5%10)**3==i5 :
print("找到一个水仙花数:",i5)
else:
d = 2
ss5 = s5
d2 = 0
while ss5 > 1 :
if ss5%d==0 :
d2+=1
if d==s5 : #不能被因式分解的if判断
print("※ Surprise ※") #打印 ※ Surprise ※
break #结束循环,要去掉这行必须修改下一行
elif d2==1 : #这里根据上一行的代码按需修改,原代码为 if d2==1 :
print(s5,end="=")
print(d,end="")
else:
print("x",end="")
print(d,end="")
ss5/=d
else:
d+=1
- 若无法因式分解,则直接输出“※ Surprise ※”。
因为也有无法因式分解的情况呢,你可以在做因式分解前做一个素数的判断来完成这一部分,但是我这里直接加一个判断也可以完成哦~
在输出你刚刚做完的格式化文本前加一个判断,判断 除数d 是否与 自变量s5 相等,如果相等代表这个数只能被本身整除,则 无法 被因式分解,所以打印 ※ Surprise ※ 并使用 break 直接结束循环
- 如果不使用break结束循环且未修改下一行的if判断为elif则会在输出时多输出下一个if判断的内容,因为前面给辅助格式化文本的自变量d2自增了一个数
- 如果你打印出来的※ Surprise ※是这样的※Surprise ※那就在第一个※后面加一个空格,例如※(空格)(空格)Surprise(空格)※,括号和空格是直观告诉你这里有一个空格,别犯蠢哦
恭喜你完成了所有小节, 运行一下代码 看看运行结果吧~
下面有不含注释的完整代码供你复盘哦~
- 否则对其进行因式分解。例如,10=2*5,60=2*2*3*5。
- 若无法因式分解,则直接输出“※ Surprise ※”。
完成
s5 = int(input("请输入一个3位数整数:"))
if s5 == 520 :
print("I 520 China")
elif s5 < 520 :
for i5 in range(100,s5+1):
if (i5//100)**3+(i5//10%10)**3+(i5%10)**3==i5 :
print("找到一个水仙花数:",i5)
else:
d = 2
ss5 = s5
d2 = 0
while ss5 > 1 :
if ss5%d==0 :
d2+=1
if d==s5 :
print("※ Surprise ※")
elif d2==1 :
print(s5,end="=")
print(d,end="")
else:
print("x",end="")
print(d,end="")
ss5/=d
else:
d+=1