A—完全平方数 牛客网挑战赛次查询[l,r]范围内的完全平方数个数 定义整数x为完全平方数当且仅当可以找到整数y使得y*y=x 输入描述: 第一行一个数n表示查询次数 之后n行每行两个数l,r 输出

题目描述

多次查询[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;
}

猜你喜欢

转载自blog.csdn.net/a1204675546/article/details/78886621
今日推荐