解题思路给我们了一个大致范围
10的三次方是最小的四位数,30的三次方是五位数,估出一个大致的范围就是10-30
有题目可知这个数的立方和4次方拼接在一起的这十个数字刚好是0-9,那我们可以先将每一位都放进同一个数组,然后排序排序完成后再利用循环检验是否为0-9这10个数字
#include <stdio.h>
int judge(int a)
{
int th = a * a * a;//四位数
int forth = a * a * a * a;//六位数
//接下来实现将每一位装进数组
int arr[10];
arr[0] = th % 10;
arr[1] = th / 10 % 10;
arr[2] = th / 100 % 10;
arr[3] = th / 1000 % 10;
arr[4] = forth % 10;
arr[5] = forth / 10 % 10;
arr[6] = forth / 100 % 10;
arr[7] = forth / 1000 % 10;
arr[8] = forth / 100000 % 10;
arr[9] = forth / 1000000 % 10;
//下一步进行排序
for (int i = 0; i < 9;i++)
{
for (int j = 0; j < 9 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
//排序完成,进行判断
//aim作为标记,如果不是0-9这十个数字aim会变成0,如果是就是1
//判断完成后直接返回aim的值跟我们之前想要达成的效果(符合条件返回1)是一致的
int aim = 1;
for (int r = 0; r < 10; r++)
{
if (r == arr[r])
{
continue;
}
else
aim = 0;//如果这十个数不是0-9各一个的情况就将aim赋值成0
}
return aim;
}
int main()
{
//枚举10-30
for (int a = 10; a < 31; a++)
{
//写一个函数专门用来判断是否符合条件
//初步设想这个函数有返回值如果符合条件返回1,不符合返回0
int three = a * a * a;
int forth1 = a * a * a * a;
if ((three > 1000 && three < 10000) && (forth1 < 1000000 && forth1>100000))
//如果满足条件再进入函数,因为10-30只是一个大致范围
{
int i = judge(a);
if (i == 1)
{
printf("%d", a);
}
}
}
return 0;
}