Problem1184: 零基础学C/C++184——吉祥数
题目描述
为了迎接圣诞,信息学兴趣小组的同学在辅导老师的带领下,举办了一个盛大的晚会,晚会的第一项内容是做游戏:猜数。老师给每位同学发一张卡片,每张卡片上都有一个编号(此编号为非负数,且小于255),每个编号互不相同。老师制定了以下的游戏规则:第一轮,每位同学将自己卡片上编号的各位数字进行平方后再相加得到一组新数,编号在这组新数中出现的同学淘汰出局,第二轮,余下的同学再将编号的各位数字进行立方相加得到一组新数,编号在这组新数中出现的同学再淘汰出局,第三轮,余下的同学再将编号的各位数字进行4次方相加得到一组新数,编号在这组新数中出现的同学再淘汰出局,……,以此类推,经过n轮后,仍留下来的同学,将获得圣诞特别礼物,卡片上的数即为2019年吉祥数。(假定班级人数不超过200人)
输入
输入有两行,第1行为1个正整数n(n<8),表示有n轮游戏,第二行是卡片上互不相同的编号。
输出:剩下来的各个吉祥数,按从小到大顺序输出,每两个数之间有一个空格。
输出
输出是1行,为剩下来的各个吉祥数,按从小到大顺序输出,每两个数之间有一个空格。
样例输入
1
24 123 2 12 20 14 4 6 36 72
样例输出
2 6 12 24 72 123
#include<bits/stdc++.h>
using namespace std;
int mypow(int n, int lun)//按照规则平方
{
int sum = 0;
while (n)
{
int t = n % 10;
sum += pow(t, lun);
n /= 10;
}
return sum;
}
struct ac
{
int id;//编号
int panduan;//判断是否淘汰 0淘汰
int hou;//编号计算之后存放
}a[1000];
int main()
{
int n;
while (cin >> n)//轮数
{
int t = 0;
while (cin >> a[t].id)//输入编号
a[t++].panduan = 1;//判断先置1 表示不出局
for (int i = 1;i <= n;i++)//进行几轮操作
{
for (int j = 0;j < t;j++)
if (a[j].panduan)//判断是否出局
a[j].hou = mypow(a[j].id, i + 1);//平方运算
for (int j = 0;j < t;j++)
for (int q = 0;q < t;q++)
if (a[j].id == a[q].hou && a[j].panduan)
a[j].panduan = 0;//出局
}
int b[10000], q = 0;
for (int i = 0;i < t;i++)
if (a[i].panduan)
b[q++] = a[i].id;
sort(b, b + q);//从小到大排序
for (int i = 0;i < q;i++)
cout << b[i] << " ";
cout << endl;
}
}