4

我是 C/C++ 新手,所以我有几个关于基本类型的问题:

  1. 我在某处读到运算符 % 不能应用于浮点型或双精度型操作数。那么如何检查浮点型或双精度型变量的可分性呢?我在下面显示了我的程序错误:

    #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;
    }
    
  2. 如果一个正整数的范围高达 10^9,我应该使用哪个限定符或如何实现如此大的范围?

4

5 回答 5

9

那么我如何检查浮点型或双精度型变量的可分性。??`

使用fmod. %仅适用于整数操作数。%不适用于浮点值,因为 C 已经提供了fmod库函数。

于 2013-06-22T13:06:12.047 回答
4

一种。如果要将其保持为浮点数,请使用fmod函数 from <math.h>(C++ 中的 from)std::fmod<cmath>

湾。范围取决于实现(尽管标准定义了int一个最小范围,IIRC 应该是 +-32767,尽管在典型的机器上它将是 -2147483648 - 2147483647)。如果一个整数在你的范围内,int你不必做任何特别的事情——一个没有后缀的整数文字会自动被认为是int在它的范围内。另一方面,更大的整数文字可能需要存储在 a longorlong long中以避免溢出。

于 2013-06-22T13:08:37.257 回答
3

使用函数fmod及其系列。

于 2013-06-22T13:06:07.980 回答
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 更具描述性——提示用户是个好主意,而不是让闪烁的光标等待他。显然我对提示有点猜测(甚至可能不是您想要使用的语言......)

于 2013-06-22T13:35:04.187 回答
1
  1. %不能在花车上使用,因为标准是这样说的。使用fmod. 好吧好吧好吧,真正的原因是“余数”的概念只对整数除法有意义。什么fmod是为两个浮点参数生成一个整数商:

    float my_fmod(float a, float b)
    {
        int quot = (int) a/b;
        return a - (quot * b);
    }
    
  2. 如果您需要整数的特定范围,请不要使用int限定符,因为它们是特定于实现的。使用固定宽度的类型,例如uint32_t.

于 2013-06-22T13:11:40.727 回答