吉祥数

[问题描述]

为了迎接圣诞,信息学兴趣小组的同学在辅导老师的带领下,举办了一个盛大的晚会,晚会的第一项内容是做游戏:猜数。老师给每位同学发一张卡片,每张卡片上都有一个编号(此编号为非负数,且小于255),每个编号互不相同。老师制定了以下的游戏规则:第一轮,每位同学将自己卡片上编号的各位数字进行平方后再相加得到一组新数,编号在这组新数中出现的同学淘汰出局,第二轮,余下的同学再将编号的各位数字进行立方相加得到一组新数,编号在这组新数中出现的同学再淘汰出局,第三轮,余下的同学再将编号的各位数字进行4次方相加得到一组新数,编号在这组新数中出现的同学再淘汰出局,……,以此类推,经过n轮后,仍留下来的同学,将获得圣诞特别礼物,卡片上的数即为2007年吉祥数。(假定班级人数不超过200人)
[输入文件]
输入文件ghillie .in 有两行,第1行为1个正整数n(n<8),表示有n轮游戏,第二行是卡片上互不相同的编号。
输出:剩下来的各个吉祥数,按从小到大顺序输出,每两个数之间有一个空格。
[输出文件]
输出文件ghillie .out是1行,为剩下来的各个吉祥数,按从小到大顺序输出,每两个数之间有一个空格。
[输入样例]
1
24 123 2 12 20 14 4 6 36 72
[输出样例]
2 6 12 24 72 123

解题思路

这个数据规模不是很大,简简单单的模拟就可以AC,但是有一点比较坑人的就是:每次必须先计算完所有的人的数字,再进行踢人,否则的话前面计算出来就立刻把后面的人踢除了,这样后面的那个人的数字就没有被计算,那么就会留下几个 不应该被留下的小孩。
这告诫我们模拟就要老老实实模拟,不要ZB,@显摆

代码

var j,i,sum,n:integer;
    a,b:array[1..200]of longint;


function jie(n,k:integer):longint;
var a,b,sum,ji,i:longint;
begin
  sum:=0;
  while n>0 do
   begin
    a:=n mod 10;
    n:=n div 10;
    ji:=1;
    for i:=1 to k+1 do ji:=ji*a;
    sum:=sum+ji;
   end;
  exit(sum);
end;

procedure check(n:longint);
var i:integer;
begin
  for i:=1 to sum do
   if a[i]=n then begin a[i]:=0;exit;end;
end;

procedure qsort(b,e:integer);
var l,r,t,m:longint;
begin
  l:=b;r:=e;m:=a[(l+r)>>1];
  while l<r do
   begin
     while a[l]<m do inc(l);
     while m<a[r] do dec(r);
     if l<=r then
       begin
         t:=a[l];
         a[l]:=a[r];
         a[r]:=t;
         inc(l);
         dec(r);
       end;
   end;
  if l<e then qsort(l,e);
  if b<r then qsort(b,r);
end;

begin

  readln(n);
  sum:=0;
  while not eoln do
    begin
      inc(sum);
      read(a[sum]);
    end;
  for i:=1 to n do
    begin
      fillchar(b,sizeof(b),0);
      for j:=1 to sum do
        if a[j]<>0 then b[j]:=jie(a[j],i);
      for j:=1 to sum do check(b[j]);
    end;
  qsort(1,sum);
  for i:=1 to sum do if a[i]<>0 then write(a[i],' ');

end.


测试点1 Accepted / 0ms / 260kB
测试点2 Accepted / 0ms / 260kB
测试点3 Accepted / 0ms / 260kB
测试点4 Accepted / 0ms / 260kB
测试点5 Accepted / 0ms / 260kB
测试点6 Accepted / 0ms / 260kB
测试点7 Accepted / 0ms / 260kB
测试点8 Accepted / 0ms / 260kB
测试点9 Accepted / 0ms / 260kB
测试点10 Accepted / 0ms / 260kB


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值