由于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;
}
答案 0 :(得分:5)
有一个技巧。只需找到下限和上限的平方根,取其积分部分,然后从上限减去下界的整数部分。您还需要检查下限是否是完美的正方形。如果是,则将1
添加到差异中。
例如:1
和100
之间的完美平方数为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