思路
每一个数是从 1 ≤ n ≤ 1 0 9 1 \leq n \leq 10^9 1≤n≤109,他开平方后取值 t t t为 1 ≤ t < 4 × 1 0 4 1\leq t < 4\times10^4 1≤t<4×104,开三次方后取值 t t t为 1 ≤ t ≤ 1 0 3 1\leq t \leq10^3 1≤t≤103。所以对于每一个给出的 n n n,我们只需让 i i i从 1 1 1 ∼ \sim ∼ n \sqrt{n} n遍历一遍,看 i 2 , i 3 i^2,i^3 i2,i3的值有多少在 1 ∼ n 1\sim n 1∼n之间即可
代码
#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
int main(){
int n;cin>>n;
while(n --){
map<int,int> mp;
int x, res = 0;cin>>x;
for(int i = 1; i <= sqrt(x); i ++){
if(i <= 1000){
if(i*i <= x && !mp[i*i]){
res ++;
mp[i*i] = 1;
}
if(i*i*i <= x && !mp[i*i*i]){
res ++;
mp[i*i*i] = 1;
}
}
else{
if(i*i <= x && !mp[i*i]){
res ++;
mp[i*i] = 1;
}
}
}
cout<<res<<endl;
}
return 0;
}