我有这个问题陈述(如下所示),当我测试它(例如)输入30时,答案应该是6.但我得到0.为什么?

时间:2016-08-07 08:57:23

标签: c

给定正整数N,求N ^ 2的正整数除数小于N,但不除N.约束:1< = N< =(10 ^ 12)

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main()
{
    float N;
    scanf("%f",&N);

    float nsq = N*N;
    float i;
    int count = 0;

    for(i=1.0f; i<N; i=i+1.0f)
    {
        if(fmodf(nsq,i))

        {
            count++;
            if(fmodf(N,i))
                count--;
        }
    }

    printf("%d", count);


    return 0;
}

2 个答案:

答案 0 :(得分:0)

如果余数为零,则该对象可以被整除,但不会将if语句视为0.0f值被视为false。

你必须比较函数fmodf的结果:0:

if(fmodf(nsq,i) == 0.0f)

如果从前一句中不清楚,那么第二句if语句也必须如此。

另请注意,使用浮点进行迭代是错误的。对于大于10 ^ 12的大值,结果将不适合连续的整数,迭代将不再正常工作。

函数fmodf的结果会出现类似的问题。在某些时候,即使对于明显可分割的运算符,函数也会开始停止返回零。

答案 1 :(得分:0)

    #include <stdio.h>
      #include <string.h>
    #include <math.h>
    #include <stdlib.h>

int main()
{
    float N;
    scanf("%f",&N);

    float nsq = N*N;
    float i;
    int count = 0;

    for(i=1.0f; i<N; i=i+1.0f)
    {
        if(!fmodf(nsq,i))

        {
           // count++;
            if(fmodf(N,i))
                count++;
        }
    }

    printf("%d", count);


    return 0;
}