我是C / C ++的新手,所以我对基本类型有几个问题:
我在某处读过,运算符%不能应用于float或double类型的操作数。 那我怎样才能检查float或double类型变量的可分性?我在下面显示了我的程序错误:
#include <stdio.h>
int main()
{
double n,k,t,i;
int j=0;
scanf("%f %f",&n,&k);
i=0;
while(i<n)
{
scanf("%f",&t);
if(t%k==0) /* error:invalid operands to binary % */
j++;
i++;
}
printf("%d",j);
return 0;
}
如果正整数的范围最大为10 ^ 9,我应该使用哪个限定符或如何实现如此大的范围?
答案 0 :(得分:8)
然后我如何检查float或double类型变量的可分性。 ??`
使用fmod
。 %
仅适用于整数操作数。 %
不适用于浮点值,因为C已经提供了fmod
库函数。
答案 1 :(得分:4)
一个。如果您想将其保持在浮点状态,请使用fmod
中的<math.h>
函数(C ++中std::fmod
的{{1}})。
湾<cmath>
范围与实现有关(尽管标准定义了最小范围,IIRC,应该是+ -32767,尽管在典型的机器上它将是-2147483648 - 2147483647)。如果整数在int
范围内,您不必执行任何特定操作 - 如果int
适合其范围,则会自动为int
采用不带后缀的整数文字。另一方面,可能需要将更大的整数文字存储在long
或long long
中以避免溢出。
答案 2 :(得分:3)
使用函数fmod及其系列。
答案 3 :(得分:2)
以下是fmod
答案的替代方案 - 它回答了您最初提出的问题(因为您使用的是double
类型。如果从您的评论中可以清楚地看到,您实际上想要使用整数仅限类型,您可以按如下方式重写代码(使用unsigned long long int
类型为您提供充足的空间):
#include <stdio.h>
int main()
{
unsigned long long int n, k, t, i, j=0;
printf("enter the number of attempts: ");
scanf("%llu", &n);
printf("\nEnter the factor: ");
scanf("%llu", &k);
i=0;
while(i<n)
{
printf("\nEnter the number to test: ");
scanf("%llu",&t);
if(t%k==0)
j++;
i++;
}
printf("The number of multiples found was %llu\n", j);
return 0;
}
注意我试图使I / O更具描述性 - 提示用户是一个好主意,而不是只是让一个闪烁的光标等着他。显然我在猜测一下(甚至可能不是你想要使用的语言......)
答案 4 :(得分:0)
%
不能用于浮点数,因为标准是这样说的。使用fmod
。好的没关系,实际的原因是“余数”的概念只对整数除法有意义。 fmod
的作用是为两个浮点参数生成一个整数商:
float my_fmod(float a, float b)
{
int quot = (int) a/b;
return a - (quot * b);
}
如果您需要特定的整数范围,请不要将int
与限定符一起使用,因为它们是特定于实现的。使用类似uint32_t
的固定宽度类型。