如何在给定范围内找到完美正方形的数量?

时间:2015-03-15 05:12:45

标签: c algorithm math

由于t的大输入超时而导致错误终止。 查找给定范围内的完美正方形数

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

    int main() 
    {

        double s,e,i;
       int t;
       scanf("%d",&t);
       for (;t>0;t--)
            {
             int cnt=0;
             scanf("%lf%lf",&s,&e);
             for (i=s;i<=e;i++)
                {
                 if (sqrt(i)==ceil(sqrt(i)))
                 cnt++;
                }
            printf("%d\n",cnt);
            }
        return 0;
    }

2 个答案:

答案 0 :(得分:5)

有一个技巧。只需找到下限和上限的平方根,取其积分部分,然后从上限减去下界的整数部分。您还需要检查下限是否是完美的正方形。如果是,则将1添加到差异中。

例如:1100之间的完美平方数为10 - 1 = 9。由于1也是一个完美的正方形,因此请添加1,因此结果将为10

int result = (int)sqrt(upper_bound) - (int)sqrt(lower_bound);  
if(lower_bound == (int)sqrt(lower_bound)*(int)sqrt(lower_bound))  
    ++result;  

请注意,我考虑了上限和下限。

答案 1 :(得分:2)

方法2(高效)我们可以简单地取a的平方根和b的平方根,并使用

计算它们之间的完全平方数
floor(sqrt(b)) - ceil(sqrt(a)) + 1

我们使用 sqrt(b) 的地板是因为我们需要考虑 b 之前的数字

我们取 sqrt(a) 的 ceil 因为我们需要考虑 后面的数字

例如,设 b = 24, a = 8. floor(sqrt(b)) = 4 ceil(sqrt(a)) = 3 方格数为 4 - 3 + 1 = 2 两个数分别为 9 和 16