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

C: Check for prime with various conditions

例如,当数字 = 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

How do I go about excluding those not desired outputs? I suspect the for loop causing those numbers(0,1,-1) to return 1, resulting in those outputs to appear. Any suggestions and hints would be great. Thanks!

这是我的实现:

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

第二行也是期望的行为。

看看你的代码...

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 其中 returns 1 并打印第二行。

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

逻辑错误

在你的 prime 检测代码中..你应该使用这个 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 方法两次。其中之一甚至没有考虑 returned 值。

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

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

当它只是两个值或两种类型时return你可以这样做

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

只需更改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 调用(第一个调用什么也没做,最后一个调用是多余的)。

更新:我应该指出这个 post 只解决了 main 中的问题。当我 post 编辑这个时,我没有看 is_prime。请参阅 coderredoc 的 post 了解如何修复它。