Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找x素数w/For循环的Python代码?_Python_Loops_For Loop_Nested_Primes - Fatal编程技术网

查找x素数w/For循环的Python代码?

查找x素数w/For循环的Python代码?,python,loops,for-loop,nested,primes,Python,Loops,For Loop,Nested,Primes,我正在尝试编写一个简单的程序,可以计算出n个素数。我想通过使用一个嵌套的for循环来实现这一点,其中一个循环遍历数字,另一个循环将该数字除以所有的数字,看看它是否可以被任何东西整除 我遇到的问题是,在主for循环中,我需要从2开始,因为1会搞乱系统,我不希望它被视为素数。然而,为了使循环有一个起始编号,它还需要一个结束编号,这在本例中很困难,因为在循环工作之前很难生成所需的最大素数 这是我现在正在使用的程序。我标记X的地方是我需要以某种方式为for循环输入一个结束号的地方。我想如果我让For循环

我正在尝试编写一个简单的程序,可以计算出n个素数。我想通过使用一个嵌套的for循环来实现这一点,其中一个循环遍历数字,另一个循环将该数字除以所有的数字,看看它是否可以被任何东西整除

我遇到的问题是,在主for循环中,我需要从2开始,因为1会搞乱系统,我不希望它被视为素数。然而,为了使循环有一个起始编号,它还需要一个结束编号,这在本例中很困难,因为在循环工作之前很难生成所需的最大素数

这是我现在正在使用的程序。我标记X的地方是我需要以某种方式为for循环输入一个结束号的地方。我想如果我让For循环完全打开,简单地去掉“1”在循环中产生的任何东西,会简单得多,但这感觉像作弊,我想做得对

check = 0
limit = int(input("Enter the amount of Prime Numbers"))
for i in range(2,X):
    check = 0
    if i > 1:
        for j in range(2,i):
            if (i % j) == 0:
                check = 1
    if check == 0:
        print (i)

谢谢你的帮助

您可以使用生成器对象单步遍历无限数量的数字

在代码顶部附近插入以下内容:

def infinite_number_generator(initial_value=2):
    """ Generates an infinite amount of numbers """
    i = initial_value
    while True:
        yield i
        i += 1
这样做的目的是创建一个函数,用于构造生成器对象,每当它们到达
yield
语句时“暂停”,以“产生”由
yield
命令指定的任何值,然后从
yield
语句下面的下一行继续执行

Python自己的
range
函数本身就是生成器的一个示例,大致相当于(忽略step参数和其他特性)


我还应该指出,您提供的代码有缺陷-它永远不会停止打印,因为无法检查您是否找到了
限制的素数。

这应该满足您的需要

check = 0
limit = int(input("Enter the amount of Prime Numbers"))
counter = 0
i = 2
while counter < limit:
    check = 0
    if i > 1:
        for j in range(2,i):
            if (i % j) == 0:
                check = 1
    if check == 0:
        counter += 1
        print (i)

    i += 1
check=0
limit=int(输入(“输入素数的数量”))
计数器=0
i=2
当计数器<限制时:
检查=0
如果i>1:
对于范围(2,i)内的j:
如果(i%j)==0:
检查=1
如果检查==0:
计数器+=1
印刷品(一)
i+=1

在代码中,以2开始
i
,并始终递增1,因此
i
将始终保持大于1,因此如果i>1,则测试
无效。
为了提高效率,您可以在i或i/2的平方处停止检查(在[i/2+1,i[]中没有除数)。
您可以按如下方式更新代码:

n = int(input("Enter the amount of Prime Numbers: "))
FoundPrimes = 0
i = 2
while FoundPrimes < n:
    isPrime = True
    for j in range(2,1 + i//2):
        if (i % j) == 0:
            isPrime = False
    if isPrime:
        FoundPrimes += 1
        print(i, end = '\t')
    i += 1
n=int(输入(“输入素数的数量:”)
FoundPrimes=0
i=2
当FoundPrimes
有没有一个特定的原因让你不使用类似于埃拉托斯烯筛的方法来获得素数?每个索引的内部运行效率都很低。目前你无法知道到目前为止已经生成了多少个。一旦你做到了这一点,应该很清楚你的结束条件是什么。注意:使用while循环instfor循环的ead不是“作弊”,因为如果你在开始循环之前知道你想数到多少,那么就要使用for循环。(如果你在问题中称之为“作弊”)不,这不是我所说的作弊,我指的是,如果数字是1,忽略它就是作弊,这可以工作,让for循环打开,而不是在一个边界内。嗨,这段代码是一个稍微修改过的代码版本,可以找到我想要编辑的某个数字以下的所有素数r这个新的用途。我试图修改您提出的代码,以便可以使用它,但是因为函数在for循环之外,它一直单独继续到prime生成器,这意味着它不会只打印prime。到目前为止,我还找不到一种方法来绕过这个问题,而不将所有内容从循环转移到fu中我想避免的操作。有什么想法吗?当你将倒数第二行的
check==0:
更改为
check==1:
?:)编辑:没关系,这不是问题。代码似乎只打印素数给我。虽然它们是一个错误,变量名中有空格,但我现在已经修复了。好的,我已经管理好了ed编辑代码以满足我的需要。这只是通过创建一个名为amount的变量来完成的,该变量在每次打印质数时都会增长,然后将其添加到while循环中,这样该数字就不会超过限制。简单的哈哈。感谢您的帮助!我也很喜欢看到这样的内容:PThat工作正常!谢谢。我认为这可能是一个问题如果您使用前一个素数的平方作为边界,那么后面的数字最终会大于它吗?您必须使用当前数字的平方来检查前一个:
对于范围(2,1+i**0.5)内的j
check = 0
limit = int(input("Enter the amount of Prime Numbers"))
counter = 0
i = 2
while counter < limit:
    check = 0
    if i > 1:
        for j in range(2,i):
            if (i % j) == 0:
                check = 1
    if check == 0:
        counter += 1
        print (i)

    i += 1
n = int(input("Enter the amount of Prime Numbers: "))
FoundPrimes = 0
i = 2
while FoundPrimes < n:
    isPrime = True
    for j in range(2,1 + i//2):
        if (i % j) == 0:
            isPrime = False
    if isPrime:
        FoundPrimes += 1
        print(i, end = '\t')
    i += 1