在python中生成素数时出错
我想打印从1到10的所有素数,但是当我运行程序时,什么都不会打印在python中生成素数时出错,python,primes,Python,Primes,我想打印从1到10的所有素数,但是当我运行程序时,什么都不会打印 c=0 nums = [] k=0 for a in range(1,11): for b in range(1,11): if a%b==0: c = c+1 if c==2: nums.append(a)
c=0
nums = []
k=0
for a in range(1,11):
for b in range(1,11):
if a%b==0:
c = c+1
if c==2:
nums.append(a)
k = k+1
for d in nums:
print nums[d]
我不明白你为什么用k 你的c应该在“a”循环中重置,在“b”循环中重置 代码如下:
nums = []
for a in range(1, 11):
c = 0
for b in range(1, 11):
if a % b == 0:
c = c + 1
if c == 2:
nums.append(a)
print nums
nums = []
k=0
for a in range(1,11):
c=0
for b in range(1,11):
if a%b==0:
c = c+1
if c == 2:
nums.append(a)
k = k+1
for d in nums:
print d
我不明白你为什么用k 你的c应该在“a”循环中重置,在“b”循环中重置 代码如下:
nums = []
for a in range(1, 11):
c = 0
for b in range(1, 11):
if a % b == 0:
c = c + 1
if c == 2:
nums.append(a)
print nums
nums = []
k=0
for a in range(1,11):
c=0
for b in range(1,11):
if a%b==0:
c = c+1
if c == 2:
nums.append(a)
k = k+1
for d in nums:
print d
试试这个:
nums = []
k=0
for a in range(2,11):
c=0
for b in range(1,11):
if a%b==0:
c = c+1
if c==2:
nums.append(a)
k = k+1
for d in nums:
print d
你会得到
2
3
5
7
请注意,代码可能更有效。请尝试以下操作:
nums = []
k=0
for a in range(2,11):
c=0
for b in range(1,11):
if a%b==0:
c = c+1
if c==2:
nums.append(a)
k = k+1
for d in nums:
print d
你会得到
2
3
5
7
请注意,代码可能更有效。您的代码有多个问题-每个素数都可以被1整除,因此您的检查将失败,您正在打印
nums[d]
,这是错误的,k
什么也不做,变量命名法太模糊,在for循环中有不必要的运行—不需要迭代范围内的所有b值,迭代现有的素数就足够了,依此类推
下面是我将如何写它
primes = [2]
upper_limit = 1000 #find all primes < 1000
for candidate in range(2, upper_limit):
can_be_prime = True
for prime in primes:
if candidate % prime == 0:
can_be_prime = False
break
if can_be_prime:
primes.append(candidate)
print primes
primes=[2]
上限=1000#查找所有小于1000的素数
对于范围(2,上限)内的候选人:
能不能是素数=真
对于素数中的素数:
如果候选%prime==0:
能不能是素数=假
打破
如果可以是素数:
素数。追加(候选)
打印素数
您的代码有多个问题-每个素数都可以被1整除,因此您的检查将失败,您正在打印nums[d]
,这是错误的,k
什么都不做,变量名称太模糊,您在for循环中有不必要的运行-您不需要对范围内的所有b值进行迭代,迭代已有的素数就足够了
下面是我将如何写它
primes = [2]
upper_limit = 1000 #find all primes < 1000
for candidate in range(2, upper_limit):
can_be_prime = True
for prime in primes:
if candidate % prime == 0:
can_be_prime = False
break
if can_be_prime:
primes.append(candidate)
print primes
primes=[2]
上限=1000#查找所有小于1000的素数
对于范围(2,上限)内的候选人:
能不能是素数=真
对于素数中的素数:
如果候选%prime==0:
能不能是素数=假
打破
如果可以是素数:
素数。追加(候选)
打印素数
我在代码中添加了两条打印语句-首先,在下,如果a%b==0:
,我添加了打印a,b
;我在循环之后打印c的最终值。我得到这个输出:
1 1
1
2 1
2 2
3
3 1
3 3
5
4 1
4 2
4 4
8
5 1
5 5
10
6 1
6 2
6 3
6 6
14
7 1
7 7
16
8 1
8 2
8 4
8 8
20
9 1
9 3
9 9
23
10 1
10 2
10 5
10 10
27
这说明了为什么没有打印任何内容:在a==1
中的b
循环之后,c是1;在外循环的下一次迭代中完成相同的循环之后,c现在是3。因此,当进行该测试时,c==2
永远不会为真,因此nums
保持为空
这也给了你一个很大的提示,你需要做什么来修复它c
不断增加,但对于外部循环的每次迭代,它应该重新开始计数-因此,将c=0
移动到外部for
循环中。您还需要将最终打印循环更改为print d
,而不是print nums[d]
,否则将出现另一个错误。通过这些更改,您的代码如下所示:
nums = []
for a in range(1, 11):
c = 0
for b in range(1, 11):
if a % b == 0:
c = c + 1
if c == 2:
nums.append(a)
print nums
nums = []
k=0
for a in range(1,11):
c=0
for b in range(1,11):
if a%b==0:
c = c+1
if c == 2:
nums.append(a)
k = k+1
for d in nums:
print d
它会打印出来
2
3
5
7
正如所料。我在代码中添加了两条打印语句-首先,在
下,如果a%b==0:
,我添加了打印a,b
;我在循环之后打印c的最终值。我得到这个输出:
1 1
1
2 1
2 2
3
3 1
3 3
5
4 1
4 2
4 4
8
5 1
5 5
10
6 1
6 2
6 3
6 6
14
7 1
7 7
16
8 1
8 2
8 4
8 8
20
9 1
9 3
9 9
23
10 1
10 2
10 5
10 10
27
这说明了为什么没有打印任何内容:在a==1
中的b
循环之后,c是1;在外循环的下一次迭代中完成相同的循环之后,c现在是3。因此,当进行该测试时,c==2
永远不会为真,因此nums
保持为空
这也给了你一个很大的提示,你需要做什么来修复它c
不断增加,但对于外部循环的每次迭代,它应该重新开始计数-因此,将c=0
移动到外部for
循环中。您还需要将最终打印循环更改为print d
,而不是print nums[d]
,否则将出现另一个错误。通过这些更改,您的代码如下所示:
nums = []
for a in range(1, 11):
c = 0
for b in range(1, 11):
if a % b == 0:
c = c + 1
if c == 2:
nums.append(a)
print nums
nums = []
k=0
for a in range(1,11):
c=0
for b in range(1,11):
if a%b==0:
c = c+1
if c == 2:
nums.append(a)
k = k+1
for d in nums:
print d
它会打印出来
2
3
5
7
正如预期的那样。在每个内部循环开始之前,您应该将
c
重置为零:
nums = []
for a in range(1,11):
c = 0
for b in range(1,11):
if a%b==0:
c = c+1
if c==2:
nums.append(a)
for d in nums:
print d
此外,您应该使用print d
,因为for
-循环已经给出了nums
中的每个元素
与使用for
-循环相比,使用列表理解通常更快,也更值得考虑
计算素数有许多不同的方法。这里有一些 这是您的原始算法,有一些改进
def prime_list(num):
"""Returns a list of all prime numbers up to and including num.
:num: highest number to test
:returns: a list of primes up to num
"""
if num < 3:
raise ValueError('this function only accepts arguments > 2')
candidates = range(3, num+1, 2)
L = [c for c in candidates if all(c % p != 0 for p in range(3, c, 2))]
return [2] + L
另一个实施:
def prime_list3(num):
num += 1
candidates = range(3, num, 2)
results = [2]
while len(candidates):
t = candidates[0]
results.append(t)
candidates = [i for i in candidates if not i in range(t, num, t)]
return results
这从包含所有奇数的候选列表开始。然后,is通过删除前一个列表的第一个数字及其所有倍数来计算新的候选列表
让我们看看算法的速度
对于较小的数字,原始的素数列表
最快
In [8]: %timeit prime_list(10)
100000 loops, best of 3: 8.68 µs per loop
In [9]: %timeit prime_list2(10)
100000 loops, best of 3: 10.9 µs per loop
In [10]: %timeit prime_list3(10)
100000 loops, best of 3: 8.96 µs per loop
对于较大的数字,prime_list2
将获得优胜者:
In [5]: %timeit prime_list(1000)
100 loops, best of 3: 8.28 ms per loop
In [6]: %timeit prime_list2(1000)
100 loops, best of 3: 2.46 ms per loop
In [7]: %timeit prime_list3(1000)
10 loops, best of 3: 23.5 ms per loop
In [11]: %timeit prime_list(10000)
1 loops, best of 3: 646 ms per loop
In [12]: %timeit prime_list2(10000)
10 loops, best of 3: 25.4 ms per loop
In [13]: %timeit prime_list3(10000)
1 loops, best of 3: 2.13 s per loop
在每个内部循环开始之前,应将
c
重置为零:
nums = []
for a in range(1,11):
c = 0
for b in range(1,11):
if a%b==0:
c = c+1
if c==2:
nums.append(a)
for d in nums:
print d
此外,您应该使用print d
,因为for
-循环已经给出了nums
中的每个元素
与使用for
-循环相比,使用列表理解通常更快,也更值得考虑
结石有很多不同的方法