二、题目: 排它平方数
小明正看着 203879 这个数字发呆。
原来,203879 * 203879 = 41566646641
这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。
具有这样特点的6位数还有一个,请你找出它!
再归纳一下筛选要求:
- 6位正整数
- 每个数位上的数字不同
- 其平方数的每个数位不含原数字的任何组成数位
**分析思路:**看到这样的题目,首先考虑递归,枚举,暴力解法等。
题目中要求在0-9中不要有重复的数字,计算平方数并且不能有原有的数字,这是一个突破口,从平方想到
- 0的平方为0
- 1的平方为1
- 5的平方为5
- 6的平方为6
以上这4个数字都不能作为原数字的最后一位,可以在最后一位排除
第一位还不能为0
代码:
#include<iostream>
#include<sstream>
using namespace std;
bool check(long long x,long long xx); //6位数平方后会超出数据范围,定义为long long
void i2s(long long x,string &basic_string); //函数声明
int main(){
int i,j,k,m,n,g; //分别代表6位数字
long long x;
for(i=1;i<10;i++){
for(j=0;j<10;j++){
if(j!=i)
for(k=0;k<10;k++){
if(k!=i&&k!=j)
for(m=0;m<10;m++){
if(m!=k&&m!=i&&m!=j)
for(n=0;n<10;n++){
if(n!=m&&n!=j&&n!=i&&n!=k)
for(g=0;g<10;g++){
if(g!=n&&g!=m&&g!=k&&g!=j&&g!=k)
long long s=i*100000+j*10000+k*1000+m*100+n*10+g; //采用二进制
if(check(x,x*x)){
cout<<x<<" "<<x*x<<endl;
}
}
}
}
}
}
}
return 0;
}
//检查ss中是否有s已经出现过的数字
bool check(long long x,long long xx){ //将整数转化为字符串来检查
string s_x,s_xx;//将整数转化为字符串来检查
i2s(x,s_x); //转化
i2s(xx,s_xx);
for(int i=0;i<s_x.length();i++){
if(s_xx.find(s_x[i])!=string::npos){ //不等于空的位置
return false;
}
}
return true;
}
void i2s(long long x,string &basic_string){ //引用
stringstream ss;
ss<<x;
ss>>basic_string;
}
运行结果
所以答案:639172