平方十位数
题目描述
由0~9这10个数字不重复、不遗漏,可以组成很多10位数字。
这其中也有很多恰好是平方数(是某个数的平方)。
比如:1026753849,就是其中最小的一个平方数。
请你找出其中最大的一个平方数是多少?
输出
输出一个整数表示答案
答案
这道题其实非常简单,两种思路,一种是穷举10位大数,再开根号判断。
一种是穷举平方根,乘方后判断。
方法一: 穷举大数
#include <iostream>
#include <math.h>
using namespace std;
int num[11];
bool vis[10];
int sum;
int sum1,sum2,sum3;
long long n=99380,x,y,z;
void dfs(int index){
if(index==11){
x=0;
for(int i=1;i<=10;i++){
x=x*10+num[i];
}
if(x%2!=0) return;
y=sqrt(x);
if(y*y==x){
cout<<x<<endl;
exit(0);
}
}
for(int i=9;i>=0;i--){
if(!vis[i]){
vis[i]=true;
num[index]=i;
dfs(index+1);
vis[i]=false;
}
}
}
int main() {
for(int i=0;i<10;i++){
vis[i]=false;
}
dfs(1);
return 0;
}
答案:9814072356
方法二: 穷举平方根
1026753849的平方根是32043,9876543210的平方根是99380。也就是平方根只会在32043到99380之间,我们只需穷举这些数,从大到小,乘方后满足条件的第一个数就是答案。
#include <iostream>
#include <math.h>
using namespace std;
bool pan(long long z){
bool visz[11]={false,false,false,false,false
,false,false,false,false,false,false};
int q,flag=0;
while(z!=0){
q=z%10;
if(!visz[q]){
visz[q]=true;
flag++;
}
else{
return false;
}
z=z/10;
}
for(int i=0;i<11;i++){
visz[i]=false;
}
return true;
}
int main() {
for(int i=0;i<10;i++){
vis[i]=false;
}
while(n>32043){
x=n*n;
//cout<<x<<' ';
if(pan(x)){
cout<<x<<endl;
exit(0);
}
n--;
}
return 0;
}
答案:9814072356