“C数”是整数n>对于所有整数1,(b ^ n)mod n = b
基本上我必须创建一个程序来运行大约2000个整数(1-2000),并让它满足C数条件,然后还检查它是否不是素数。我似乎无法让循环正常工作。 我有一个程序,它创建一个非素数列表,以及一个工作程序,如果我输入一个数字,如果它是一个c号,它将返回该号码,如果不是,我将得到错误的返回。
我希望它只检查数字1-2000而不仅仅是我输入的一个数字,然后检查非素数列表。
这是我的代码:
import numpy
def primesfrom2to(n):
""" Input n>=6, Returns a array of primes, 2 <= p < n """
sieve = numpy.ones(n/3 + (n%6==2), dtype=numpy.bool)
for i in xrange(1,int(n**0.5)/3+1):
if sieve[i]:
k=3*i+1|1
sieve[ k*k/3 ::2*k] = False
sieve[k*(k-2*(i&1)+4)/3::2*k] = False
return numpy.r_[2,3,((3*numpy.nonzero(sieve)[0][1:]+1)|1)]
num=range(600)
mylist =primesfrom2to(600)
s = [item for item in num if item not in mylist]
a=[]
d=[]
from math import *
def numc(n):
for a in range(1,n):
c= a**n
d=c%n
if a == d:
return n
else:
return False
print numc(561)
答案 0 :(得分:1)
您可能只需要修复缩进(需要在很多地方修复):
def numc(n):
for a in range(1,n):
c= a**n
d=c%n
Python几乎是通过缩进编写的。
答案 1 :(得分:1)
最简单甚至更重要:最干净的方法是创建两个列表,一个列表用于找到的素数,另一个用于c号码。然后浏览列表以检查哪些是c号而不是素数。同时在两个函数中分割prime和c数的函数。类似的东西:
prime_numbers = []
c_numbers = []
amount = 2000
for i in xrange(amount):
if is_prime(i):
prime_numbers.append(i)
if is_c_number(i):
c_numbers.append(i)
for i in xrange(amount):
if i in c_numbers and (not i in prime_numbers):
print i
答案 2 :(得分:1)
首先,不确定numc()是否符合您的预期 - 如上所述,if语句仅针对范围中的最后一个值进行测试。 if语句不在for循环块中,因此循环将遍历赋值,而if语句仅与上一次迭代中指定的值相反。这似乎更符合您的要求:
def numc(n):
for a in range(1,n):
c= a**n
d=c%n
if a != d:
return False
return n
如果某个值在if测试中失败,则该函数返回False。如果所有值都通过,则返回true。
其次,我的草稿和你的草稿都不会返回一个数组,只是一个整数或一个布尔值。要获取传递的值数组,必须在候选数组的每个项目上调用该函数。
这为候选数组的每个成员提供了输出,整数或布尔值:
c_values = [numc(i) for i in range(1, 2000)]
您可以通过循环测试获得传递值:
c_values = [numc(i) for i in range(1, 2000) if numc(i)]
您可以通过嵌套列表推导而不调用numc()两次来执行此操作:
c_values = [i for i in [numc(j) for j in range(1, 2000)] if i]
首先生成完整的输出值数组,然后仅返回True。
编辑:您似乎对块缩进或两个返回语句感到困惑。这是另一种回归方式:def numc(n):
retval = n
for a in range(1,n):
c= a**n
d=c%n
if a != d:
retval = False # reset return value
break # halt the loop
return retval
这里的默认返回值是&lt;&lt; n&gt;&gt;,将在&lt;&lt;&lt;&lt;&lt;&lt;对于&gt;&gt;循环,如果cnumber条件被某些值&lt;&lt;违反a&gt;&gt;。在这种情况下,&lt;&lt;休息&gt;&gt;停止循环(虽然这里不需要。)函数只返回任何&lt;&lt; retval&gt;&gt;碰巧是在达到归还的时候。
我的初稿具有相同的效果,但是&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;返回False&gt;&gt;声明 - 它也中断了该功能,阻止它到达&lt;&lt;返回n&gt;&gt;。如果没有达到该陈述,即没有&lt;&lt; a&gt;&gt;违反条件,该函数将达到并执行&lt;&lt;返回n&gt;&gt;。如果一个函数有两个return语句,它只执行第一个到达的语句,之后的所有代码都将被忽略。