约瑟夫环算法

liubo_24020209 2010-05-08 03:08:26
类似于以下问题可以用约瑟夫环的算法来解决:
例:用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值(这个值在以后的循环中不再数到),直至说有数据全部输出。

#include <stdio.h>
#include <malloc.h>

typedef struct Node
{
int index;
struct Node *next;
}JosephuNode;

int Josephu(int n, int m)
{
int i, j;
JosephuNode *head, *tail;

head = tail = (JosephuNode *)malloc(sizeof(JosephuNode));

for (i = 1; i < n; ++i)
{
tail->index = i;
tail->next = (JosephuNode *)malloc(sizeof(JosephuNode));
tail = tail->next;
}

tail->index = i;
tail->next = head;

for (i = 1; tail != head; ++i)
{
for (j = 1; j < m; ++j)
{
tail = head;
head = head->next;
}

tail->next = head->next;
printf("第%4d个出局的人是:%4d号\n", i, head->index);
free(head);
head = tail->next;
}

i = head->index;
free(head);
return i;
}

int main()
{
int n, m;

scanf("%d%d", &n, &m);
printf("最后胜利的是%d号!\n", Josephu(n, m));
//system("pause");

return 0;
}
...全文
315 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kensun0 2010-05-08
  • 打赏
  • 举报
回复
不会用格式。。
kensun0 2010-05-08
  • 打赏
  • 举报
回复
#include "Stdio.h"
#include "Conio.h"
#define N 50
#define M 3
int main(void)
{

int i,j=0,k,n=0,t=0,ok=1,num[N],last=0;

for (i=0;i<N;i++)
num[i]=i+1;

while(ok)
{
if (num[j]!=0)
t++;
if (j==N-1)
{
if (t%M==0)
num[j]=0;
j=0;
}
else
{
if (t%M==0)
num[j]=0;
j++;
}


for (k=0;k<N;k++)
if (num[k]!=0)
n++;
if (n==1)
ok=0;
n=0;

}


for (k=0;k<N;k++)
if(num[k]!=0)
last=num[k];

printf("\nlast:%d ",last);

getch();
return 0;
}
kensun0 2010-05-08
  • 打赏
  • 举报
回复
#include "Stdio.h"
#include "Conio.h"
#define N 50
#define M 3
int main(void)
{

int i,j=0,k,n=0,t=0,ok=1,num[N],last=0;

for (i=0;i<N;i++)
num[i]=i+1;

while(ok)
{
if (num[j]!=0)
t++;
if (j==N-1)
{
if (t%M==0)
num[j]=0;
j=0;
}
else
{
if (t%M==0)
num[j]=0;
j++;
}


for (k=0;k<N;k++)
if (num[k]!=0)
n++;
if (n==1)
ok=0;
n=0;

}


for (k=0;k<N;k++)
if(num[k]!=0)
last=num[k];

printf("\nlast:%d ",last);

getch();
return 0;
}
awenhao 2010-05-08
  • 打赏
  • 举报
回复
你这个代码看着头晕,建议你看一本书
http://download.csdn.net/source/2327657
上面有讨论这个问题,说得非常清楚。
你可以下载去看看。
名字叫《程序这东西》
canshui 2010-05-08
  • 打赏
  • 举报
回复
嗯那,学习了……
^_^ ~ ~ ~ ~
arze 2010-05-08
  • 打赏
  • 举报
回复
路过。学习
liubo_24020209 2010-05-08
  • 打赏
  • 举报
回复
感谢三楼的分享,但是效果不太一样,可以运行一下程序,结果就清楚了。
liubo_24020209 2010-05-08
  • 打赏
  • 举报
回复
在这里发帖不一定是要问问题吧,和大家分享一下知识也是可以的吧
mstlq 2010-05-08
  • 打赏
  • 举报
回复
我贴一个相对简单的,搞定约瑟夫环的代码……

#include <stdio.h>

int main(){

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+1);

}
fthislife 2010-05-08
  • 打赏
  • 举报
回复
你想问什么问题的?

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧