可以利用cishu数组来记录每个数字是否被淘汰。
本题的关键就是再算出如题的数组b的时候向a数组检查是,不能因为第一个数被淘汰而不算他的吉祥数,应在一轮计算结束的时候遍历要淘汰的数字,故cishu数组可以等于一,在检查结束后再将其加一。
点击查看代码
/*本题的关键就是再算出如题的数组b的时候向a数组检查是,不能
因为第一个数被淘汰而将其算出的吉祥数淘汰
应在一轮结束后在淘汰,故cishu数组可以等于一,
在检查结束后再将其加一*/
#include<stdio.h>
#include<algorithm>//sort头文件
using namespace std;//使用命名空间(c++函数要写的哦)
int pow(int a, int b)
{
int i, c = 1;
for (i = 1; i <= b; i++)
{
c = c * a;
}
return c;
}
int main()
{
int n, i, a[250],b[250], c = 0, ge, shi, bai, j, k = 2, cishu[250] = { 0 }, m, zhi, max = 0,x,y;
scanf("%d", &n);
while (scanf("%d", &a[c]) != EOF)
{
c++;
}
sort(a, a + c);//可以先利用sort函数排序
for (i = 1; i <= n; i++)
{
for (j = 0; j < c; j++)
{
ge = a[j] % 10;
shi = a[j] / 10 % 10;
bai = a[j] / 100;
b[j] = pow(ge, k) + pow(shi, k) + pow(bai, k);//算出该数的吉祥数
}
for (m = 0; m < c; m++)
{
if (cishu[m] == 1 || cishu[m] == 0)//记住 次数可以等与1,因为要在所有吉祥数都算出来之后在进行第一轮的淘汰
{
for (x = 0; x < c; x++)
{
if (a[m] == b[x] && (cishu[x] == 0||cishu[x]==1))
{
cishu[m]++;
}
}
}
}
for (x = 0; x < c; x++)
{
if (cishu[x] == 1)
{
cishu[x]++;//cishu等于一的下标应该被淘汰
}
}
k++;//次幂数加一
}
for (i = 0; i < c; i++)
{
if (cishu[i] == 0)//c次循环后剩余的数就是所求的数
{
printf("%d ", a[i]);
}
}
return 0;
}