题目

  1. 输入一个3位整型数并提示“请输入一个3位数(类型为整型):”;
  2. 用if语句判断,如果这个数是520,则输出“I 520 China”;
  3. 如果这个数比520小则利用for循环语句打印出该3位数以内所有的“水仙花数”。“水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如,153 是一个“水仙花数”,因为“153=13+53+33”。;
  4. 否则对其进行因式分解。例如,10=2*5,60=2*2*3*5。若无法因式分解,则直接输出“※ Surprise ※”。

做题

注意:

  1. 在Python里 # 为注释符号,在 # 后面的内容都不会被计算机运行,在下面解析里的代码框会频繁用到注释以进行讲解,以及每一小节新增的代码也会在旁进行注释标注!
  2. 拥有这种文字样式的语句 通常为代码
  3. 我认为部分需要特别关注的内容会进行 加粗!
  4. 在部分小节的解析下面会有 这种样式文字的句子 为解析的补充讲解,可能字有点小,但为了做出差异化请谅解
  5. 每完成一小节可以尝试运行一下代码,比如完成了 ②if判断 小节可以尝试运行一下看看运行结果
  6. 为了阅读方便,编写的解析内容在代码下面

①输入整数

  • 输入一个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)

  1. “水仙花数”是指一个三位数,其各位数字立方和等于该数本身。例如,153 是一个“水仙花数”,因为“153=13+53+33”。;
  2. 取模运算可简单理解为求余数,例如32取10的模就是2,数学算式为:32÷10=3······2
  3. 通过整除和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判断成功后打印 除数d print(d) 并将 ss5 除以 d 的数赋值给 ss5 本身 ss5/=d 以进行下一次因式分解。
  • 如果不能整除则代表当前 除数d 可能太小,使用else执行将 除数d 本身 自增 1个数 d+=1 好进行下一次因式分解的计算判断。
  1. while循环为判断时结果为True才执行 本次循环 ,否则则结束循环
  2. 因式分解整数通常从数字2开始。这是因为2是最小的素数,同时素数无法被因式分解
  3. 请注意, 整除不是整数除 ,别看错了!
  4. 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="")

  1. 在print()里,使用end=""可以自定义结束语句,默认是换行,你可以自定义后不写,这样print后下一句print输出的内容就不会换行啦
  2. 为什么不使用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 直接结束循环

  1. 如果不使用break结束循环且未修改下一行的if判断为elif则会在输出时多输出下一个if判断的内容,因为前面给辅助格式化文本的自变量d2自增了一个数
  2. 如果你打印出来的※ 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

一名既不Kirakira也不让人Dokidoki的普通人~