| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 797 人关注过本帖
标题:约瑟夫环的解,有更好的方法吗?
只看楼主 加入收藏
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
约瑟夫环的解,有更好的方法吗?
假设有编号为 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
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
收藏
得分:4 
这是我在经典算法题里面找到的,看看能不能帮到你
#include<stdio.h>
main()
{   int N,M,S;
    int man[100]={0};
    int count=1;
    int i=0,p=-1;

    printf("请输入人数N(0<N<100):");
    scanf("%d",&N);
    printf("请输入死亡数字M:");
    scanf("%d",&M);
    printf("请输入从第几个人数起:");
    scanf("%d",&S);
   
    while(count<=N)
    {
        do{
            p=(p+1)%N;
            if(man[p]==0)
                i++;
            if(i==M)
            {
                i=0;
                break;
            }
        }while(1);
        man[p]=count;
        count++;
    }
    printf("约瑟夫排列为:");
    for(i=N-S+1;i<N;i++)
        printf("%d ",man[i]);
    for(i=0;i<N-S+1;i++)
        printf("%d ",man[i]);
    printf("\n");
    return 0;
}


三十年河东,三十年河西,莫欺少年穷!
2013-04-02 11:40
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:0 
用不了那么多判断

Maybe
2013-04-02 11:42
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:7 
程序代码:
#include <stdio.h>
int main(void)
{
  int n,m,i,s=0;
  printf ("N M = ");
  scanf("%d%d",&n,&m);
  for (i=2; i<=n; i++)
   s=(s+m)%i;
  printf ("The winner is %d\n",s);
  return 0 ;
}


[fly]存在即是合理[/fly]
2013-04-02 13:29
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
这个百度一下全出来了,楼主为何不自己动手搜一下呢

总有那身价贱的人给作业贴回复完整的代码
2013-04-02 14:22
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9032
专家分:54061
注 册:2011-1-18
收藏
得分:5 
题目看过无数遍,但一直没写过,闲来无聊,随手写了一个,不知道结果对不对

以下代码由MinGW4.7.2(编译参数-std=c99)编译通过
程序代码:
#include <stdio.h>

int main(void)
{
    int buf[18] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,-1 };
    for( int c=0; buf[0]!=-1; )
    {
        int d=0, s=0;
        for( ; buf[s]!=-1; ++s )
        {
            if( (s+c)%3 != 2 )
                buf[d++] = buf[s];
            else
                printf( " %d", buf[s] );
        }
        buf[d] = -1;
        c = (s+c)%3;
    }

    return 0;
}

2013-04-02 14:24
helloUJS
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:168
专家分:731
注 册:2013-3-27
收藏
得分:4 
#include <stdio.h>
main()
{int a[17],i,k,cnt;
 for(i=0;i<17;i++)
    a[i]=1;
 i=0;k=0;
 cnt=0;
 while(k<16)
   {
     cnt+=a[i];
     if(cnt==3)
        {
          k++;
          a[i]=0;
          cnt=0;
         }
     i=(i+1)%17;
    }
 for(i=0;i<17;i++)
   if(a[i])
       printf("%d\n",i);
}
2013-04-02 22:29
tompobing
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:260
专家分:809
注 册:2012-12-9
收藏
得分:0 
..
2013-04-04 18:36
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
忙碌了几天了也没空上网了,之所以没有到网上搜也是想看看大家能有什么好的方法来实现,朋友们看问题的时候也可以跟着题意来练习一下(不是吗?)回了这么多贴还没来得及认真的分析和总结一下,先结贴吧,遇到问题了能先解决,再优化是更好的,这样才能增加自己的分析和动手能力吧?
2013-04-09 10:09
y3765258
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:106
专家分:172
注 册:2013-4-9
收藏
得分:0 
我的妈呀,看到您的程序,吓到了。 代码不写了,我有一道类似的题。
/*酋长女儿结婚,报单出,题目类似*/
#include<stdio.h>
void main()
{
    int i,j=0,k,n=101,a[200],b[200];
    for(i=1;i<=n;i++)
        a[i]=i;
    while(1)
    {
        for(i=1;i<=n;i++)
        {
            if(i%2==0)
                a[j++]=a[i];
        }
        if(j==1)
            break;
        n=j;
        j=0;
    }
    printf("第%d人\n",a[0]);
}

有问题一起探讨,一起进步。
2013-04-09 16:36
快速回复:约瑟夫环的解,有更好的方法吗?
数据加载中...
 
   



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

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