我的质数检查器功能无法正常工作
my prime number checker function not working properly
所以这个函数应该 return 如果不是素数则为 0,如果素数则为 1。我看错了吗?例如,当我给它 39 时,它说 returns 1 尽管 39 不是质数。
int is_prime(int number){
if (number == 2) {
return 1;
}
else{
for(loop_counter ; loop_counter < number ; loop_counter++){
if(number%loop_counter == 0){
return 0;
}
else{
return 1;
}
}
}
}
关于:
for(loop_counter ; loop_counter < number ; loop_counter++){
变量:loop_counter
未初始化(甚至未声明)
也许你的意思是:
for( int loop_counter = 0; loop_counter < number ; loop_counter++){
建议代码如下:
- 干净地编译
- 执行所需的功能
- 不是 fastest/best 检查数字是否为素数的方法。相反,它是一种蛮力方法
OP贴出的代码有几个问题,在OP问题的评论中已经讨论过,这里不再赘述。
现在,建议代码:
int is_prime(int number)
{
for( int loop_counter = 2 ; loop_counter < number ; loop_counter++)
{
if(number%loop_counter == 0)
{
return 0;
}
}
return 1;
}
在这个循环中
for(loop_counter ; loop_counter < number ; loop_counter++){
使用了一个未声明的变量loop_counter
。如果它是一个全局变量,那么它不应在函数中使用,因为至少不清楚它的值是什么。
同样在循环中,您会在 number%loop_counter != 0
时立即中断其迭代。但这并不意味着这个数是素数。
如果用户将传递负数或零,则该函数将具有未定义的行为。
函数可以这样定义
int is_prime( unsigned int n )
{
int prime = n % 2 == 0 ? n == 2 : n != 1;
for ( unsigned int i = 3; prime && i <= n / i; i += 2 )
{
prime = n % i != 0;
}
return prime;
}
该函数首先排除除 2
之外的所有偶数,因为偶数不是质数。而且它还排除了数字 1
因为数字 1
根据定义不是质数。
int prime = n % 2 == 0 ? n == 2 : n != 1;
所以在循环中考虑偶数的除数是没有意义的。
for ( unsigned int i = 3; prime && i <= n / i; i += 2 )
^^^^^^
然后在循环中检查给定的奇数 n
是否可以被奇数除数
整除
prime = n % i != 0;
如果 n % i
等于 0,则变量 prime 的值为 0,并且由于循环中的条件,循环停止迭代。
for ( unsigned int i = 3; prime && i <= n / i; i += 2 )
^^^^^
也可以改写成
for ( unsigned int i = 3; prime != 0 && i <= n / i; i += 2 )
^^^^^^^^^^
所以这个函数应该 return 如果不是素数则为 0,如果素数则为 1。我看错了吗?例如,当我给它 39 时,它说 returns 1 尽管 39 不是质数。
int is_prime(int number){
if (number == 2) {
return 1;
}
else{
for(loop_counter ; loop_counter < number ; loop_counter++){
if(number%loop_counter == 0){
return 0;
}
else{
return 1;
}
}
}
}
关于:
for(loop_counter ; loop_counter < number ; loop_counter++){
变量:loop_counter
未初始化(甚至未声明)
也许你的意思是:
for( int loop_counter = 0; loop_counter < number ; loop_counter++){
建议代码如下:
- 干净地编译
- 执行所需的功能
- 不是 fastest/best 检查数字是否为素数的方法。相反,它是一种蛮力方法
OP贴出的代码有几个问题,在OP问题的评论中已经讨论过,这里不再赘述。
现在,建议代码:
int is_prime(int number)
{
for( int loop_counter = 2 ; loop_counter < number ; loop_counter++)
{
if(number%loop_counter == 0)
{
return 0;
}
}
return 1;
}
在这个循环中
for(loop_counter ; loop_counter < number ; loop_counter++){
使用了一个未声明的变量loop_counter
。如果它是一个全局变量,那么它不应在函数中使用,因为至少不清楚它的值是什么。
同样在循环中,您会在 number%loop_counter != 0
时立即中断其迭代。但这并不意味着这个数是素数。
如果用户将传递负数或零,则该函数将具有未定义的行为。
函数可以这样定义
int is_prime( unsigned int n )
{
int prime = n % 2 == 0 ? n == 2 : n != 1;
for ( unsigned int i = 3; prime && i <= n / i; i += 2 )
{
prime = n % i != 0;
}
return prime;
}
该函数首先排除除 2
之外的所有偶数,因为偶数不是质数。而且它还排除了数字 1
因为数字 1
根据定义不是质数。
int prime = n % 2 == 0 ? n == 2 : n != 1;
所以在循环中考虑偶数的除数是没有意义的。
for ( unsigned int i = 3; prime && i <= n / i; i += 2 )
^^^^^^
然后在循环中检查给定的奇数 n
是否可以被奇数除数
prime = n % i != 0;
如果 n % i
等于 0,则变量 prime 的值为 0,并且由于循环中的条件,循环停止迭代。
for ( unsigned int i = 3; prime && i <= n / i; i += 2 )
^^^^^
也可以改写成
for ( unsigned int i = 3; prime != 0 && i <= n / i; i += 2 )
^^^^^^^^^^