洛谷 B4553:[GESP202606 二级] 完全平方数计数

【题目来源】
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