题目描述:
小明正看着 203879 这个数字发呆。原来,203879 * 203879 = 41566646641。这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。具有这样特点的6位数还有一个,请你找出它!再归纳一下筛选要求:1. 6位正整数;2. 每个数位上的数字不同;3. 其平方数的每个数位不含原数字的任何组成数位。答案是一个6位的正整数。
解题思路:
首先无脑枚举找出每个数位上数字不同的6位正整数,然后用bool型函数check来检查数字y中是否每个数位出现的数字在x中都不曾出现过,这一步可以用自定义函数ll2s来把long long型的数字转换成string型再用find进行查找,最后输出即可。
AC代码:
代码语言:javascript复制#include <bits/stdc .h>
using namespace std;
#define Up(i,a,b) for(int i = a;i <= b; i )
typedef long long ll;
void ll2s(ll x,string &str) //把long long转换成string
{
stringstream ss;
ss << x;
ss >> str;
}
bool check(ll x,ll y) //检查y中是否含有x中的数字
{
string strx,stry;
ll2s(x,strx);
ll2s(y,stry);
Up(i,0,strx.length()-1)
{
if(stry.find(strx[i]) != string::npos)
{
return false;
}
}
return true;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
Up(i,1,9)
{
Up(j,0,9)
{
if(i!=j)
{
Up(k,0,9)
{
if(k!=i && k!=j)
{
Up(l,0,9)
{
if(l!=i && l!=j && l!=k)
{
Up(m,0,9)
{
if(m!=i && m!=j && m!=k && m!=l)
{
Up(n,0,9)
{
if(n!=i && n!=j && n!=k && n!=l && n!=m)
{
ll x = i*1e5 j*1e4 k*1e3 l*1e2 m*10 n;
ll y = x*x;
if(check(x,y) && x!=203879) cout << x << endl;
}
}
}
}
}
}
}
}
}
}
}
return 0;
}