题目描述
为了迎接圣诞,信息学兴趣小组的同学在辅导老师的带领下,举办了一个盛大的晚会,晚会的第一项内容是做游戏:猜数。老师给每位同学发一张卡片,每张卡片上都有一个编号(此编号为非负数,且小于255),每个编号互不相同。老师制定了以下的游戏规则:第一轮,每位同学将自己卡片上编号的各位数字进行平方后再相加得到一组新数,编号在这组新数中出现的同学淘汰出局,第二轮,余下的同学再将编号的各位数字进行立方相加得到一组新数,编号在这组新数中出现的同学再淘汰出局,第三轮,余下的同学再将编号的各位数字进行4次方相加得到一组新数,编号在这组新数中出现的同学再淘汰出局,……,以此类推,经过n轮后,仍留下来的同学,将获得圣诞特别礼物,卡片上的数即为2007年吉祥数。(假定班级人数不超过200人)
输入格式
输入有两行,第1行为1个正整数n(n<8),表示有n轮游戏,第二行是卡片上互不相同的编号。
输出:剩下来的各个吉祥数,按从小到大顺序输出,每两个数之间有一个空格。
输出格式
输出是1行,为剩下来的各个吉祥数,按从小到大顺序输出,每两个数之间有一个空格。
样例输入
124 123 2 12 20 14 4 6 36 72
样例输出
2 6 12 24 72 123
裸裸地模拟啊
要注意细节问题
交了3遍才过!!!
首先 要注意数可能是有重复的
其次 还要标记是哪一轮删除的
避免同一轮中 前面的数将后面的数删除 导致不计算后面的数的情况
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int s[222];
int num[288],chosen[288];
int casenum,m;
int a,b,c;
int pow(int s,int i)
{
int ans=1;
while(i){i--;ans*=s;}
return ans;
}
int calc(int s,int i)
{
int ans=0;
while(s)
{
ans+=pow(s%10,i);
s/=10;
}
return ans;
}
int main()
{
scanf("%d",&casenum);
m++;while(scanf("%d",&s[m])==1)
{
num[s[m]]++;
m++;
}
m--;
for(a=1;a<=255;a++)if(chosen[a])cout<<a<<" ";
for(a=1;a<=casenum;a++)
for(b=0;b<=255;b++)
if(num[b]&&(!chosen[b]||chosen[b]==a))
{
int t=calc(b,a+1);
if(t<=255)chosen[t]=a;
}
for(a=1;a<=255;a++)if(!chosen[a]&&num[a])
{
while(num[a])
{
cout<<a<<" ";
num[a]--;
}
}
return 0;
}