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,-1
,is_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;
}
需要注意的几件事:-
在您的代码中,您不必要地调用了 is_prime
方法两次。其中之一甚至没有考虑 returned 值。
此外,有时您必须调用一个方法,其结果将决定您需要输出哪个方法。然后,您可以存储 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 了解如何修复它。
例如,当数字 = 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,-1
,is_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;
}
需要注意的几件事:-
在您的代码中,您不必要地调用了
is_prime
方法两次。其中之一甚至没有考虑 returned 值。此外,有时您必须调用一个方法,其结果将决定您需要输出哪个方法。然后,您可以存储 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 了解如何修复它。