标题:约瑟夫问题求解(真心想不出来了)
只看楼主
qq799433746
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-3-31
结帖率:0
已结贴  问题点数:20 回复次数:3 
约瑟夫问题求解(真心想不出来了)
程序代码:
#include"stdio.h"
int ant(int n[])//统计函数
{
    int i;
    for(i=0;;)
    {
     if(n[i]==0)
     i++;
     else
     return i;
    }
}
int main()
{  

    int man[200]={0};//游戏人数
    int die=0;//每隔die人死一个
    int k=1;//k为报数计数器
    int t=0;//剩余人数
    int y=0;//人数
    int i=0;//此时轮到报数者
    int z=0;
    printf("请输入游戏人数与报数轮数:");
    scanf("%d %d",&y,&die);//输入游戏人数
    for(i=1;i<=y;i++)
    {
        man[i]=1;//。。。对数组初始化
        //printf("%d",man[i]);
    }
    t=i-1;//让T接任I
    i=1;//清零
     while(t>1)//当游戏人数大于1时开始循环
   {
       if(i==y&&k%die!=0)//此人是否为队伍的最后一人
          {
          i=1;//回去重报
          k++;
          continue;//重新循环
          }
       else if(k%die==0)
          {
          man[i]=0;//这货挂了
          k=1;//报数清0
          t--;//游戏人数减少
          i=1;
          continue;
          }
       if(man[i]!=0&&k%die!=0)//如果此人不为空
          {
          k++;//接着报
          i++;//下一位
          continue;
          }
       if(k%die==0)//此人为要死者
          {
          man[i]=0;//这货挂了
          k=1;//报数清0
          t--;//游戏人数减少
          i++;//下一位!!
          continue;
          }
       if(man[i]==0)//此人是否挂了
          {
          i++;//直接下一位
          continue;
          }
   }
   for(i=1;i<y;i++)
   {
   printf("%d",man[i]);
   }
   z=ant(man);//统计剩下那货是谁
   printf("\t%d",z);
   return 0;
}
试过很多办法但现在不知道哪里错了
搜索更多相关主题的帖子: 约瑟夫 真心 
2013-03-31 18:22
韶志
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:斗气大陆
等 级:贵宾
威 望:44
帖 子:2223
专家分:13592
注 册:2013-3-22
得分:7 
这是我的约瑟夫环,没有你的功能多,但精髓算法都在里面,感觉你的算法有问题
程序代码:
#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-01 00:02
尹金魁2031
Rank: 3Rank: 3
来 自:河南省南阳市
等 级:论坛游侠
帖 子:156
专家分:162
注 册:2012-12-29
得分:7 
2013-04-01 12:20
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2391
专家分:13384
注 册:2013-3-3
得分:7 
这个也是,你看看void Josegh(void)
{
  int i,j,k,s1,w;
  s1=s;
  for(i=1;i<=n;i++)  p[i-1]=i;
    for(i=n;i>=2;i--)
    {
      s1=(s1+m-1)%i;
      if(s1==0)  s1=i;
      w=p[s1-1];
      for(j=s1;j<=i-1;j++)  p[j-1]=p[j];
      p[i-1]=w;
    }
}

Maybe
2013-04-01 12:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-402522-1-1.html




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

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