有什么方法可以更快地生成元素并检查它们是否是素数?

时间:2017-10-30 22:28:50

标签: c++ variable-assignment

我有一项任务,这里是要求

Write a program that finds the number of the prime numbers in a randomly 
generated row.

No more than 100 examples are set to the standard input. Each 
example is defined by two positive integers s and N per row (s <10^3, N <10^9). 
s sets a numerical row (by srand (s)) of length N, which is generated with 
rand ()% 1000.

Print out the count of all prime numbers.

我目前将此作为我的代码,在我的PC上,最大值需要3秒才能找到数字行中所有素数的计数。

#include <iostream>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <stdio.h>

using namespace std;

bool isPrime(int num) {
   if (num <= 3) {
     return num > 1;
 } else if (num % 2 == 0 || num % 3 == 0) {
    return false;
 } else {
     for (int i = 5; i * i <= num; i += 6) {
         if (num % i == 0 || num % (i + 2) == 0) {
             return false;
         }
     }
     return true;
 }
}

int main()
{
int seed;

long long lenght;

while(cin >> seed >> lenght){

    srand(seed);

    unsigned long long totalPrimes = 0;

    for (int i = 0; i < lenght; ++i) {

        int prime = rand() % 1000;

        if (isPrime(prime)) {
            totalPrimes++;
        }
    }

    cout << totalPrimes << endl;

    int seed = 0;

    int lenght = 0;

 }


 return 0;
}

问题是这似乎不够快,因为他想要它。有更快的方法吗?我尝试了很多东西,而且速度都慢于上面的代码。

1 个答案:

答案 0 :(得分:0)

您可以进行算法改进

“所有编程都是缓存练习。” -Terje Mathisen

那么为什么不止一次计算素数,只需存储它们,看看生成的随机数是否是其中之一,可以通过线性搜索或二元搜索。

如果您遍历所有数字以查找素数并将其存储在索引数组中,那么您可以在O(1)而不是O(log N)中进行查找

if (primeList[x])
  totalPrimes++;