| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 797 人关注过本帖
标题:约瑟夫环的解,有更好的方法吗?
取消只看楼主 加入收藏
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:1 
约瑟夫环的解,有更好的方法吗?
假设有编号为 0——16 共17个人围成一个圆圈,编号为 0 的人从 1 开始报数,报数为 3 的人自动从圈子里退出,并输出几号退出了,当只剩 1 个人的时候,请输出他的编号。
调试了两个小时写的代码,用最笨的方法,有比这个还简单的吗?
#include <stdio.h>
int main()
{
  int a[17];
  int num,b,c;    //c计算次数,判断剩余人数;
  for(b=0,c=0;b<17;b++,c++)    //为数组a的每个元素赋值,代表人的编号
  {
      a[b]=c;
  }
  for(num=1,b=0,c=0;num<100;num++,b++)
  {
    if(b==17)   //当下标超过界限,从 0 重来;
       b=0;
    while(a[b]==18)   //如果数组内的值等于 18 ,判断下一个元素,直到不为 18 时结束。
    {
      b++;
      if(b==17)      //当下标超过界限,从 0 重来;
         b=0;
    }
    if(num%3==0)    //如果报的数能被 3 整除;
    {
       a[b]=18;      //为数组内对应的元素赋值为 18;
       printf("%d号离开了\n",b);
       c++;     //次数加 1 ;
    }
     if(c>=16)    //如果次数大于等于16,剩余一个人时,停止;
        break;
   }
   for(b=0;b<17;b++)
   {
      if(a[b]!=18)
      {
        printf("最后剩余的是 %d 号\n",a[b]);
       }
    }
return 0;
}
搜索更多相关主题的帖子: 计算 include 约瑟夫 
2013-04-02 10:51
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
忙碌了几天了也没空上网了,之所以没有到网上搜也是想看看大家能有什么好的方法来实现,朋友们看问题的时候也可以跟着题意来练习一下(不是吗?)回了这么多贴还没来得及认真的分析和总结一下,先结贴吧,遇到问题了能先解决,再优化是更好的,这样才能增加自己的分析和动手能力吧?
2013-04-09 10:09
快速回复:约瑟夫环的解,有更好的方法吗?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017579 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved