用pl/sql游标实现约瑟夫环

什么是约瑟夫环:

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。

创建一个全局临时表:

create global temporary table temp(t_id int) on commit delete rows;

游标实现约瑟夫环:

declare
  --总人数
  v_total number:=&v_total;
  --对应的m
  v_step number:=&v_step;
  --剩余的人数
  v_surplus number;
  --计数
  v_count number:=0;
begin
  --将数据插入到表中
  for i in 1..v_total loop
    insert into temp values(i);
  end loop;
  v_surplus:=v_total;
  while v_surplus>1 loop
    --声明一个游标
    declare
      cursor c_temp
      is
      select * from temp;
      c_row c_temp%rowtype;
    begin
      open c_temp;  
      loop
        fetch c_temp into c_row;
        exit when c_temp%notfound;
        v_count:=v_count+1;
        --判断是否报到m的倍数,是则从表中删除
        if mod(v_count,v_step)=0 then
          dbms_output.put_line(c_row.t_id);
          delete from temp where t_id=c_row.t_id;
        end if;
      end loop;
      close c_temp;
    end;
    --重新计数剩余的人数
    select count(*) into v_surplus from temp;
  end loop;
  commit;
end;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值