一尘不染

打印从1到100的质数

algorithm

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

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


阅读 409

收藏
2020-07-28

共1个答案

一尘不染

三种方式:

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

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

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

编辑:在第三个示例中,我们跟踪所有先前计算的素数。如果一个数字可以被一个非质数整除,则也存在一个质数<=该除数也可以被其除以。这将计算量减少了primes_in_range
/ total_range。

2020-07-28