【问题描述】
由 0 ~ 9 这10个数字不重复、不遗漏,可以组成很多10位数字。
这其中也有很多恰好是平方数(是某个数的平方)。
比如:1026753849,就是其中最小的一个平方数。
请你找出其中最大的一个平方数是多少?
【答案提交】
注意:你需要提交的是一个10位数字,不要填写任何多余内容。
答案:9814072356
题解一
暴力:
#include<iostream>
using namespace std;
typedef long long LL;
bool judge(LL n)
{
int cnt[10] = {0};
while(n)
{
if(cnt[n % 10]) return false;
else cnt[n % 10]++;
n /= 10;
}
return true;
}
int main()
{
for(LL i = 99380; i > 32043; i --)
{
if(judge(i * i))
{
cout << i * i << endl;
break;
}
}
return 0;
}
题解二
DFS:
#include <iostream>
#include <cmath>
using namespace std;
typedef long long LL;
const int N = 15;
int a[N], st[N];
LL minn = 9876543210, maxn;
void dfs(int u)
{
if(u == 10 && a[0] != 0)
{
LL t = 0;
for (int i = 0; i < 10; i ++) t = t * 10 + a[i];
LL x = sqrt(t);
if(x * x == t)
{
if(t < minn) minn = t;
if(t > maxn) maxn = t;
}
return;
}
for (int i = 9; i >= 0; i --)
{
if(!st[i])
{
a[u] = i;
st[i] = true;
dfs(u + 1);
st[i] = false;
}
}
}
int main()
{
dfs(0);
cout << "最小值:" << minn << endl;
cout << "最大值:" << maxn << endl;
}