【题目来源】
https://www.luogu.com.cn/problem/B4553
【题目描述】
小杨同学正在研究完全平方数。
平方: 一个数的平方等于这个数乘以这个数本身。
完全平方数: 指可以恰好表示为某个正整数的平方的数。
例如,9 是完全平方数,因为 9=3×3;但 27 不是,因为 27 不能表示为任何正整数的平方。
给定两个正整数 l 和 r(保证 l≤r),小杨同学想知道 l 到 r 之间的所有正整数中(包含 l 和 r),有多少个数是完全平方数。
【输入格式】
输入两行,第一行为一个正整数 l,第二行为一个正整数 r。
【输出格式】
输出一个非负整数,表示 l 到 r 中,有多少个正整数是完全平方数。如果 l 到 r 中没有完全平方数,则输出 0。
【输入样例】
1
21
【输出样例】
4
【数据范围】
1≤l≤r≤2000。
【算法分析】
● 当 ri 极大(如 10^12)时,有如下优化代码。
算法原理很简单:
令 a = floor(sqrt(le-1)),表示小于 le的最大完全平方数的平方根。
令 b = floor(sqrt(ri)),表示不大于 ri的最大完全平方数的平方根。
则区间内的完全平方数个数 = b - a。
cpp
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL le,ri,ans;
int main() {
cin>>le>>ri;
le=sqrt(le-1);
ri=sqrt(ri);
cout<<ri-le<<endl;
return 0;
}
/*
in:
1
21
out:
4
*/
【算法代码】
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int ans=0,le,ri;
cin>>le>>ri;
for(int i=1; i*i<=ri; i++) {
if(i*i>=le) ans++;
}
cout<<ans<<endl;
return 0;
}
/*
in:
1
21
out:
4
*/
【参考文献】
https://gesp.ccf.org.cn/101/attach/1753295276212256.pdf