C程序中用于检查素数的错误
我编写了以下程序来检查给定的数字是否为素数。但不知怎的,程序给出了5的倍数,比如15,25作为素数。臭虫在哪里C程序中用于检查素数的错误,c,C,我编写了以下程序来检查给定的数字是否为素数。但不知怎的,程序给出了5的倍数,比如15,25作为素数。臭虫在哪里 #include <stdio.h> int main() { int number, i; printf("Enter the number to be checked\n"); scanf("%d", &number); for (i = 2; i < number / 2; i++) { if (num
#include <stdio.h>
int main() {
int number, i;
printf("Enter the number to be checked\n");
scanf("%d", &number);
for (i = 2; i < number / 2; i++) {
if (number % i == 0) {
printf("The given number %d is not a prime number \n", number);
break;
} else {
printf("The given number %d is a prime number \n", number);
break;
}
}
return 0;
}
#包括
int main(){
整数,i;
printf(“输入要检查的编号\n”);
scanf(“%d”和编号);
对于(i=2;i
从for
中删除else
部分,并将这些行放在循环后面
if( i == number/2)
printf("The given number %d is a prime number \n",number);
您应该使用一个标志来知道它何时是素数(或者,当它测试一个不是
数的除数的单个数时,它将立即中断)
bool isPrime=true;
对于(i=2;i
这段代码有很多问题
您应该学习如何使用if-else条件反射和break语句的使用
程序中有几个错误
第一个问题是,您不检查输入的数字是否为正数。因此,如果用户输入负数,程序将不报告任何内容
第二个错误是,如果用户输入1、2、3或4,那么程序将再次不报告任何内容
第三个错误是在循环的第一次迭代后退出循环
考虑到根据C标准,无参数的主要功能应声明如下
int main( void )
程序可以按以下方式运行
#include <stdio.h>
int main( void )
{
unsigned int number = 0;
printf("Enter the number to be checked: ");
scanf( "%u", &number );
int prime = number == 2 || ( number % 2 && number != 1 );
for ( unsigned int i = 3; prime && i <= number / i; i += 2 )
{
prime = number % i;
}
if ( prime )
{
printf( "The given number %u is a prime number \n", number );
}
else
{
printf( "The given number %u is not a prime number \n", number );
}
return 0;
}
#包括
内部主(空)
{
无符号整数=0;
printf(“输入要检查的编号:”);
scanf(“%u”和编号);
int prime=number==2 | |(数字%2&&number!=1);
对于(unsigned int i=3;prime&&i所以,有几件事
主要问题是,无论该数字是否可被i
整除,您都会提前脱离循环:
if ( num % i == 0 )
break;
else
break;
只有当该数字可被i
整除时,您才希望提前中断循环;否则,您将对照i
的下一个值检查:
for ( i = 2 ; i < number/2; i++ )
{
if ( num % i == 0 )
break;
}
有几种方法可以加速素数测试。首先,你只需要测试number
的平方根,而不是number/2
。其次,你可以消除对偶数的检查;如果一个数可以被2
整除,那么它可以被任何偶数整除,所以你只需要对照2
检查一次。在代码中:
int prime = 0; // initially false
if ( number == 2 ) // 2 is a special case, check separately
{
prime = 1;
}
else if ( number < 2 || number % 2 == 0 )
{
prime = 0; // negative numbers, 0, 1, and even numbers are not prime
}
else
{
prime = 1; // assume prime to begin with
for ( int i = 3; prime && i * i < number; i += 2 ) // continue while prime is true
{ // and i is less than sqrt(number)
prime = number % i;
}
}
printf( "%d is%s prime\n", number, prime ? "" : " not" );
int prime=0;//最初为false
如果(number==2)//2是特殊情况,请单独检查
{
素数=1;
}
else if(数字<2 | |数字%2==0)
{
prime=0;//负数、0、1和偶数不是质数
}
其他的
{
prime=1;//假设prime以
for(int i=3;prime&&i*i
欢迎使用Stack Overflow!听起来您可能需要学习如何使用调试器来逐步完成代码。有了一个好的调试器,您可以逐行执行程序,并查看程序偏离预期的地方。如果您要进行任何编程,这是一个必不可少的工具。进一步阅读:。事实上,它会报告任何奇数nnumber作为prime。在将其报告为prime之前,您必须测试所有的除数,而不仅仅是第一个除数。My显示了两种不同的方法。取出第二个else语句,仅在它通过循环时报告prime。由于您已经设置了isPrime=true
@chqrlie it,因此不需要使用else
部分是一个输入错误,i的初始值为2。至于scanf,则无需检查结果,因为数字是由0初始化的。“无需检查[ofscanf
]的结果”对初学者来说是个糟糕的建议。@WeatherVane在我看来,这对初学者来说是个非常好的建议。:)当他将详细学习scanf时,他可以使用其他方法。没有必要使程序变得更复杂。按你的意思继续开始。@WeatherVane在这里介绍的程序中,我的程序是最好的。:)没有人能编写像我这样清晰的代码,失业者。:)
if ( num % i == 0 )
break;
else
break;
for ( i = 2 ; i < number/2; i++ )
{
if ( num % i == 0 )
break;
}
if ( i < number / 2 )
// number is not prime
else
// number is prime
int prime = 0; // initially false
if ( number == 2 ) // 2 is a special case, check separately
{
prime = 1;
}
else if ( number < 2 || number % 2 == 0 )
{
prime = 0; // negative numbers, 0, 1, and even numbers are not prime
}
else
{
prime = 1; // assume prime to begin with
for ( int i = 3; prime && i * i < number; i += 2 ) // continue while prime is true
{ // and i is less than sqrt(number)
prime = number % i;
}
}
printf( "%d is%s prime\n", number, prime ? "" : " not" );