此C ++素数程序的运行时错误是什么?

时间:2018-12-20 05:37:42

标签: c++ primes

我的任务是创建一个输出前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”。到底是怎么回事?

1 个答案:

答案 0 :(得分:2)

您的代码中有一些基本错误。您可以在以下位置查看工作版本

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