有人可以帮助我更正此“低于100的素数”代码的输出吗?

时间:2019-02-07 13:46:40

标签: c++

此问题已回答 所以基本上,我只是写下了代码以显示所有低于100的素数。这是代码:

    #include <iostream>
    using namespace std;
    int main()
    {
       int n=2,i;
       cout<<"All Prime numbers below 100 are : \n";

       while(n<=100)
       {
           for(i=2; i<n/2; i++)
           {
              if (n%i==0)
              {
                 goto restart;
              }

              else
              {
                 cout<<n<<"\t";
              }    
          }
          restart:
          n++;
      }
      return 0;
   }

但是输出不是2 3 5 7 11 .....而是:

All prime numbers below 100 are:

7  9  11  11  11  13  13  13  13  15  15  and so on ...                             

我只希望输出显示从2到97的所有素数而不重复。谢谢。

/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-/-

我稍加修改就摆脱了问题。

#include<iostream>
using namespace std;
int main()
{
    int n=2, i;
    while(n<=100)
    {
        for(i=2; i<=n/2; i++)
        {
            if(n%i==0)
            {
                goto label;
            }
        }
        cout<<n<<", ";
        label:
            n++;
    }
    return 0;
}

感谢大家宝贵的时间。(而且之所以使用此类初学者类型代码,是因为我像一个星期前才刚开始使用C ++。我有很多代码(例如bool,isPrime等)进行学习。)

保持启动代码,其他编码员:D

3 个答案:

答案 0 :(得分:3)

您的算法存在明显错误。您也许可以使用调试器找到它,但是我认为更好的方法是让您了解提取函数的方法。您想要主要功能执行的操作就是:Child。所以你应该这样写:

check_output

为此,您当然需要定义函数subprocess.check_output(['python', 'myPythonFile.py'])

if n is prime: output n

还请注意,无需检查int main() { for (int i = 0; i < 100; ++i) if (is_prime(i)) std::cout << i << std::endl; } 是否可被大于其平方根的数字整除。如果在平方根前没有除数,则下一个可能的除数就是is_prime本身。

正如其他人提到的那样,这不是解决此问题的最佳算法,但是对于较小的值,它绝对足够好。

答案 1 :(得分:2)

您的回答还可以,但是有两个严重错误。首先,为您检查的每个模输出n。如果所有模检查均失败,则仅应输出n。另外,您的边界条件不太正确-应该为<=。只需最少的更改即可工作的代码为:

#include <iostream>
using namespace std;
int main()
{
    int n=2,i;
    cout<<"All Prime numbers below 100 are : \n";

    while(n<=100)
    {
        for(i=2; i<=n/2; i++)
        {
            if (n%i==0)
            {
                goto restart;
            }
        }

        cout<<n<<"\t";

        restart:
        n++;
    }
    return 0;
}

如果您想编写更简洁的代码,则不要使用goto,请使用双for循环和break。另外,您对i的边界条件应该为i*i<=n,因为那是更严格的界限。像这样:

#include <iostream>

int main()
{
    cout<<"All Prime numbers below 100 are : \n";

    for(int n=2; n<100; ++n)
    {
        bool isPrime = true;
        for(int i=2; i*i<=n; i++)
        {
            if (n%i==0)
            {
                isPrime = false;
                break;
            }
        }

        if(isPrime)
            std::cout<<n<<"\t";
    }
}

答案 2 :(得分:0)

您正在尝试检查每个数字是否为素数。因此,您必须检查是否可以将其除以较小的数字。

查找所有素数直至最大数的更有效方法是Erathosthenes筛子:

#include <iostream>
#include <vector>

int main() {
    const unsigned int maxNum(100);
    std::vector<bool> prime(maxNum, true);
    for (unsigned int i(2); i*i < maxNum; ++i) {
        if (!prime[i]) continue;
        for (unsigned int j(2*i); j < maxNum; j += i) {
            prime[j] = false;
        }
    }
    for (unsigned int i(2); i < maxNum; ++i) {
        if (prime[i]) std::cout << i << std::endl;
    }

    return 0;
}

将创建所有号码的列表。每个数字的每个倍数都将从此列表中删除。