【问题标题】:No response of a find prime number program查找素数程序没有响应
【发布时间】:2016-05-24 09:37:56
【问题描述】:

我被困在我的编程任务中 此分配使用布尔数组查找 2 到 N 之间的素数 它的方法是所有素数“索引”将设置为真,其他将设置为假,所以最后它只是打印出真正的索引 这是我的代码

#include <iostream>
#include <ctime>
using namespace std;

int main(){
    int n,i;
    int count = 0;
    cout << "Enter the value of n: ";
    cin >> n;
    bool* prime = new bool[n];
    for (i=0;i<=n;i++)
        prime[i] = true;
    for (i=2;i<=n;i++)
        if (prime[i])
            for (int j=n;j=i;j--)
                if (j%i == 0)
                    prime[j] = false;
    cout << "Prime numbers: ";
    for (i=2;i<=n;i++)
        if(prime[i])
            {cout << i <<", ";
             count++;}
    cout << count <<" primes found.";


    //hold the windows
    system("pause");
    return 0;
}

问题是我输入N的值后,程序没有反应,什么也没有显示出来。

【问题讨论】:

  • 表达式 j=i 永远不会计算为假,因此您的内部循环永远不会终止。
  • 在内循环中:for (int j=n;j=i;j--) 您分配给j(非零或真)值。您需要比较for (int j = n; j &lt;= i; j--)(或==)。如果你的编译器没有警告你在条件上下文中使用赋值(我得到error: suggest parentheses around assignment used as truth value [-Werror=parentheses] - 一个错误,因为我添加了-Werror 将警告转换为错误),你要么需要打开编译器警告,要么你需要一个更好的编译器。
  • 仅供参考,最后您需要致电delete[] prime;。考虑使用std::vector 而不是数组来避免手动内存管理(只需将bool* prime = new bool[n] 更改为std::vector prime; prime.reserve(n);)。

标签: c++


【解决方案1】:

浏览一下您的代码,我可以看到您在这一行使用了错误的运算符:

for (int j=n;j=i;j--)

j=i 应该是 j==ij=i 使用赋值运算符 (=) 而不是比较运算符 (==),如果 i 不为零,则将始终评估为真,从而创建无限循环 - 意味着没有输出等


旁注

您可能想要查看n 的边界检查。如果用户输入负数怎么办? bool* prime = new bool[n]; 会尝试生成一个负大小的数组,这是不可能的(除非将数字转换为无符号值,在这种情况下,您将拥有大量布尔值)

【讨论】:

    【解决方案2】:

    我在查看数组的初始化时看到了一个错误:

    bool* prime = new bool[n];
    

    素数中的元素将从 0 到 n-1。 然后,有一个循环将值设置为 true。在某些时候,i == n:

    for (i=0;i<=n;i++)
        prime[i] = true;
    

    当 i == n 时,你在数组中写得太远了。这可能会覆盖返回地址。

    程序员经常尝试创建他们需要的确切大小的数组。除非需要大量存储空间,否则我喜欢创建有点太大的数组。这减少了缓冲区溢出错误导致我的代码被利用的机会。

    bool* prime = new bool[n + 20];
    

    您会惊讶于这种练习会节省多少时间。

    【讨论】:

    • 我同意这个诊断。不过,最好精确调整数组的大小并编写不会越界访问数据的代码。对于这个问题,数组绑定应该是n+1,因为代码不使用索引为0的元素,但它确实使用了索引为n的元素。
    猜你喜欢
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    相关资源
    最近更新 更多