【问题标题】:C++ Printing Odd numbers instead of Prime NumbersC++ 打印奇数而不是素数
【发布时间】:2017-06-05 14:00:12
【问题描述】:

我已经处理了几天的作业问题,但似乎无法获得正确的输出(我已经尝试了很多东西!)问题是:

编写一个程序,使用两个嵌套的 for 循环和取模运算符 (%) 来检测和打印从 1 到 10,000 的素数。

我一直在做从 1 到 10 的小测试,以确保其正常工作。我的输出是 2,3,5,7,9,所以我知道出了点问题。当我将数字从 10 增加到 20 时,它正在打印 2 加上所有奇数。我在下面包括我的代码。谢谢!!

int main() {

        for (int i=2; i <=10; i++){
            for (int j=2; j<=i; j++){
                if (i%j==0 && j!=i) {

                    break;    
                }

                else { 

                    cout<< i <<endl;
                    break;
                }           
            }   
        }
}

【问题讨论】:

  • 无论如何,你可能没有意识到你在第一次迭代中就打破了循环。
  • @perreal - 不完全;参见例如en.m.wikipedia.org/wiki/Sieve_of_Eratosthenes
  • 什么也可能帮助你解决问题 - 首先创建一个函数 bool isPrime(int x) 并在外循环中调用它。这将帮助您将 i 和 j 分开并更好地调试问题。
  • @perreal 我的意思是您的陈述“在尝试所有可以除该数字的可能数字之前,不可能确定一个数字是素数”并不十分准确。例如,2、3、4 和 6 都除以 12,但我不需要测试 all 来确定 12 不是素数。我还想说,有更好的方法来测试素数,而不是天真地除以从 2 到 sqrt(n) 的所有数字。
  • @perreal 不太清楚你的意思。但只是挑一点;除了 2 你不需要测试偶数,因为它们不会是素数,还有only numbers that +/-1 are divisible by 6 can possibly be prime,这也可以帮助缩小测试范围...... 许多缩小范围的方法。

标签: c++ primes


【解决方案1】:

除了 Sumit Jindal 的答案,内部 for 循环也可以通过这种方式完成:

for(int j=2; j*j<=i ; j++)

如果我们考虑每个满足 x*y = i 的 (x,y) 有序对,x 的最大值可以是 i 的平方根。

【讨论】:

    【解决方案2】:

    问题在于 if-else 分支。您的内部循环将只运行一次,因为您的 if else 分支将打破内部循环。

    当你第一次进入内循环时,j 的值为 2。您的条件将测试 variable i 是否可被 2 整除。如果是,则中断。否则(您的 else 分支)将打印 i 的值并爆发。 因此打印奇数。

    跳出内循环,检查外循环是否j等于i。您必须使 j 可用于外循环。

    【讨论】:

      【解决方案3】:

      您的打印语句在内部循环中,它不应该是 - 如果您一直运行通过内部循环而没有找到除数,它只是一个素数。

      作为第二点,您只需要检查直到 i 的平方根的除数,而不是一直到 i。

      【讨论】:

      • 如果 print 语句后跟一个 break 语句,则可以将它放在内部循环中,并且您有逻辑确保这仅在内部循环之后执行已经跑得足够远,可以确定这个数是素数。 OP 的代码只满足其中之一。
      • @DavidScarlett:嗯,是的,这确实是一样的,但它会是一个相当复杂的循环终止......
      【解决方案4】:

      您在第一次迭代之后打破了内部循环,它正在检查数字(即 i)是否不同于 j 并且是否可以被 2 整除(因为第一次迭代 j=2

      我的输出是 2,3,5,7,9

      这是因为每个奇数都没有通过 if 并在 else 条件下打印

      【讨论】:

        【解决方案5】:

        您的代码中的一个小修正,添加了一个标志。此外,您不需要运行内部循环 i 次,实际上只需 i/2 次就足够了。这是简单的数学运算,但会节省大量 CPU 周期(在您的情况下,迭代次数减少了约 5000 次)

        #include <iostream>
        
        int main()
        {
            int n = 10;
            for(int i=2; i<=n; i++){
                bool isPrime = true;
                for(int j=2; j<=i/2; j++){
                    if(i!=j && i%j==0){
                        isPrime = false;
                        break;
                    }
                }
                if(isPrime)
                    std::cout << i << " ";
            }
            return 0;   
        }
        

        【讨论】:

        • 谢谢!我确实尝试在早期版本中添加标志,但我仍然在错误的位置打破循环。现在这是有道理的。
        【解决方案6】:

        另一个版本,如果您不介意以相反的顺序输出。

        int n = 10;
        
        for (int i = n; i > 1; --i)
        {
            int factorCount = 0;
            for (int j = 2; j <= n; ++j)
            {
                if (i % j == 0)
                    factorCount++;
        
                if (factorCount > 1)
                    break;
            }
            if (factorCount == 1)
                cout << i << endl;
        }
        

        【讨论】:

          【解决方案7】:
          int main() { 
          
              for (int i = 2; i <= 100; i++) {
                  for (int j = 2; j < i; j++) {
                      if (i%j == 0)
                          break;
          
                      if (j==i-1) // means has never run previous if blog
                          cout << i << endl;
                  }
              }
          
              return 0; 
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-07-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-27
            相关资源
            最近更新 更多