C中的质数,不使用标志和中断

问题描述

我刚刚开始学习C,并且我正在尝试对数字进行质数运算,也许不使用标记,中断或布尔值?

在这里,我正在尝试构建一个程序,该程序将为我提供第8个质数,并且运行不正常。对于决定是否为质数的部分,我非常不确定。

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

解决方法

问题在于,有太多的情况属于

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

在存在因数j使得i % j不等于0的除数时,您将输出一个作为质数的数字。

例如,如果i等于4(并且不是素数)并且j等于3,那么您输出的是{{1} },因为4不等于4 % 3

也是循环的条件

0

是不正确的,因为for(j=2; j<=i; j++) { ^^^^ 始终可以被自身整除。

该程序的外观如下所示,如下所示。

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' );
    }
}