打印从1到100的素数

Sah*_*bov 14 c c++ algorithm primes

此c ++代码打印出以下素数: 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97.

但我认为这不是我的书想要写的方式.它提到了一些关于数字的平方根的东西.所以我确实尝试改变我的第二个循环,for (int j=2; j<sqrt(i); j++)但它没有给我我需要的结果.

我如何才能将此代码更改为我的书所希望的方式?

int main () 
{
    for (int i=2; i<100; i++) 
        for (int j=2; j<i; j++)
        {
            if (i % j == 0) 
                break;
            else if (i == j+1)
                cout << i << " ";

        }   
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

素数是具有两个不同除数的整数,即1和数字本身.编写,运行和测试C++程序,查找并打印小于100的所有素数.(提示:1是素数.对于每个从2到100的数字,找到Remainder = Number%n,其中n的范围是2 to sqrt(number).\如果n大于sqrt(数字),则该数字不能被n整除.为什么?如果任何剩余等于0,则该数字不是素数.)

Pro*_*Sim 31

三种方式:

1.

int main () 
{
    for (int i=2; i<100; i++) 
        for (int j=2; j*j<=i; j++)
        {
            if (i % j == 0) 
                break;
            else if (j+1 > sqrt(i)) {
                cout << i << " ";

            }

        }   

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

2.

int main () 
{
    for (int i=2; i<100; i++) 
    {
        bool prime=true;
        for (int j=2; j*j<=i; j++)
        {
            if (i % j == 0) 
            {
                prime=false;
                break;    
            }
        }   
        if(prime) cout << i << " ";
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

3.

#include <vector>
int main()
{
    std::vector<int> primes;
    primes.push_back(2);
    for(int i=3; i < 100; i++)
    {
        bool prime=true;
        for(int j=0;j<primes.size() && primes[j]*primes[j] <= i;j++)
        {
            if(i % primes[j] == 0)
            {
                prime=false;
                break;
            }
        }
        if(prime) 
        {
            primes.push_back(i);
            cout << i << " ";
        }
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:在第三个例子中,我们跟踪所有先前计算的素数.如果一个数字可以被一个非素数除尽,那么还有一些素数<=该除数它也可以被除数.这减少了计算的primes_in_range/total_range因子.

  • 您可以在第3个示例中改进外部循环:for(int i = 3; i <100; i + = 2) (4认同)
  • 我downvoted:第一个例子不认为2和3是素数:http://ideone.com/KeOg7l,因为根本没有输入循环.一般来说,我不认为**break**应该被认为是邪恶的,但当你使用它与异乎寻常的循环停止条件,如你的if语句,我会说它肯定是.此外,我认为你的前两个例子是等价的,除了第二个使用更好的代码练习,第一个是**错**.我还建议不要做sqrt(x)<y但x <y*y.最后,我认为一个公认的答案应该提到Eratosthenes的Sieve. (4认同)

sth*_*sth 17

如果j等于sqrt(i)它也可能是一个有效的因素,而不是只有当它的.

要迭代并包含sqrt(i)在内部循环中,您可以编写:

for (int j=2; j*j<=i; j++)
Run Code Online (Sandbox Code Playgroud)

(与使用sqrt(i)它相比,有一个优点是不需要转换为浮点数.)


Jer*_*fin 12

如果数字有除数,则其中至少有一个必须小于或等于数字的平方根.当你检查除数时,你只需要检查平方根,而不是一直到被测试的数字.


Car*_*thi 8

这是我非常简单的c ++程序,用于列出2到100之间的素数.

for(int j=2;j<=100;++j)
{
    int i=2;
    for(;i<=j-1;i++)
    {
        if(j%i == 0)
            break;
    }

    if(i==j && i != 2)
        cout<<j<<endl;
}
Run Code Online (Sandbox Code Playgroud)

  • 请添加一些关于该程序为什么工作以及它做什么的解释。它可能不会立即显现。 (2认同)
  • @AdrianZhang我认为这是不言而喻的. (2认同)

Sau*_*ahu 5

使用Sieve of Eratosthenes逻辑,我能够以更快的速度获得相同的结果。

我的代码演示VS接受了答案

与 相比count,我的代码完成工作所需的迭代要少得多。最后检查不同N值的结果。

为什么此代码比已经接受的代码性能更好:

- 在整个过程中偶数不会被检查一次。

- 内循环和外循环都只在可能的范围内进行检查。没有额外的检查。

代码:

int N = 1000; //Print primes number from 1 to N
vector<bool> primes(N, true);
for(int i = 3; i*i < N; i += 2){    //Jump of 2
    for(int j = 3; j*i < N; j+=2){  //Again, jump of 2
        primes[j*i] = false;
    }
}
if(N >= 2) cout << "2 ";
for(int i = 3; i < N; i+=2){        //Again, jump of 2
    if(primes[i] == true) cout << i << " "; 
}
Run Code Online (Sandbox Code Playgroud)

对于N = 1000,我的代码需要 1166 次迭代,接受的答案需要 5287(慢 4.5 倍)

对于N = 10000,我的代码需要 14637 次迭代,接受的答案需要 117526(慢 8 倍)

对于N = 100000,我的代码需要 175491 次迭代,接受的答案需要 2745693(慢 15.6 倍)