主要思路
首先,这道题范围在 \(10^9\),我们不可能直接从 \(1\) 循环到 \(N\)。我们不难看出,这道题是求平方数的八进制是否回文,那些不是平方数的例如 \(2\) 呀,\(3\) 呀这些都是不用考虑的。我们循环也只用从 \(1\) 到 \(\left\lfloor\sqrt{n}\right\rfloor\) 就可以了。这样,时间复杂度就大大降低了。其余部分就没什么好说的了,详见代码。
AC 代码:
cpp
#include<iostream>
using namespace std;
string l0z8(int n){
string s;
while(n){
s=char(n%8+48)+s;
n/=8;
}
return s;
}
bool isHw(int n){
string s=l0z8(n);
int l=0,r=s.size()-1;
while(l<=r){
if(s[l]!=s[r])return 0;
l++,r--;
}
return 1;
}
int main(){
int n;
cin>>n;
for(int i=1;i*i<=n;i++){
if(isHw(i*i)){
cout<<i*i<<' ';
}
}
return 0;
}
代码时间复杂度:\(\mathcal O\left(4\times\log_88\times\left\lfloor\sqrt{n}\right\rfloor\right)\)