首页 > 解决方案 > 这个 c++ 素数程序中的运行时错误是什么?

问题描述

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

标签: c++primes

解决方案


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

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

您遇到的主要错误是

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

你打算写

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

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

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;

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


推荐阅读