Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中不使用标志和中断的素数_C_Loops_For Loop_If Statement_Primes - Fatal编程技术网

C中不使用标志和中断的素数

C中不使用标志和中断的素数,c,loops,for-loop,if-statement,primes,C,Loops,For Loop,If Statement,Primes,我刚刚开始学习C,我正在尝试素数,也许不用flag,break,bool 在这里,我试图建立一个程序,将给我第八个素数,它运行不正常,我非常不确定的一部分,决定是否一个数字是一个素数 int main(void){ int i,j,th = 0; int n = 8; for (i=2; th <= n; i++) { for(j=2; j<=i; j++) { if(i%j !=0) { th = th + 1;

我刚刚开始学习C,我正在尝试素数,也许不用flag,break,bool

在这里,我试图建立一个程序,将给我第八个素数,它运行不正常,我非常不确定的一部分,决定是否一个数字是一个素数

int main(void){

int i,j,th = 0;
int n = 8;

for (i=2; th <= n; i++) {
   for(j=2; j<=i; j++) {
        if(i%j !=0) {       
            th = th + 1;
            printf("%d",i);
        }
   }
}
}
int main(无效){
int i,j,th=0;
int n=8;

对于(i=2;th而言,问题在于有太多的情况属于以下情况:

if (i % j != 0) 
例如,(i=4,j=3)但4不是素数。您需要将j从2循环到
i的平方根,
确保它们都不可除

如果没有标志,这似乎很难做到(你可以做的一个技巧是将
(i-1)!%i==0
用于
i>4
)。

在这个for循环中

for(j=2; j<=i; j++) {
     if(i%j !=0) {       
         th = th + 1;
         printf("%d",i);
     }
}
是不正确的,因为
i
总是可以自己整除

该程序可以按照下面的演示程序所示的方式进行查看

#include <stdio.h>

int main( void )
{
    while ( 1 )
    {
        printf( "Enter a non-negative number (0 - exit): " );
        
        unsigned int n;
        
        if ( scanf( "%u", &n ) != 1 || n == 0 ) break;
        
        putchar( '\n' );
        
        for ( unsigned long long i = 0; n != 0; i++ )
        {
            int prime = i % 2 == 0 ? i == 2 : i != 1;
            
            for ( unsigned long long j = 3; prime && j <= i / j; j += 2 )
            {
                prime = i % j != 0;
            }
            
            if ( prime ) 
            {
                printf( "%llu ", i );
                --n;
            }               
        }
        
        putchar( '\n' );
        putchar( '\n' );
    }
}

也许这可以帮助您实现bool is_prime(int n){if(n
%d)
->
%d\n”
将是一个不错的选择start@cosinus0:所有大于
3
的素数都是
6k±1
的形式,这是一个巧妙的技巧,很好。@YanJun,我不明白你为什么要施加这样不必要的限制,比如不使用标志或
break
。做任何你需要的事情来解决这个程序。尽可能最好的编程n要做的是编写小型、可测试、纯(无副作用)函数,并用它们编写程序。首先编写一个函数
isPrime(int)
,然后对其进行测试。这是一个5行程序。此时,您绝对必须学会如何使用调试器。
#include <stdio.h>

int main( void )
{
    while ( 1 )
    {
        printf( "Enter a non-negative number (0 - exit): " );
        
        unsigned int n;
        
        if ( scanf( "%u", &n ) != 1 || n == 0 ) break;
        
        putchar( '\n' );
        
        for ( unsigned long long i = 0; n != 0; i++ )
        {
            int prime = i % 2 == 0 ? i == 2 : i != 1;
            
            for ( unsigned long long j = 3; prime && j <= i / j; j += 2 )
            {
                prime = i % j != 0;
            }
            
            if ( prime ) 
            {
                printf( "%llu ", i );
                --n;
            }               
        }
        
        putchar( '\n' );
        putchar( '\n' );
    }
}
Enter a non-negative number (0 - exit): 20

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 

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

2 3 5 7 11 13 17 19 

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