我已经为C编写了这段代码来打印1-300的素数
GNU GCC编译器显示以下错误:
错误:二进制%的操作数无效(有'double'和'int')
if (sqrt(num) == 0 || sqrt(num) % 2 != 0)
我的代码是:
#include <stdio.h>
#include <math.h>
int main() {
/*Created by Suvid Singhal Date:- January 2, 2017*/
int num;
printf("Welcome to 1-300 prime numbers C Program!!!");
for (num = 0; num <= 300; num++) {
if (sqrt(num) == 0 || sqrt(num) % 2 != 0) {
printf("%d\n", num);
} else {
continue;
}
}
return 0;
}
答案 0 :(得分:4)
你的答案中有很多问题。
让我们逐一检查。
您可以检查(x)的所有`数字&lt; =平方根。所以你需要检查某人(除了1)是否划分了这个号码。如果是,则它不是其他原则。
int check= 0;
for(int i=2;i<=(int) sqrt(x);i+=1)
if(n%i == 0)
{
check = 1;
n is non-prime;
break; // no need to check
}
if(check == 0)
n is prime
模仿可以应用于int
,因此您必须将其强加于此。
for(int i=2;i*i<=x;i++)
...
了解筛选方法以获得素数。对于300个数字可能并不重要,但如果它是10000000
,那么你肯定想要读一读。
答案 1 :(得分:0)
%运算符用于整数。您可能希望使用fmod()或整数强制转换。
if ( sqrt( num ) == 0 || fmod( sqrt( num ), 2 ) != 0 )
或
if ( sqrt( num ) == 0 || (int) sqrt( num ) % 2 != 0 )
这应该可以解决您的编译错误。
ps:如果您正在寻找一种生成素数的绝佳方法,请参阅Sieve of Erastosthenes
答案 2 :(得分:0)
在您提供的代码示例中,您不清楚如何确定数字是否为素数。您有以下条件if (sqrt(num) == 0 || sqrt(num) % 2 != 0)
显然确定一个数字为素数。但是这种情况在语法上是无效的。正如其他人所指出的那样,你不能对sqrt函数返回的非int数进行模运算。您认为,操作sqrt(num) % 2
返回了什么价值?它对一个数字是素数有什么作用?您对continue
的使用也不重要。也许你在break
和continue
之间有点困惑。我给你一个示例程序。试着从中了解你的错误:
int isPrime = 1;
for(int i=2;i<=300;i++) {
isPrime = 1;
for(int j=2; j!=i && j <= ceil(sqrt(i));j++) {
if(i%j == 0) {
//Not a prime number
isPrime = 0;
break;
}
}
if(isPrime) {
printf("%d\n", i);
}
}
答案 3 :(得分:-1)
更改
if( sqrt(num) == 0 || sqrt(num) % 2!=0 )
到
if( sqrt(num) == 0 || (int)sqrt(num) % 2!=0 )
应该修复编译错误。有关详细信息,请参阅error: invalid operands to binary % when taking modulus of float。