排他平方数
1.6位正整数
2.每个数位上数字不同
3.其平方的每个数位不含原数字组成的任何数位
#include <iostream>
#include <sstream>
using namespace std;
sstream 头文件必不可少,下的str函数中是stringstream要用到这个头文件。
void str(long long x,string &xx)
{
stringstream ss;
ss<<x;
ss>>xx;
}
上面的这个函数的作用是将数值型转换成字符型,用了stringstream的方法实现
注意:xx的返回值类型必须为引用类型,否则会造成结果的错误
bool check(long long x,long long xx)
{
string x1,xx1;
str(x,x1);
str(xx,xx1);
for(int i=0;i<x1.length();i++)
{
if(xx1.find(x1[i])!=string::npos)
{
return false;
}
}
return true;
}
用穷举的方法将所有六位数都一一列举并验证是否符合条件,注意列举时应当排除有相同数位的数字。
int main()
{
int a1,a2,a3,a4,a5,a6;
for(a1=1;a1<=9;a1++)
{
for(a2=0;a2<=9;a2++)
{
if(a2!=a1)
for(a3=0;a3<=9;a3++)
{
if(a3!=a2&&a3!=a1)
for(a4=0;a4<=9;a4++)
{
if(a4!=a3&&a4!=a2&&a4!=a1)
for(a5=0;a5<=9;a5++)
{
if(a5!=a4&&a5!=a3&&a5!=a2&&a5!=a1)
for(a6=0;a6<=9;a6++)
{
if(a6!=a5&&a6!=a4&&a6!=a3&&a6!=a2&&a6!=a1)
{
long long x=a1*100000+a2*10000+a3*1000+a4*100+a5*10+a6;
long long xx=x*x;
if(check(x,xx))
{
cout<<x<<endl;
}
}
}
}
}
}
}
}
}
最后只输出了两个6位数 203879 和 639172 ,说明只有两个结果符合要求