完全平方数(模拟 思维)

完全平方数

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; 
}

入门课第三节习题题解

全部评论

相关推荐

Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
我即大橘:耐泡王
点赞 评论 收藏
分享
评论
3
收藏
分享
牛客网
牛客企业服务