布尔值为';t在C编程语言中正常工作

布尔值为';t在C编程语言中正常工作,c,loops,for-loop,primes,function-definition,C,Loops,For Loop,Primes,Function Definition,我试着做一个素数发生器,但我不知道为什么它不工作。因为根据代码,它应该可以正常工作。我在函数中的某个地方使用了if语句,我认为每次它应该得到一个真值时,它都会得到一个假值。它应该给我所有的素数,直到用户提供值,但它什么也没有给我 #include <stdio.h> #include <math.h> #include <stdbool.h> bool isPrime(int num) { int sqroot = (int)sqrt((double)

我试着做一个素数发生器,但我不知道为什么它不工作。因为根据代码,它应该可以正常工作。我在函数中的某个地方使用了if语句,我认为每次它应该得到一个真值时,它都会得到一个假值。它应该给我所有的素数,直到用户提供值,但它什么也没有给我

#include <stdio.h>
#include <math.h>
#include <stdbool.h>
bool isPrime(int num) {
    int sqroot = (int)sqrt((double)num);
    for (int i = 1; i <= sqroot; i++){
        if (num%i == 0){
            return false;
        }
    }
    return true;
}
void gen(int num){
    int counter = 0;
    for (int i = 2; i <= num; i++){
        if (isPrime(i)){
            counter++;
            printf("%d : %d\n", counter, i);
        }
    }
}
int main(void)
{
    int x;
    scanf("%d", &x);
    gen(x);
    return 0;
}
#包括
#包括
#包括
bool isPrime(整数){
intsqroot=(int)sqrt((double)num);

for(int i=1;ifor循环从
i=1开始,因此测试
(num%i==0)
在第一次迭代时总是计算为
true
。只需从
i=2
开始,您的函数
isPrime
是错误的。每个数字都可以被
1
整除。因此函数总是返回
false

此外,函数参数应具有无符号整数类型,而不是有符号整数类型
int
。最好将其声明为具有类型
无符号long

您可以像这样声明函数

bool isPrime( unsigned long long n );
该函数可以通过以下方式定义

bool isPrime( unsigned long long n )
{
    bool prime = n % 2 == 0 ? n == 2 : n != 1;

    for ( unsigned long long i = 3; prime && i <= n / i; i += 2 )
    {
        prime = n % i != 0;
    }

    return prime;
}
#include <stdio.h>
#include <stdbool.h>

bool isPrime( unsigned long long n )
{
    bool prime = n % 2 == 0 ? n == 2 : n != 1;

    for ( unsigned long long i = 3; prime && i <= n / i; i += 2 )
    {
        prime = n % i != 0;
    }

    return prime;
}

void gen( unsigned long long n )
{
    size_t count = 0;
    
    for ( unsigned long long i = 1; i < n; i++ )
    {
        if ( isPrime( i + 1 ) )
        {
            printf( "%zu : %llu\n", ++count, i + 1 );
        }           
    }
}

int main(void) 
{
    while ( true )
    {
        printf( "Enter a non-negative number (0 - exit): " );
        
        unsigned long long n;
        
        if ( scanf( "%llu", &n ) != 1 || n == 0 ) break;
        
        gen( n );
        
        putchar( '\n' );
    }
    
    return 0;
}

你怎么知道它不工作?如果是
isPrime
函数不工作,你不需要包含
gen
函数。请修复一个@klutt:isPrime被gen函数调用,代码已经足够小了。mod 1是什么数字?解决方案已经隐藏在注释中,一般的建议是删除bug是好的。特别是,如果你在调试器下运行你的程序,并以一个足够小的值(比如3)单步执行,它不会花很长时间去看哪里出错。
Enter a non-negative number (0 - exit): 2
1 : 2

Enter a non-negative number (0 - exit): 100
1 : 2
2 : 3
3 : 5
4 : 7
5 : 11
6 : 13
7 : 17
8 : 19
9 : 23
10 : 29
11 : 31
12 : 37
13 : 41
14 : 43
15 : 47
16 : 53
17 : 59
18 : 61
19 : 67
20 : 71
21 : 73
22 : 79
23 : 83
24 : 89
25 : 97

Enter a non-negative number (0 - exit): 0