【问题标题】:Printing prime number in python在python中打印素数
【发布时间】:2018-11-27 01:31:04
【问题描述】:

我正在尝试在 python 中打印 3-50 范围内的素数。代码如下:

for i in range(3,51):
flag=0
    for j in range(3,i):
        if(i%j==0):
            flag=1
    if(flag==0):
        print(i)

代码运行正常,除了 THAT IS ALSO PRINTING 4. 请告知代码逻辑是否有问题(忽略效率问题)。

【问题讨论】:

  • 对于i=4,您在(2,2) 范围内运行j,这是一个空范围。如果你把端点加一,你会发现一个因数。
  • 按照@khelwood 的建议,将for j in range(2,int(i/2)) 行更改为for j in range(2,int(i/2)+1) 它应该可以工作
  • 请检查编辑后的版本,它仍然给我 4 作为输出
  • 我说增加端点。我没有说增加起点。如果你从 3 开始你的范围,你仍然错过了 2。
  • 如果我从 3 开始 j 有什么问题?请参考之前错误发布的代码编辑版本...

标签: python loops logic


【解决方案1】:
print(2)
for i in range(3,51):
    flag=0
    for j in range(2,int(i/2)):
        if(i%j==0):
            flag=1
    if(flag==0):
    print(i)

当 i = 4 时,范围将是 range(2,2),即 0。它不会进入 if(i%j == 0): 块。因此,当 i = 4 时,您的标志始终为 0。

解决它的一种方法是添加一个检查 i 是否为 4。

if(flag==0 and i != 4):

编辑:正如其他人评论的那样,将范围增加 1 比检查值是否为 4 更好。

for j in range(2,int(i/2)+1)

【讨论】:

    【解决方案2】:

    range(3,i) 更改为range(2,i),因为如果我们使用range(3,i),则不检查4 除以2。因此,4 作为质数返回。

    for i in range(3,51):
        flag=0
        for j in range(2,i):
            if(i%j==0):
                flag=1
        if(flag==0):
            print(i)
    

    但是,更结构化和更有效的方法是使用以下内容:-

    def isPrime(num):
        for i in range(2,num/2+1):
            if (num%i==0):
                return False
        return True
    
    for i in range(3,51):
        if isPrime(i):
            print i
    

    我们不需要检查所有数字的除法,直到数字本身是否为素数。因为如果我们可以检查到给定数字的一半只是为了提高效率。

    【讨论】:

      【解决方案3】:
      start = 3
      end = 50
      
      for val in range(start, end + 1): 
      
      # If num is divisible by any number   
      # between 2 and val, it is not prime  
      if val > 1: 
         for n in range(2, val): 
             if (val % n) == 0: 
                 break
         else: 
             print(val) 
      

      【讨论】:

        【解决方案4】:
        a = int(input("enter smaller no."))
        b = int(input("enter larger no."))
        for i in range (a,b+1):
            if  i>1:
                for c in range(2,i):
                    if i%c == 0:
                        break
                else:
                    print(i)
        

        在上面的代码中,我们运行了一个从最小值到最大值的 for 循环,并将值存储在 i 中

        for i in range (a,b+1):
        

        然后我们检查存储在 i 中的数字是否大于 1,因为所有数字都可以被 1 整除,我们不想考虑它。

         if  i>1:
        

        在此之后我们运行另一个循环,这次从 i 中存储的数字减少 2 到 1

        for c in range(2,i):
        

        现在我们检查存储在 i 中的数字是否可以被任何比自身小 2 到 1 的数字整除。

        if i%c == 0:
        

        如果是,那么显然它不是质数,我们打破循环。

        break
        

        如果没有,我们打印数字。

        else:
            print(i)
        

        【讨论】:

          【解决方案5】:

          对于 4,它可能不会进入 if 循环。所以我增加了 i 的范围。

          print(2)
          for i in range(3,51):
              flag=0
              for j in range(2,int(i/2)+1):
                  if(i%j==0):
                      flag=1
              if(flag==0):
                  print(i)
          

          【讨论】:

            【解决方案6】:
            for i in range(3,51):
                flag=0
                for j in range(2,i):
                    if(i%j==0):
                        flag=1
                if(flag==0):
                    print(i)
            

            这打印 3 5 7 11 13 17 19 23 29 31 37 41 43 47

            4%2 = 0

            4%3 = 1

            所以如果你从 3 开始,你会错过 4%2 = 0

            【讨论】:

            • 您能告诉我将范围更改为 (2,i) 有什么不同吗?
            • 因为你想在你的 i%j 方程中有 2。 4%2 = 0 4%3 = 1
            【解决方案7】:

            如果你的列表有更大的数字,你应该改变

            range(2,int(i/2)+1)
            

            range(2,math.floor(math.sqrt(n)+1))
            

            例如,400 将尝试直到 20 而不是 200 的数字。

            【讨论】:

              【解决方案8】:

              tryfor j in range(2,i):数字 4 可整除是 1,2,4 如果您从 3 开始并一直持续到 4 但不是 4 您找不到任何除数,这就是为什么它将 4 视为素数的原因

              【讨论】:

                【解决方案9】:
                import math
                for num in range(1,50):
                if num>1:
                    if num==2:
                        print(num)
                    elif num%2==0:
                        continue
                    else:
                        for i in range(3,math.ceil(math.sqrt(num)),2):
                            if num%i==0:
                                break
                        else:
                            print(num)
                

                它更有效,因为它避免了偶数并且还检查奇数除数直到数字的平方根,这比只检查给定数字的一半更有效

                【讨论】:

                  猜你喜欢
                  • 2012-07-22
                  • 1970-01-01
                  • 2021-04-02
                  • 2022-01-07
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多