说明
徐老师最近了解到一种特殊的编码方式—— xx 幂次编码,将一个数的各位数字进行 xx 次幂计算然后相加,得到一个新的数。
例如 123123 的 22幂次编码则是 1^2 + 2^2 + 3^2 =1412+22+32=14
现在徐老师给他的小伙伴们每个人发了一个数字,并且告诉他们,他们之间存在一些"特殊数字",那怎么找出这些 "特殊数字" 呢?
徐老师给小伙伴们定下了一个游戏规则,游戏总共进行 nn 轮,编号分别为 2 \sim n+12∼n+1。
第 ii 轮每个人要把自己手中这个数字对应的 ii 幂次编码给计算出来,得到一组数字,如果有人手里的数字和这组编码中的数字相同,这个人则会出局,不再参与接下来的游戏。
第 i + 1i+1 轮则由上一轮剩余的人继续游戏,直到 nn 轮游戏结束
最后还没有出局的人手里拿的数字则是 "神秘数字",拥有 "神秘数字" 的小伙伴可以在徐老师那里领取一份礼物
现在徐老师已经决定了游戏要进行 nn 轮,但是他的计数能力非常差,他不知道有多少个小伙伴来参加,只知道有哪些数字发出去了。
你能告诉徐老师这些数里有哪些是 "神秘数字" 吗?
输入格式
输入第一行包含一个正整数 nn 表示游戏共有 nn 轮
第二行是数量未知的互不相同的数字a_iai,以空格隔开
对于 100\%100%的数据,1 \leq n \leq 8, 0 \leq a_i \leq 2541≤n≤8,0≤ai≤254,题目保证人数不会超过 200200 人
输出格式
输出只有一行,从小到大输出所有神秘数字,中间用空格隔开
样例
输入数据 1
1
24 123 2 12 20 14 4 6 36 72
Copy
输出数据 1
2 6 12 24 72 123
这道题是一个很简单的模拟题。大体意思就是n轮游戏,第i轮都要算出i+1幂次编码,最后双for遍历编码后的数组和原数组,如果相等,则将原数组的那一项标记为-1,n轮之后直接输出没被标记的即可
注意,因为最后输出要求有序,所以必须先对原数组排序!
#include <bits/stdc++.h>
using namespace std;
long long a[10001], m,b[10001],len,n,t;
long long f(int x, int y)
{
long long ans = 0;
while (x > 0)
{
ans += pow(x % 10, y + 1);
x = x / 10;
}
return ans;//计算幂次编码的函数
}
int main()
{
cin>>n;
while(scanf("%d",&t) != EOF)//输入
{
if(t == -1) break;
m++;//长度++
a[m] = t;
}
sort(a + 1, a + m + 1);//排序
for(int i = 1; i <= n; i++)//n轮
{
len = 0;
for(int j = 1; j <= m; j++)
if(a[j] != -1)
{
len++;
b[len] = f(a[j],i);//获得a[j]的幂次编码
}
for(int j = 1; j <= len; j++)
for(int p = 1; p <= m; p++)
if(b[j] == a[p])
a[p] = -1;//标记
}
for(int i = 1; i <= m; i++)
if(a[i] != -1)
cout<<a[i]<<" ";
return 0;
}