这题实在恶心,题目意思根本没有表达清楚,如果你跟我一样把数拆为多位,然后判断平方,绝对错,例如441,169<=441<=10000,且可以分为2/2/1,如果按题目意思来他是拼接平方数吧,但是他不在测试用例内。
题目真实意思:1.数本身为平方数。2.如果数位不为1,拆分为2块且2块都为平方数。
在这里声明,我写了很多库函数,如果看不懂很正常你可以查,不想写过多没用的注释。
#include <bits/stdc++.h>
using namespace std;
const int N=1e6;
bool check(int k){//判断是否为平方数
if(k==0)return false;
double x=sqrt(k),y=(int)x;//含有小数的:非平方数,不含小数的:平方数
return x==y;
}
vector<int> res;
int init=[](){
for(int i=1;i<=N;++i){
int ten=(int)log10(i)+1;//判断i的数位有多少,例如:1000,ten=4
if(ten==1){//数位为1
if(check(i))res.push_back(i);
continue;
}
if(!check(i))continue;//如果不符合i为平方数,直接跳过
//分成两部分,pre+suf==平方数(true)
string str=to_string(i);//转为string
for(int j=1;j<ten;++j){
//atoi函数是c库里的将char*转化为int,string::substr切割子串,c_str:让string也能在c库函数中使用(没有过多的了解)
int pre=atoi(str.substr(0,j).c_str()),suf=atoi(str.substr(j,ten-j).c_str());
if(check(pre)&&check(suf)){
res.push_back(i);
break;
}
}
}
return 0;
}();
int main(){
int a,b;
cin>>a>>b;
for(auto& x:res)
{
if(x>=a&&x<=b)
cout<<x<<endl;
}
return 0;
}
结束了