【发布时间】:2015-10-07 12:58:11
【问题描述】:
我在下面编写的这个程序用于显示用户键入的列表(20 个数字)中的质数。但它只能将 2 和 3 检测为素数。我不知道为什么它不起作用。请告诉我错误在哪里并帮助我改进它。太清了。
#include <iostream>
#include <conio.h>
using namespace std;
void main ()
{
int i,number,list[20];
int t,p,prime=0;
cout<<"please key 20 numbers from 0 to 99"<<endl;
for(i=1;i<21;i++)
{
cin>>number;
if((number<0)||(number>99))
{
cout<<"Please key in an integer from 0 to 99"<<endl;
}
list[i]=number;
}
for(p=1;p<21;p++)
{
for(t=2;t<list[p];t++)
{
if ( list[p]%t==0)
{
prime=prime+1;
}
}
if (prime==0&&list[p]!=1)
{
cout<<"Prime numbers:"<<list[p]<<endl;
}
}
getch();
}
【问题讨论】:
-
< 21是对未定义行为的邀请;你的list有 20 个元素,所以循环应该类似于for (int i = 0; i < 20; i++)。您还故意忽略了数组中的元素 0;这不一定是个问题,但实际上浪费了数组的一个元素。 -
您需要在内部循环开始之前设置
prime = 0;。至于改进,请查看埃拉托色尼筛法或几乎任何其他关于 SO 上的素数的问题。您的代码几乎没有像主要测试那样低效。 -
我已经这样做了,参考第8行。
-
我的意思是“您需要将
prime = 0;设置为外部for循环主体中的第一条语句,在内部for循环开始之前”。您在程序开始时将其设置为零。当您输入 2 时,prime永远不会增加,因此您正确地将 2 识别为素数;同上 3. 当你输入 4 时,prime增加,所以它被识别为复合。但是,当您输入 5 时,素数不为零,因此它被视为合数。 -
使用所有警告和调试信息编译您的程序,例如
gcc -Wall -Wextra -g如果使用 GCC。然后使用调试器,例如gdb一步一步运行你的程序。阅读primality test和prime numbers
标签: c arrays for-loop input primes