【问题标题】:Prime number finder cannot find prime, stops after 7素数查找器找不到素数,在 7 后停止
【发布时间】:2014-10-06 02:56:07
【问题描述】:

所以我为 3 到 200 之间的数字制作了一个简单的素数查找器。它必须使用布尔变量,仅供参考。不会发生错误。输出是:

3 到 200 之间的素数是:
3
5
7

为什么不继续?我一次又一次地在纸上画出来,找不到我的逻辑错误。

另外;我是手工写出来的,因为我不知道如何获取文件的内容。它存在于我没有 root 访问权限的远程主机上。有没有更好的方法来复制文件?

#include <iostream>
using namespace std;

int main()
{
int count=0;
cout<<"The prime numbers between 3 and 200 are: "<<endl;

for (int i=3;i<=200;i++)
    {
     for (int j=2;j<i;j++)
        {
           bool ptest=i%j;
           if (!ptest)
             {
               break;
             }
           else if (ptest)
             {
                count=count+1;
                if (count==(i-2))
                cout<<i<<endl;
             }
         }
    }
}

【问题讨论】:

  • for(int j = 2; ji; j++) 行甚至不应该编译。如果您不粘贴实际代码,我们将无法为您提供帮助。
  • 如果您使用 GUI 终端编辑代码,应该有某种可用的复制功能,尽管它特定于特定的应用程序(如果您指定有问题的应用程序,可能有人能回答)。
  • 我将代码更改为对 OP 意图和简洁性的最佳猜测。我仍然无法弄清楚count == (i - 2) 是关于什么的。
  • @polarysekt 它们是“近乎素数”,即 11 ± 1。;) OP 非常接近工作生成器,也非常接近。 叹息
  • @msw 他正在为2i-1 之间的每个数字计算+1,这与i 互质。如果i 是质数,那么所有这些都是互质数,其中有i-2。 (当然,计算有多少个数互质,并在点击count == 1 时打破j 循环!)。

标签: c++ linux primes


【解决方案1】:

j 循环中使用后,您忘记将count 设置回0。移动线:

int count = 0;

在第一个 for 循环内。然后你的程序就可以正常工作了(尽管正如 msw 所指出的,这不是最有效的技术!)

【讨论】:

  • 我喜欢这个答案,因为您直接使用了更改最少的原始代码,完全理解了 OP 的意图。您对原始问题的解释性评论也非常有帮助。
  • @polarysekt +1。 OP 确实设法将他们的想法转化为算法,并将该算法从纸上转换为代码(除了忘记重置count),这是编程中的一项重要技能。现在它工作正常,我相信他/她将能够继续进行改进。
【解决方案2】:

需要考虑的一些事项:

  1. 您无需在代码中考虑任何偶数。

  2. 您的代码中有一些逻辑错误。在第二个for 循环之后,需要检查count 的值。 count 需要在第二个 for 循环开始之前重置。

  3. 您可以在发现内部循环中的数字不是素数后立即停止,而不是继续。您可以只使用标志isPrime 而不是计数。

这是适合我的代码版本:

#include <iostream>
using namespace std;

int main()
{
   cout << "The prime numbers between 3 and 200 are: " <<endl;

   for (int i=3; i <= 200; i += 2) {
      bool isPrime = true;
      for (int j=3; j < i; j += 2) {
         if (i % j == 0) {
            isPrime = false;
            break;
         }
      }

      if (isPrime)
      {
         cout << i << endl;
      }
   }
}

【讨论】:

    【解决方案3】:

    您不必循环直到 j 到达 i,而是可以检查 j &lt; sqrt(i) ,即在第二个 for 循环中写入: for (int j=3; j*j&lt;=i; j+=2)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 2021-11-19
      • 2013-04-18
      • 2012-03-21
      • 2013-06-09
      相关资源
      最近更新 更多