#759. 徐老师的神秘数字

说明


徐老师最近了解到一种特殊的编码方式—— 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轮之后直接输出没被标记的即可

注意,因为最后输出要求有序,所以必须先对原数组排序!

这道题只要按照题目所给的信息模拟即可。
进行每一轮的运算,将每个编号处理之后产生新的一组数,用另外一个数组 b 存下,然后与第
一个数组中的数进行对比看是否有相同的,把相同的数在数组中标记为 −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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值