吉祥数
[问题描述]
为了迎接圣诞,信息学兴趣小组的同学在辅导老师的带领下,举办了一个盛大的晚会,晚会的第一项内容是做游戏:猜数。
老师给每位同学发一张卡片,每张卡片上都有一个编号
(此编号为非负数,且小于255),每个编号互不相同。
老师制定了以下的游戏规则:第一轮,每位同学将自己卡片上编号的各位数字进行平方后再相加得到一组新数,编号在这组新数中出现的同学淘汰出局,
第二轮,余下的同学再将编号的各位数字进行立方相加得到一组新数,
编号在这组新数中出现的同学再淘汰出局,第三轮,余下的同学再将编号的各位数字进行4
次方相加得到一组新数,编号在这组新数中出现的同学再淘汰出局,……,以此类推,经过
n轮后,仍留下来的同学,将获得圣诞特别礼物,卡片上的数即为2007年吉祥数。(假定班
级人数不超过200人)
[输入文件]
输入文件ghillie.in有两行,第1行为1个正整数n(n<8),表示有n轮游戏,第二行是
卡片上互不相同的编号。
输出:剩下来的各个吉祥数,按从小到大顺序输出,每两个数之间有一个空格。
[输出文件]
输出文件ghilie.out是1行,为剩下来的各个吉祥数,按从小到大顺序输出,每两个
数之间有一个空格。
[输入样例]
1
24 123 2 12 20 14 4 6 36 72
[输出样例]
2 6 12 24 72 123
代码:
#include<bits/stdc++.h>
#include<cmath>
#include<algorithm>
using namespace std;
int a[256],b[256];
int ans[256];
bool flag[256];
int n;
int cnt=1;
int f(int u,int s)
{
int t=u,ans=0;
while(t>0)
{
ans+=pow(t%10,s);
t/=10;
}
return ans;
}
int main()
{
cin>>n;
while(cin>>a[cnt])
{
cnt++;
int k=getchar();
if(k=='\n')
break;
}
cnt--;
for(int i=1;i<=cnt;i++)
flag[i]=true;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=cnt;j++)
b[j]=f(a[j],i+1);
for(int i=1;i<=cnt;i++)
for(int j=1;j<=cnt;j++)
if(b[j]==a[i])
flag[i]=false;
}
int x=1;
for(int i=1;i<=cnt;i++)
if(flag[i])
{
ans[x]=a[i];
x++;
}
sort(ans+1,ans+x);
for(int i=1;i<x;i++)
cout<<ans[i]<<' ';
return 0;
}