我被困在编程任务中 此赋值使用bool数组来查找2到N之间的素数 它的方法是所有素数“索引”将设置为true而其他将设置为false,所以最后它只是打印出真正的索引 这是我的代码
#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的值之后,程序没有响应并且没有显示任何东西。
答案 0 :(得分:4)
只是略过代码,我可以看到你在这一行上使用了错误的运算符:
for (int j=n;j=i;j--)
j=i
应该是j==i
。 j=i
使用赋值运算符(=
)而不是比较运算符(==
),如果i
非零,则始终求值为true,从而创建无限运算符循环 - 意味着没有输出等
<小时/> 旁注
您可能希望查看n
的边界检查。如果用户输入负数怎么办? bool* prime = new bool[n];
会尝试生成一个负大小的数组,这是不可能的(除非将数字转换为无符号值,在这种情况下你会有大量的布尔值)
答案 1 :(得分:3)
我在查看数组的初始化时看到了一个错误:
bool* prime = new bool[n];
素数中的元素将从0到n-1。 然后,有一个循环将值设置为true。在某些时候,我= = n:
for (i=0;i<=n;i++)
prime[i] = true;
当i == n时,你在数组中写的太多了。这可能会覆盖返回地址。
程序员经常尝试创建所需大小的数组。除非需要大量存储空间,否则我喜欢创建一个有点太大的数组。这减少了缓冲区溢出错误导致我的代码漏洞利用的可能性。
bool* prime = new bool[n + 20];
你会惊讶地发现这种练习可以节省你的时间。