Python 素数查找器
所以我试图做一个素数查找器,为了节省计算时间,我希望它在找到一个不是1的除数或数本身时中止forloop。现在这个函数可以工作了,但是它完全忽略了我的ifstatement。我做错了什么Python 素数查找器,python,primes,Python,Primes,所以我试图做一个素数查找器,为了节省计算时间,我希望它在找到一个不是1的除数或数本身时中止forloop。现在这个函数可以工作了,但是它完全忽略了我的ifstatement。我做错了什么 def prime(number): oldnum = number factor = 1 while number > 1: factor += 1 while number % factor == 0: if 1<
def prime(number):
oldnum = number
factor = 1
while number > 1:
factor += 1
while number % factor == 0:
if 1< factor < oldnum:
return 0 # is not prime
print("yay")
break
number //= factor
return 1 #prime!
def素数(数字):
oldnum=数字
系数=1
当数字>1时:
系数+=1
当数字%因子==0时:
如果1
您的代码从未到达行返回1
(顺便说一下,应该是返回True
),因为
- 您的
语句只会在break
循环时中断内部
- 该
语句从未到达,因为在此之前您break
返回0
while
循环应该是if
(因为您实际上没有做任何需要循环的事情)
如果你改变这一点(并删除无法访问的代码),它“有效”(除了prime(1)
的错误结果是True
),这是一种非常低效的查找素数的方法
def素数(数字):
oldnum=数字
系数=1
当数字>1时:
系数+=1
如果数字%因子==0:
如果1
这个函数怎么样?
导入数学
def素数(数字):
如果数字==1:
返回1
对于范围内的i(2,int(数学sqrt(数字))+1):
如果编号%i==0:
返回0
返回1
只是对性能改进的一点评论,您只需要检查从2到sqrt(num)的因数,而不是从2到num
只需使用即可。这是一种古老且行之有效的寻找素数的方法:)正如蒂姆指出的那样,你需要内部while作为if。这样的方法会奏效(但效率极低)
def素数(数字):
oldnum=sqrt(数字)
系数=1
虽然我同意上述答案。。
如果一个数字x只有因子1和它本身,那么它就是素数。。。
理想的方法是检查是否存在从2到天花板功能(sqrt(x))的任何因素。。。
其中,上限函数(n)是指大于或等于n的最小整数
C中的函数看起来像
//函数返回。。
{
->-1表示素数或复合。。
->0表示复合数字。。
->1表示质数。。
}
"
boolean isPrime(int n){
if(n<=1){
return -1;
}else{
for(int i=2;i<Math.sqrt(n);i++){
if(n%i==0)
return 1;
}
return 0;
}
}
布尔isPrime(int n){
如果(n尝试这个(实现)
def squares\u直到(n):
def square_添加(i,n):
j=i**2
而j
由于您的最终目标是有效地找到素数,而其他人已经很好地回答了编码问题,因此我将比其他答案更详细地介绍如何更有效地进行编码
最快的方法是找到高达1000万左右的素数。但是你似乎想要确定某个给定的数n
是否为素数
要检查一个数n
是否为素数,您只需检查它是否可被小于或等于sqrt(n)
的素数整除。因此,使用此方法,如果您想让函数处理高达1亿的数,您只需准备一个高达10000(1229个素数)的素数列表,所需时间可以忽略不计
如果你感兴趣,我可以在这里加入我的筛选实现,但我猜你解决这个问题是为了自娱自乐,所以我将让你去做。我相信,这是非常有效的实现。通过合并素性测试(O(1)实现),它可能会得到进一步的改进
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
void printN(常量向量容器,int count,ostream&out=cout,常量字符串&delim=“,”){
对于(int i=0;iit只会中断第二个while循环?@HagbartCeline:如果达到它,它会的:)是什么让你相信它忽略了你的if
?如果忽略了它,prime
只能返回1。但是它为复合参数返回0。好吧,它从不打印yay。这是一个可靠的指示:PWhat if number==49?加上范围内的语法错误(逗号),再加上无效类型(除整数外)…谢谢你的评论,我的python有点生疏了…我将编辑:)我认为Math.天花(sqrt(num))会更好…因为num可能并不总是一个完美的正方形。@Sreekanth如果sqrt(num)不是整数,那么检查Math.floor(sqrt(num))就足够了。
def prime(number):
oldnum = sqrt(number)
factor = 1
while factor <= oldnum:
factor += 1
if number % factor == 0 :
return 0 # is not prime
return 1 #prime!
boolean isPrime(int n){
if(n<=1){
return -1;
}else{
for(int i=2;i<Math.sqrt(n);i++){
if(n%i==0)
return 1;
}
return 0;
}
}
def squares_till(n):
def square_add(i,n):
j = i**2
while j < n:
yield j
j = j + i
A = [True]*n
A[0] = A[1] = False
for i in range(2,int(n**0.5)):
if A[i]:
for j in square_add(i,n):
A[j] = False
return [num for num in range(n) if A[num]]
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <string>
using namespace std;
void printN(const vector<int> container, int count, ostream& out=cout, const string& delim=", ") {
for(int i=0; i<count; ++i)
out << container[i] << delim;
out << endl;
}
void printNPrimes(int count) {
static const int FIRST_PRIME = 2;
static vector<int> primes(1, FIRST_PRIME);
static int rangeEnd = 3;
if(primes.size() >= count) {
printN(primes, count);
return;
}
int remainingPrimeNumbers = count - primes.size();
while(remainingPrimeNumbers) {
bool is_prime = true;
for(int prime : primes) {
if(rangeEnd % prime == 0) {
is_prime = false;
break;
}
}
if(is_prime) {
primes.push_back(rangeEnd);
--remainingPrimeNumbers;
}
++rangeEnd;
}
printN(primes, count);
}
int main(int argc, const char *argv[])
{
if(argc < 2) {
cout << "usage: rund <count>";
return -1;
}
int count = atoi(argv[1]);
printNPrimes(count);
return 0;
}