Python 素数查找器

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<

所以我试图做一个素数查找器,为了节省计算时间,我希望它在找到一个不是1的除数或数本身时中止forloop。现在这个函数可以工作了,但是它完全忽略了我的ifstatement。我做错了什么

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;
}