Python入门学习小记:100以内素数/质数之和

今天做到一题利用for循环求100以内素数之和的题目,发现自己在Python的语法上遇到了问题:这个else是谁的?在此记录以防下次又做错啦。

题目很简单:
100以内素数之和
求100以内所有素数之和并输出。 ‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

素数指从大于1,且仅能被1和自己整除的整数。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
可以逐一判断100以内每个数是否为素数,然后求和。

一开始我的程序是这样的:

    sum = 0
    for i in range(2,100):#寻找的范围为2-99
        for j in range(2,i):
            if (i%j == 0):
                break
            else:
                sum += i
    print(sum)

然而输出时sum却等于66705!
这明显不对呀!
为了初步排查我找到的素数是否有问题,修改了一下程序

sum = 0
for i in range(2,100):#寻找的范围为2-99
    for j in range(2,i):
        if (i%j == 0):
            break
        else:
            print(i)
            #sum += i
#print(sum)

果然输出的素数是有问题的。查看结果发现找到的素数出现了多次输出甚至输出非素数的情况,加起来当然比正确答案大的多啦。

可是为什么会出现这样的错误呢?

复习一下:
break语句:用于跳出最内层的for或while循环,即一个break语句只有能力跳出当前层次的一个循环。跳出这个循环后从这个循环后面的代码继续执行。
if-else二分支:如果满足if后的条件,就执行冒号后面的语句;否则执行else冒号后面的语句。二分支结构用于区分对if后条件的两种可能,满足条件即True,不满足条件即False,以此分别形成执行路径。

所以,在上面这个程序中,双层for嵌套后利用了一个if-else二分支。如果满足条件:i对j取余数为零(i

再复习一下:
for in-else语句:遍历在in后面的遍历结构,当for循环正常遍历了所有内容或由于条件不成立而结束循环,且没有因为break或return而跳出循环时,才执行else后面的语句。

这里的“else”是for的,还是if的?显然,应该是for的。只有遍历全部j后依然除不尽的才能够认为i为素数并输出。写程序时太粗心写错了else的位置;对于Python语法的不熟练没能透彻的结合题目的意思。意识到问题所在,修改程序

sum = 0
for i in range(2,100):
    for j in range(2,i):
        if (i%j == 0):
            break
    else:
        sum += i
print(sum)

输出sum=1060,是正确答案!

你可能感兴趣的:(Python)