
c语言出错invalid operands to binary %
如输入:(下划线部分表示输入)
Input m: 100
Input n: 500
则输出
100 121 144 225
400 441 484
int main()
{
int m,n,i,a[100],k;
k=0;
printf("Input m: ");
scanf("%d",&m);
printf("Input n: ");
scanf("%d",&n);
for(i=sqrt(m);i<=sqrt(n);i++)
if(pow(i,2)%10==(int)(pow(i,2)/100)||pow(i,2)%10==(int)(pow(i,2)/10)%10)
a[k++]=pow(i,2);
a[k++]='\0';
for(i=1;a[i]!='\0';i++)
if(i%4==0) printf("\n%d ",a[i]);
else printf("%d ",a[i]);
return 0;
}
编译不过去。提示说
fenjieshuwei.c:10: error: invalid operands to binary %
fenjieshuwei.c:10: error: invalid operands to binary %
为什么? 展开
double类型不能使用%操作符作取余运算。浮点数没有%运算符,%只能运用于整数。
双精度浮点型,此数据类型与单精度数据类型(float)相似,但精确度比float高,编译时所占的内存空间依不同的编译器而有所不同,是doublefloat数据类型,C/C++中表示实型变量的一种变量类型。
扩展资料:
C语言中,双精度浮点(double)型,占8个字节(64位)内存空间。其数值范围为-1.7E308~1.7E+308,双精度完全保证的有效数字最高是15位。
浮点型从狭义上说就是科学记数法。双精度,即double。double有二,两个的意思。
C标准要求float类型精度7位,并且整数部分的表示范围至少要达到-1.0E37--1.0E+37。float一般是32位的。
C标准规定double类型的整数部分的最小表示范围和float一样,都是-1.0E37到1.0E+37,但是它要求double类型精度15位~16位。double通常是64位的。输出doublefloat类型的控制符为%lf。
变量定义时,可以简写为double。
longdouble
C还提供了longdouble类型,目的是提供一种比double更加精确的类型。然而,C标准仅仅规定longdouble至少要和double一样精确。
前面的pow(i,2)返回的是一个浮点数,不能进行取模运算;所以应加上(int)修饰
后面的(int)(pow(i,2)/10)%10中,强制转换错误,应改为((int)pow(i,2)/10)%10即可,
综上所述,整个句子修改成即可:
if((int)pow(i,2)%10==(int)(pow(i,2)/100)||pow(i,2)%10==((int)pow(i,2)/10)%10)
能具体讲讲这句话吗。
后面的(int)(pow(i,2)/10)%10中,强制转换错误,应改为((int)pow(i,2)/10)%10即可,
这个强制转换错误是怎么回事?不可以转换(pow(i,2)/10)吗?这样((int)pow(i,2)/10)先装换pow再/10不会出小数吗?
不是强制转换本身有错,而是说因为格式的错误造成了类型转换时出现的错误。
原if语句的开始处if(pow(i,2)%10==.....这一节,错误很容易说明:因为pow()的值是浮点数,所以不能进行取模运算(%)
后面那个==(int)(pow(i,2)/10)%10一节,其错误就是将(pow(i,2)/10)整个结果计算出来后,再取模,再被10整除;你原本的意思是将十位上的数分离出来,所以应该在得到pow()的值后,就立即取整,这样就可过滤掉个位以下数,然后再除以10,就能保证个位数是原数的十位上的数,现通过%取余,就得到原十位上的数了。
不知这样的解释能否使你理解?