奇妙的数字
题目描述
小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。你能猜出这个数字是多少吗?
输出
请输出该数字,不要输出任何多余的内容。
代码
解法一
刚刚好才学过全排列没几天,所以看到题目第一反应就是用全排列,代码如下:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
void check(int a[]){//判断函数
int t1=a[0]*1000+a[1]*100+a[2]*10+a[3];
int t2=a[4]*100000+a[5]*10000+a[6]*1000+a[7]*100+a[8]*10+a[9];
int t=sqrt(t1);
if(t*t!=t1){//注意,如果没有这一句的话,会多输出两个73
return;
}
if(t*t*t==t2){
printf("%d\n",t);
}
}
void perm(int a[],int k,int n){//全排列函数
if(k==n){
check(a);
}
else{
int t;
for(int i=n;i>=k;i--){
{t=a[k];a[k]=a[i];a[i]=t;}
perm(a,k+1,n);
{t=a[k];a[k]=a[i];a[i]=t;}
}
}
}
int main(){
int a[10]={0,1,2,3,4,5,6,7,8,9};
perm(a,0,9);
return 0;
}
解法二:
用set容器,因为set内部存储的数据都不相同,所以可以利用这一点,当set容器长度刚好为10时,证明刚好用完0~9十个数。代码如下:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main(){
set<int> a;
int t1,t2;
int t;
for(int i=10;i<100;i++){
t1=i*i;
while(t1>0){
t=t1%10;
a.insert(t);
t1/=10;
}
t2=i*i*i;
while(t2>0){
t=t2%10;
a.insert(t);
t2/=10;
}
if(a.size()==10){
printf("%d\n",i);
}
a.clear();
//printf("%d ",i);
}
return 0;
}