【问题标题】:Prime numbers - I need clarification on code implementation素数 - 我需要澄清代码实现
【发布时间】:2021-12-06 22:51:30
【问题描述】:

这是我知道的代码:

bool checkPrime(int n) {
    bool prime = true;

    for (int i = 2; i < n; i++) {
        if ((n%i) == 0) {
            prime = false;
        }
    }
    return prime;
}

但是,如果您正在寻找素数,这可以吗:

List<int> arr = [2, 3, 5, 7]; // Already known

int n = 30; // Between 1 to 30. It could be any number

for (int i = 2; i < n; i++) {
    if (i % 2 != 0 && i % 3 != 0 && i % 5 != 0 && i % 7 != 0) {
        arr.add(i);
    }
    // Then maybe some code for numbers less than 8
}

print(arr);

输出:

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]

而且时间复杂度也有很大差异?

【问题讨论】:

  • 因为最后一个效率高,速度快。
  • 第一个示例花费的时间比它需要的多。您可以尽快return false;n % i == 0。在函数结束时,如果您已经通过循环,您可以安全地return true;。还有其他优化,但这是最简单的。
  • 感谢您的回答:我想出了第二个代码,但不确定它是否有效,并且相信其他人不仅想到了我,但也不确定
  • 作为一般规则,您永远不应该编写这种形式的checkPrime() 方法。您应该使用埃拉托色尼筛法和改进来生成您感兴趣的范围内的素数,然后为每次检查进行表查找。
  • @user207421 谢谢我不知道这个埃拉托色尼筛我会检查一下

标签: java c++ primes


【解决方案1】:

您的代码不正确。 此代码之所以有效,是因为您将 n 的值设为 30,对于更大的数字(如 1000),这将产生不正确的结果。 列表 arr = [2,3,5,7]; // 已经知道了

int n = 1000; // between 1 to 1000 it could be any number
List<int> arr = [2,3,5,7];

for (int i = 2; i < n; i++) {
    if (i % 2 != 0 && i % 3 != 0 && i % 5 != 0 && i % 7 != 0){
        arr.add(i);
    }
    //Then maybe some code for numbers less than 8
}
  
print(arr);

当实际上只有 168 个素数时,您的代码将返回 231 个素数。 这是因为您没有考虑未来的素数,这些素数只能除以 7 到该数之间的素数。

例如:您将返回 121 作为素数,但它是 11 的倍数

扩展你的模式。 虽然这样会更快,因为它减少了许多除法运算,但由于两个循环,它仍然是 N 平方。

这里我只是简单地从现有的素数集合中划分数字,如果发现素数在下一次迭代中用于除法,则将它们添加到集合中。

  List < int > arr = [2]; // taking 2 since this is the lowerst value we want to start with 
    
    int n = 30; // n can between 2 to any number
    if (n < 3) {
    
        print(arr); // can return from here.
    }
    // since we already have added 2 in the list we start with next number to check that is 3
    for (int i = 3; i < n; i++) {
        bool isPrime = true;
        for (int j = 0; j < arr.length; j++) { // we iterate over the current prime number collection only [2] then [2,3]...
            if (i % arr[j] == 0) { // check if number can be divided by exisiting numbers
                isPrime = false;
            }
        }
    
        if (isPrime) { // eg: 2 cant divide 3 so we 3 is also added 
            arr.add(i)
        }
    
    }
    
    print(arr);

您可以在这里查看更快的模式。 Which is the fastest algorithm to find prime numbers?

【讨论】:

  • 你为什么不告诉 OP 如何修复?
  • @vaira 但我认为在某些时候可能会有某种模式
  • 你用哪种语言编写了这段代码?
  • 飞镖编程@vaira
  • @ScaryWombat 我已经将他的思路扩展到了一个可能的解决方案。
猜你喜欢
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 2012-07-18
相关资源
最近更新 更多