鱼C论坛

 找回密码
 立即注册
查看: 2320|回复: 6

关于约瑟夫环

[复制链接]
发表于 2014-9-11 21:10:07 | 显示全部楼层 |阅读模式
1鱼币
如果知道每个人的密码, 请问,在那个位置容易获胜

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-12 17:30:08 | 显示全部楼层
约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-12 17:30:40 | 显示全部楼层
约瑟夫环运作如下:
1、一群人围在一起坐成环状(如:N)
2、从某个编号开始报数(如:K)
3、数到某个数(如:M)的时候,此人出列,下一个人重新报数
4、一直循环,直到所有人出列,约瑟夫环结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-12 17:31:14 | 显示全部楼层
#include<stdio.h>
#include<stdlib.h>
struct_Node
{
intdata;
struct_Node*next;
};
typedefstruct_Nodenode_t;
typedefstruct_Linklist
{
node_t*phead;
node_t*ptail;
intlen;
}Linklist;
staticnode_t*GetNode(inti)//新建并初始化节点
{
node_t*pNode;
pNode=(node_t*)malloc(sizeof(node_t));
if(!pNode)
{
printf("Error,thememoryisnotenough!\n");
exit(-1);
}
pNode->data=i;
pNode->next=NULL;
returnpNode;
}
voidinit_list(Linklist*plist)//用第一个节点初始化循环单链表
{
node_t*p;
p=GetNode(1);
//printf("TheNewNodeis:%d\n",p->data);//****TEST****
plist->phead=p;
plist->ptail=p;
p->next=plist->phead;
plist->len=1;
}
staticvoidCreate_List(Linklist*plist,intn)//把其余数据添加到循环单链表中
{
inti=0;
node_t*pNew;
for(i=2;i<=n;i++)
{
pNew=GetNode(i);
/********TEST********
printf("TheNewNodeis:%d\n",pNew->data);
********TEST********/
plist->ptail->next=pNew;
plist->ptail=pNew;
pNew->next=plist->phead;
plist->len++;
}
printf("Completesthee-waycirculationchaintablethefoundation!\n");
}
voidPrint_List(Linklist*plist)//输出链表内容
{
node_t*pCur=plist->phead;
do
{
printf("The%dperson.\n",pCur->data);
pCur=pCur->next;
}while(pCur!=plist->phead);
printf("ThelengthoftheList:%d\n",plist->len);
}
voidjoseph(Linklist*plist,intm)//约瑟夫回环函数实现
{
node_t*pPre=plist->ptail;
node_t*pCur=plist->phead;
inti;
while(plist->len!=1)
{
i=0;
while(i<m-1)
{
pPre=pPre->next;
i++;
}
pCur=pPre->next;
pPre->next=pCur->next;
free(pCur);
plist->len--;
}
printf("Thelastoneis:%d\n",pPre->data);
}
intmain()
{
intn=0;
printf("PleaseinputtheLengthoftheCirclelist:");
scanf("%d",&n);
intm=0;
printf("PleaseinputtheStoppoint:");
scanf("%d",&m);
LinklistpList;
init_list(&pList);
Create_List(&pList,n);
Print_List(&pList);
joseph(&pList,m);
return0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-18 08:59:38 | 显示全部楼层
#include <stdio.h>
void main()
  {
  int n, m=3, i, s=0;
  scanf("%d", &n);
  for (i=2; i<=n; i++) s=(s+m)%i;
  printf ("the last is : %d\n", s+1);
  }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-27 13:55:56 | 显示全部楼层
#include<stdio.h>

int main()
{

}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-10-27 16:04:19 | 显示全部楼层

约瑟夫环运作如下:
1、一群人围在一起坐成环状(如:N)
2、从某个编号开始报数(如:K)
3、数到某个数(如:M)的时候,此人出列,下一个人重新报数
4、一直循环,直到所有人出列,约瑟夫环结束
如果您的【问题求助】得到满意的解答,请自行将分类
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 04:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表