C程序中用于检查素数的错误

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

我编写了以下程序来检查给定的数字是否为素数。但不知怎的,程序给出了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 (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初始化的。“无需检查[of
scanf
]的结果”对初学者来说是个糟糕的建议。@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" );