【问题标题】:What is the runtime error in this c++ prime number program? [closed]这个 c++ 素数程序中的运行时错误是什么? [关闭]
【发布时间】:2018-12-20 05:37:41
【问题描述】:

我的任务是创建一个输出前 N 个素数的程序。用户输入值 N。这是我当前的程序。它的格式可能看起来很奇怪,但我不知道如何解决。不过很容易看出发生了什么。

#include <iostream>
using namespace std;

int main() {

    cout << "How many prime numbers?";
    int N;
    cin >> N;

    if(N=1){
        cout << "2";
    }

    if(N>1){
        cout << "2" << "\n";
        int i=N-1; //i=prime counters
        int j=3; //j=test prime
        do {
            int k;
            for(k=2; k<j;){ //divisibility test
                if(j%k!=0 and k!=j-1){ //indivisible, check next divisor
                    k=k+1;
                    continue;
                }
                if(j%k!=0 and k==j-1){ //indivisible and last divisor, display prime
                    cout << j << "\n";
                    i=i-1 //removes a prime counter
                    break;
                }
                if(j%k==0){ // divisible, break from loop
                    break;
                }
            }
            j=j+1; //test next prime
        } while(i>0); //will not continue printing primes if number has exceeded N
    }
    return 0;
}

无论如何,程序都会输出“2”。然后,它测试每个数字与除 1 之外的每个数字的可分性。如果它是不可分的并且仍然有除数要通过,它会继续。如果它是不可分的并且没有剩余的除数,则打印它,并带走一个“素数计数器”。如果它是可分的,则循环被打破并继续测试下一个数字。当素数计数器达到 0 时,do while 循环结束,程序完成。

当程序输出以下内容时,我遇到了问题:

有几个素数? 2

我不知道为什么会这样,因为我将 N 指定为整数并要求用户输入 N。它甚至没有给我输入 N 的机会,它只是自动打印“2”。到底是怎么回事?

【问题讨论】:

  • if(N=1) 这会将1 分配给N,它不会将N1 进行比较。条件始终为真。请参阅您最喜欢的 C++ 教科书,了解 === 之间的区别
  • 完全不相关:您可能会发现质数筛选算法比您当前的方法更快。

标签: c++ primes


【解决方案1】:

您的代码中有一些基本错误。您可以在

查看工作版本

http://coliru.stacked-crooked.com/a/3e6ab22ca6e15b00

你遇到的主要错误是

if(N=1){
    cout << "2";
}

你的意思是写

if(N==1){
    cout << "2";
}

注意相等性检查使用==,赋值使用=。任何体面的编译器都会告诉你你用错了。例如,您应该在编译器输出上看到警告,例如

main.cpp: In function 'int main()':
main.cpp:8:9: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
     if(N=1){
        ~^~

但总的来说,代码可以工作。

#include <iostream>
using namespace std;

int main() {

   int N = 10;

   if(N=1){
    cout << "2";
   }

    if(N>1){
        cout << "2" << "\n";
        int i=N-1; //i=prime counters
        int j=3; //j=test prime
        do {
            int k;
            for(k=2; k<j;){ //divisibility test
                if(j%k!=0 and k!=j-1){ //indivisible, check next divisor
                    k=k+1;
                    continue;
                }
                if(j%k!=0 and k==j-1){ //indivisible and last divisor, display prime
                    cout << j << "\n";
                    i=i-1; //removes a prime counter
                    break;
                }
                if(j%k==0){ // divisible, break from loop
                    break;
                }
            }
            j=j+1; //test next prime
        } while(i>0); //will not continue printing primes if number has exceeded N
    }
    return 0;
}

输出是

2
3
5
7
11
13
17
19
23
29

您可能还想更改代码以删除

using namespace std;

这通常被认为是不好的做法。更多信息here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-09
    • 2012-06-05
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多