问题描述
我刚刚开始学习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' );
}
}