题目描述
多次查询[l,r]范围内的完全平方数个数
定义整数x为完全平方数当且仅当可以找到整数y使得y*y=x
输入描述:
第一行一个数n表示查询次数 之后n行每行两个数l,r
输出描述:
对于每个查询,输出一个数表示答案
示例1
输入
5 1 3 1 4 2 4 4 4 1 1000000000
输出
1 2 1 1 31622
备注:
n <= 100000 0<= l <= r <= 1000000000
对于上面的题目,开始自己以为很简单,但是提交代码老是过不了,因为时间复杂度高了,,,,,
想想简单的暴力解题是不能,,,,然后百度一下,发现要用到算法————————二分查找。
其实这题还有一个解法(适合初学者,不涉及算法):
假设a=9,b=18,a,b之间包括了几个数字呢?
开始的时候以为是18-9+2=11,因为首尾都要考虑(当时脑子真的烧到了)
细细想想,一个例子,假设a=1,b=9。 那么其中包括了几个数呢? 当然是9个数。因为1到9嘛。
为什么我突然提这个呢?
很简单,这个可以运用到本题上面,本题的意图是给a,b值要求你找出里面的完全平方数。 这个其实只要将首尾都进行开平方再强行类型转换为整形,首尾相减即是答案。 其实答案又是错的,因为上面的我又没考虑到,所以要先加1在开平方再转换再相减就是答案了。
举例说明: 假设a=1,b=4; 里面的完全平方数是1和4,即个数是2。
附上ac代码:
#include<bits/stdc++.h>
using namespace std;int main()
{
int n,a,b,ans;
scanf("%d",&n);
while (n--)
{
scanf("%d%d",&a,&b);
if ((int)sqrt(a)*(int)sqrt(a)==a) //判断a是否为完全平方数
{
ans=(int)sqrt(b)-(int)sqrt(a)+1;
}
else
ans=(int)sqrt(b)-(int)sqrt(a);
printf("%d\n",ans);
}
return 0;
}