C:检查各种条件下的素数

时间:2017-10-29 04:00:00

标签: c primes

例如,如果数字= 0或1,则输出:

"It's neither prime nor composite" //Desired
"0/1 is a prime number."           //Not desired

对于另一个例子,数字是负数(例如-1):

"Error! You have entered a negative number." //Desired
"-1 is a prime number."                      //Not desired
  

如何排除那些不理想的输出?   我怀疑 for 循环导致那些数字(0,1,-1)到返回1 ,导致出现这些输出。任何建议和提示都会很棒。谢谢!

这是我的实施:

#include <stdio.h>

/* Checks if a positive number is a prime number.  */
int is_prime(int num) {
  /* Divisible by any integers from 2 to a num's square root */
  for (int j=2; j<=num/2; j++) {
    /* return "false" */
    if (num%2 == 0) {
      return 0;
    }
  }
  /* Otherwise, return "true" */
  return 1;
}

int main() {
  int number;

  printf("Enter a positive integer:\n");
  scanf("%d", &number);

  if (number == 0 || number == 1) {
    printf("It's neither prime nor composite.\n");
  } else if (number < 0) {
    printf("Error! You have entered a negative number.\n");
  }

  is_prime(number);

  if (is_prime(number) == 1) {
    printf("%d is a prime number.\n", number);
  } else if (is_prime(number) == 0) {
    printf("%d is not a prime number.\n", number);
  }

  return 0;
}

2 个答案:

答案 0 :(得分:2)

第二行也是期望的行为。

看看你的代码......

if (number == 0 || number == 1) {
    printf("It's neither prime nor composite.\n");
    return 0;
  } else if (number < 0) {
    printf("Error! You have entered a negative number.\n");
    return 0;
  }

因为如果你不做这个或类似的东西,那么它会调用is_prime,它返回1并打印第二行。

对于0,1,-1for方法中的is_prime循环未运行。在方法的最后一行中return 1。结果printf打印出它是素数。

逻辑错误

在您的主要检测代码中......您应该使用此if (num%j == 0)。否则这是一个错误。

int is_prime(int num) {
  /* Divisible by any integers from 2 to a num's square root */
  for (int j=2; j*j<=num; j++) {
    /* return "false" */
    if (num%j == 0) {
      return 0;
    }
  }
  /* Otherwise, return "true" */
  return 1;
}

很少有事情要考虑: -

  1. 在您的代码中,您不必要地两次调用is_prime方法。其中一人甚至没有考虑返回的价值。

  2. 有时您还必须调用一个方法,其结果将决定您需要输出哪个方法。然后,您可以存储返回值,然后处理它,而不是if-else

  3. int retVal = func();
    if(retVal==1)
       printf("..");
    else if( retVal==2)
       printf("..something different..");
    else
       printf("..something else..");
    

    如果只返回两个值或两个类型,则可以执行此操作

    if(func()==2)
     // do this
    else
     // do that
    

答案 1 :(得分:1)

只需更改main,如下所示:

int main() {
  int number;

  printf("Enter a positive integer:\n");
  scanf("%d", &number);

  if (number == 0 || number == 1) {
    printf("It's neither prime nor composite.\n");
  } else if (number < 0) {
    printf("Error! You have entered a negative number.\n");
  } else if (is_prime(number)) {
    printf("%d is a prime number.\n", number);
  } else {
    printf("%d is not a prime number.\n", number);
  }

  return 0;
}

这样,如果其中一个特殊情况生效,它就不会调用is_prime。我还删除了对is_prime的一些不必要的调用(第一个调用什么也没做,最后一个调用是多余的)。

更新:我应该指出,这篇文章只解决main中的问题。当我发布这个时,我没有看过is_prime。有关如何解决问题,请参阅coderredoc的帖子。