编写C程序中的错误以检查素数

时间:2015-12-30 18:25:35

标签: 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 (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; 
}

5 个答案:

答案 0 :(得分:1)

你应该使用一个标志来知道它何时是一个素数(或者它会在测试一个不是number的除数的单个数字时就会中断

bool isPrime = true;
for(i=2;i<number/2;i++){
    if(number%i==0)
    {
      isPrime = false;
      break;
    }
}
if (isPrime){
    printf("The given number %d is a prime number \n",number);
}
else {
    printf("The given number %d is not a prime number \n",number);
}

答案 1 :(得分:0)

else移除for部分,并将这些行放在循环之后

if( i == number/2)
    printf("The given number %d is a prime number \n",number);

答案 2 :(得分:0)

  

此代码存在很多问题

#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; 
}

假设您输入了5,所以输入了for loop first iteration i=2

if(number%i==0)5%2==0,显然 false 现在您的代码转到else条件printbreak

  

所以这个休息所做的是,它会停止执行最里面的循环,因为你只有一个循环你的执行停止,因此你得到的错误答案不仅是5的倍数,还有许多其他输入。

     
    

else条件不应该在循环内

  

一个简单的代码

 #include <stdio.h>
    int main()
    {
      int n, i, flag=0;
      printf("Enter a positive integer: ");
      scanf("%d",&n);
      for(i=2;i<=n/2;++i)
      {
          if(n%i==0)
          {
              flag=1;
              break;
          }
      }
      if (flag==0)
          printf("%d is a prime number.",n);
      else
          printf("%d is not a prime number.",n);
      return 0;
    }
  

您应该学习如何使用if-else条件和使用break语句

答案 3 :(得分:0)

程序中有几个错误。

第一个是您不检查输入的数字是否为正数。因此,如果用户输入负数,程序将不会报告任何内容。

第二个错误是,如果用户输入1,2,3或4,那么程序将再次报告任何内容。

第三个错误是你在第一次迭代后退出循环。

考虑到根据C标准函数main,没有参数应声明为

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; 
}

答案 4 :(得分:0)

所以,有几件事......

主要问题是,如果数字可以被i整除,那么您是否会早早摆脱循环:

if ( num % i == 0 )
  break;
else
  break;

如果数字可以被i整除,您只想提前退出循环;否则,请检查i的下一个值:

for ( i = 2 ; i < number/2; i++ )
{
  if ( num % i == 0 )
    break;
}

循环后,检查i是否小于number / 2;如果是,则number不是素数:

if ( i < number / 2 )
  // number is not prime
else
  // number is prime

有几种方法可以加快你的素性测试。首先,您只需要测试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" );