完全平方数(模拟 思维)

完全平方数

https://ac.nowcoder.com/acm/problem/14733

题目描述

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

思路

好像可以不用二分吧……一开始的做法就是直接模拟从sqrt(l)到sqrt(r)走一遍循环累加,复杂度O(nlogr)。后来发现,中间都是连续的啊,所有个数用两个端点一减就行了,注意号边界情况就行,sqrt(l)需要向上取整,复杂度O(n)。

代码1(模拟 O(nlogr))

//完全平方数(模拟) 
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n , l , r;
	scanf("%d" , &n);
	while(n--)
	{
		scanf("%d %d" , &l , &r);
			
		int m = sqrt(l) , ans = 0;
		if(m * m != l)
			m++;
		for(int i = m ; i * i <= r ; i++)
			ans++;
		
		printf("%d\n" , ans);
	}
	return 0;
}

代码2(思维 O(n))

//完全平方数(思维)
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
 	int n , l , r;
 	scanf("%d" , &n);
 	
 	while(n--)
 	{
		scanf("%d %d" , &l , &r);	 
	 	int m = sqrt(l);
	 	if(m * m == l)
	 		m--;
	 	printf("%d\n" , (int)sqrt(r) - m + 1);
	}
	return 0; 
}

入门课第三节习题题解

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-03 17:37
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-02 17:28
25届每天都在焦虑找工作的事情0offer情绪一直很低落硬撑着面了一个岗位岗位有应酬的成分面试的时候hr给我出各种场景题问的问题比较犀利&nbsp;有点压力面的感觉感觉有点回答不上来本来就压抑的情绪瞬间爆发了呢一瞬间特别想哭觉得自己特别没用没绷住掉眼泪了事后想想觉得自己挺有病的&nbsp;真的破大防了
喜欢唱跳rap小刺猬...:我觉得没关系吧,之前有一次面试leader给我压力面,我顶住了压力,结果入职的时候发现组里氛围很差,果断跑路。其实从面试就能大概看出组的情况,面试体验好的组倒是不一定好,但是面试体验不好的组。。。就很难说
点赞 评论 收藏
分享
06-02 15:53
阳光学院 Java
点赞 评论 收藏
分享
龙珠传说:nb,公务员解约不需要支付违约金吧
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务