先上代码,后面思路。
#include<iostream>
using namespace std;
bool wonderful(int num);
void bubbleSort(int a[], int n);
int main()
{
for (int i = 10;i < 100;i++)
{
if (wonderful(i))
{
cout << i << endl;
}
}
return 0;
}
bool wonderful(int num)
{
int standard[10] = { 0,1,2,3,4,5,6,7,8,9 };//创建一个标准数组
int square, cube, a, b, c, d, e, f, g, h, i, j;//创建平方,立方和10位数字
square = num * num, cube = num * num * num;
a = square % 10;//获得每位的数字
b = square / 10 % 10;
c = square / 100 % 10;
d = square / 1000;
e = cube % 10;
f = cube / 10 % 10;
g = cube / 100 % 10;
h = cube / 1000 % 10;
i = cube / 10000 % 10;
j = cube / 100000;
int temp[10] = { a,b,c,d,e,f,g,h,i,j };//将得到的每位数字创建为一个数组,便于储存
bubbleSort(temp, 10);//冒泡排序函数
for (int i = 0;i < 10;++i)//排序完之后,如果和标准数组一样,及满足题目条件
{
if (temp[i] == standard[i])
{
continue;
}
else
{
return false;
}
}
return true;
}
void bubbleSort(int a[], int n)//冒泡排序
{
for (int k = 1; k < n;k++)// 执行 n-1 次扫描
{
for (int j = 0;j < n - k;++j)// 只处理元素 a[0] 至 a[n-k]
{
if (a[j] > a[j + 1])
{
int tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
}
}
主要的题目思路是:先猜,一个数的平方加上立方的位数等于10且不重复,那么能猜出这个数应该是个两位数,那么平方后的数应该是个四位数,立方后的数应该是个6位数。
所以可以先建立一个10个元素的数组,通过取余(%)和整除(/)分离平方数和立方数的各个位数,取值于新建的数组中,如果该数组的元素不重复包含0-9,把这个数组用冒泡排序,从小排到大,与标准数组进行比较后,相同的话即可得到奇妙数字。