奇妙的数字
小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。 你能猜出这个数字是多少吗?
请填写该数字,不要填写任何多余的内容。
一开始误以为要找到一个数,它平方和以及它的立方和都是正好把0-9的10个数字都用一次…走了好多弯路。
另外,应该尽量避免循环内部套多个循环,不然break需要借助flag,代码也很繁琐。可以把里面的循环封装成函数,简化程序。
代码1
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
bool outerflag = true; //是否继续寻找
int ctr[10];
int xx=0;
int xxx=0;
int i=40; //用一个平方和立方和小于10位数的数字作为初值(40的平方和立方和共9位数)
while(outerflag && i++) //将outerflag放前面,当找到时可以避免i++的执行
{
xx = i*i;
xxx = i*i*i;
memset(ctr,0,sizeof(ctr)); //一定要在计数前清空
while(xx)
{
ctr[xx%10]++;
xx/=10;
}
while(xxx)
{
ctr[xxx%10]++;
xxx/=10;
}
bool innerflag = true; //是否找到该数字的标志
for(int j=0;j<10;j++)
{
if(ctr[j] != 1)
{
innerflag = false;
break;
}
}
if(innerflag)
{
outerflag = false; //找到就停止继续寻找
}
}
cout<<i<<endl;
return 0;
}
代码2
#include<iostream>
#include<string.h>
using namespace std;
bool solve(int XX, int XXX)
{
int ctr[10];
memset(ctr,0,sizeof(ctr));
while(XX)
{
ctr[XX%10]++;
XX/=10;
}
while(XXX)
{
ctr[XXX%10]++;
XXX/=10;
}
for(int i=0;i<10;i++)
{
if(ctr[i] != 1)
{
return false;
}
}
}
int main()
{
int xx=0;
int xxx=0;
int i=40;
while(i++)
{
xx = i*i;
xxx = i*i*i;
if(solve(xx,xxx))
{
cout<<i<<endl;
break;
}
}
return 0;
}