| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1194 人关注过本帖
标题:一道经典的C语言题。我是想了好久啊。就是无法弄出头绪
只看楼主 加入收藏
a151141
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:197
专家分:680
注 册:2012-10-19
收藏
得分:2 
约瑟夫问题
算法思路:用一个不带头结点的循环链表来处理Josephu问题,先构成一个有n个结点的单循环链表,然后从第k结点起从1计数,计到m时,对应结点从链表中删除;然后再从被删除结点的下一个结点起又从1开始计数……,直到所有结点都出列时算法结束。
void Josephu(Link L,int n, k, m)
{ int i ; Link p,r ;L=NULL; //置空表
    for (i=1;i<=n;i++)  //建立循环链表
      { p= (Link)malloc(sizeof(Lnode));
         p->data = i;
         if (L= =NULL)  L=p;
         else  r->next=p;   
         r=p;}
    p->next=L;   //环起来      
    p=L;
    for (i=1;i<=k–1;i++)
        { r=p; p=p->next; } //找到第k个结点
while (p->next!=p)   //结点数>1时
    { for (i=1;i<=m-1;i++)   
        { r=p; p=p->next; }  //报数
      r->next=p->next;   //删除当前出列的p结点
      printf (“%d”,p->data);   //打印序号
      free(p);  
      p=r->next;   
      //取下一报数的起点指针
      }
      printf (“%d\n”,p->data);}  
     //打印最后一个结点的序号
}


世界上幸福的事就是抓到一只羊,更幸福的事就是抓到两只羊……
2012-12-24 12:21
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:1 
有必要那么复杂么??
程序代码:
#include<stdio.h>
#define N 10
int main()
{
    int a[1000] = {0};
    int n, temp;;
    int i = -1, j = 0;
    scanf("%d", &n);
    while (++j <= n)
    {
        temp = N;
        while (temp--)
        {
            i = (i + 1) % n;
            while (a[i])
                i = (i + 1) % n;
        }
        a[i] = 1;
        printf("%d\t", i + 1);
    }
    puts("");
    return 0;
}


[ 本帖最后由 azzbcc 于 2012-12-24 23:17 编辑 ]


[fly]存在即是合理[/fly]
2012-12-24 13:42
冰冻零点
Rank: 3Rank: 3
来 自:西安电子科技大学
等 级:论坛游侠
帖 子:81
专家分:136
注 册:2012-9-18
收藏
得分:0 
发现代码错了,重发
int left[n]={0};

int count=0,leftnum=0,i;

while(1)

{for(i=0;i<n;i++)

{if(left[i])continue;

else count++;

if(!count%3){left[i]=1;leftnum++;}

if(leftnum==n-1) break;}

if(leftnum==n-1) break;

}

好好学习,天天向上
2012-12-24 20:05
Magic_July
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:102
专家分:109
注 册:2012-9-25
收藏
得分:0 
我觉得12L的程序会出现死循环,不知道12L自己有没有自己运行过,我在纸上用n=6带入,然后,我就进入死循环了,不知道是不是自己的错,爪机无力啊
2012-12-24 22:54
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
回复 14楼 Magic_July
是有错,我把报数的号码定为10, 没考虑人数少于10的情况,需要做修改,多谢指出


[fly]存在即是合理[/fly]
2012-12-24 23:15
ssz8930
Rank: 2
等 级:论坛游民
帖 子:21
专家分:38
注 册:2012-10-30
收藏
得分:0 
学习一下。
2012-12-24 23:35
shenguanlin
Rank: 1
等 级:新手上路
帖 子:2
专家分:3
注 册:2012-12-24
收藏
得分:1 
# include "stdio.h"
# define MAX 100
void main()
{
    int i,j,n,num,count,t;
    int a[MAX];
    printf("Input num of people:\n");
    scanf("%d",&n);
    for(i=0;i<n;i++)
        a[i]=0;
    i = 0;
    count = 0;
    while(1)
    {
        if(a[i]==0&&i<n)
        {
            count++;
            if(count%3==0)
            {
                a[i]=1;
                count=0;
            }
            i++;
        }
        else if(i>=n)
        {
            t=0;
            for(j=0;j<n;j++)
                if(a[j]==0)
                    t++;
            if(t==1)
            {
                for(j=0;j<n;j++)
                {
                    if(a[j]==0)
                        printf("Person left is:No.%d",j+1);
                }
               
                break;
            }
            else
                i=0;
        }
        else
            i++;
    }
}
2012-12-25 21:17
小小战士
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:569
专家分:1313
注 册:2012-11-3
收藏
得分:0 
https://bbs.bccn.net/viewthread.php?tid=391531&page=1#pid2208447
收到的鲜花
  • 小飞蛋2013-01-07 18:00 送鲜花  1朵  

小小战士,战士中的战斗机!
2012-12-25 21:29
和尚庙
Rank: 1
来 自:河北廊坊
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-11-23
收藏
得分:0 
学习
2012-12-28 08:45
快速回复:一道经典的C语言题。我是想了好久啊。就是无法弄出头绪
数据加载中...
 
   



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

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