http://blog.csdn.net/zhuimengzh/article/details/6727221

用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序

// 用户输入M,N值,从1至N开始顺序
// 循环数数,每数到M输出该数值,
// 直至全部输出
#include <stdio.h> // 节点
typedef struct node
{
int data;
node* next;
}node; // 创建循环链表
void createList(node*& head, node*& tail, int n)
{
if(n<)
{
head = NULL;
return ;
}
head = new node();
head->data = ;
head->next = NULL; node* p = head;
for(int i=; i<n+; i++)
{
p->next = new node();
p = p->next;
p->data = i;
p->next = NULL;
} tail = p;
p->next = head;
} // 打印循环链表
void Print(node*& head)
{
node* p = head; while(p && p->next!=head)
{
printf("%d ", p->data);
p=p->next;
}
if(p)
{
printf("%d\n", p->data);
}
} // 用户输入M,N值,从1至N开始顺序
// 循环数数,每数到M输出该数值,
// 直至全部输出
void CountPrint(node*& head, node*& tail, int m)
{
node* cur = head;
node* pre = tail; int cnt = m-;
while(cur && cur!=cur->next)
{
if(cnt)
{
cnt--;
pre = cur;
cur = cur->next;
}
else
{
pre->next = cur->next;
printf("%d ", cur->data);
delete cur;
cur = pre->next;
cnt = m-;
}
} if(cur)
{
printf("%d ", cur->data);
delete cur;
head = tail = NULL;
}
printf("\n");
} int main()
{
node* head;
node* tail;
int m;
int n;
scanf("%d", &n);
scanf("%d", &m);
createList(head, tail, n);
Print(head);
CountPrint(head, tail, m);
system("pause");
return ;
}

约瑟夫环问题算法

已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编

号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报

数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全

部出列。
  例如:n = 9, k = 1, m = 5
 【解答】
  出局人的顺序为5, 1, 7, 4, 3, 6, 9, 2, 8。

链表方法
  这个就是约瑟夫环问题的实际场景,有一种是要通过输入n,m,k三

个正整数,来求出列的序列。这个问题采用的是典型的循环链表的数据

结构,就是将一个链表的尾元素指针指向队首元素。 p->link=head
  解决问题的核心步骤:
  1.建立一个具有n个链结点,无头结点的循环链表
  2.确定第1个报数人的位置
  3.不断地从链表中删除链结点,直到链表为空

/*约瑟夫环*/

#include   <stdlib.h>
#include <stdio.h>
typedef struct node
{
int data;
struct node *next;
}LNode; main()
{
LNode* Create(int,int);
LNode* GetNode(LNode *);
int Print(LNode *,int);
LNode *p;
int n,k,m;
do
{
printf ( "输入总人数 ");
scanf ( "%d ",&n);
}
while (n <=);
do
{
printf ( "输入开始人的序号(1~%d) ",n);
scanf ( "%d ",&k);
}
while (k <= || k> n);
do
{
printf ( "输入间隔数字 ");
scanf ( "%d ",&m);
}
while(m <=); p=Create(n,k);
Print(p,m);
return ;
}; LNode* Create(int n,int k)/*创建循环链表*/
{
int start=k-;
LNode *s,*p,*L=,*t;
if (start==) start=n;
while (n!=)
{
s=(LNode *)malloc(sizeof(LNode));
if (L==) p=s;
if (n==start) t=s;
s-> data=n;
s-> next=L;
L=s;
n--;
}
p-> next=L;
return t;
} LNode* GetNode(LNode *p)/*出队函数*/
{
LNode *q;
for (q=p;q-> next!=p;q=q-> next);
q-> next=p-> next;
free (p);
return (q);
} Print(LNode *p,int m)/*输出函数*/
{
int i;
printf ( "出队编号:\n ");
while (p-> next!=p)
{
for (i=;i <=m;i++)
p=p-> next;
printf ( "%d ",p-> data);
p=GetNode(p);
}
printf( "%d\n ",p-> data);
return ;
}

约瑟夫环问题算法(M)的更多相关文章

  1. C# 约瑟夫环算法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. 小小c#算法题 - 12 - Joseph Circle(约瑟夫环)

    约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数(从1开始报数),数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又 ...

  3. 3,java数据结构和算法:约瑟夫环出队顺序, 单向环形链表的应用

    什么是约瑟夫环? 就是数小孩游戏: 直接上代码: 要实现这个,只需要理清思路就好了 孩子节点: class Boy{ int no;//当前孩子的编码 Boy next; // 下一节点 public ...

  4. C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析

    尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这 ...

  5. 约瑟夫环(N个人围桌,C语言,数据结构)

    约瑟夫环问题(C语言.数据结构版) 一.问题描述 N个人围城一桌(首位相连),约定从1报数,报到数为k的人出局,然后下一位又从1开始报,以此类推.最后留下的人获胜.(有很多类似问题,如猴子选代王等等, ...

  6. 关于递推算法求解约瑟夫环问题P(n,m,k,s)

    一. 问题描述 已知n个人,分别以编号1,2,3,...,n表示,围坐在一张圆桌周围.从编号为k的人开始报数1,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去, ...

  7. King's Game---hdu5643(约瑟夫环)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5643    约瑟夫环问题的原来描述为,设有编号为1,2,……,n的n(n>0)个人围成一个圈,从 ...

  8. cdoj525-猴子选大王 (约瑟夫环)

    http://acm.uestc.edu.cn/#/problem/show/525 猴子选大王 Time Limit: 3000/1000MS (Java/Others)     Memory Li ...

  9. 组合数学--约瑟夫环问题 Josephus

    约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环. 有n个囚犯站成一个圆圈,准备处决.首先从一个人开始,越过k-2个人(因为第 ...

随机推荐

  1. python2.7 倒计时

    From: http://www.vitostack.com/2016/06/05/python-clock/#more Python公告 Python 发布了一个网站 http://pythoncl ...

  2. 20181023-11 Alpha发布

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2283 文案: Learning by Playing 界面清爽明快,UI ...

  3. bootstrap table的展开行问题

    照着网上与api里说的添加detailView属性设置为true,detailFormatter属性为展开后的内容,但是设置之后发现,在表格每一行最前面是多出一列正常该显示"+"的 ...

  4. Scrum Meeting 11.10

    成员 今日任务 明日计划 用时 徐越  调试前端代码 协助重构UI,完善前端逻辑  2h  赵庶宏 调出不能显示回答列表的bug,是后端数据库建库问题 与前一组进行数据库统一  3h  薄霖 UI代码 ...

  5. BeanUtils解决日期问题

    ConvertUtils.register(new DateLocaleConverter(), Date.class); BeanUtils.populate(user, request.getPa ...

  6. Task 6.1 校友聊之NABCD模型分析

    我们团队开发的一款软件是“校友聊”--一个在局域网内免流量进行文字.语音.视频聊天的软件.下面将对此进行NABCD的模型分析. N(Need需求):现如今,随着网络的迅速普及,手机和电脑已经成为每个大 ...

  7. 网络1711-12&信管1711-12 图 作业评分

    先放上本次作业的推荐博客,以及评分细则总表,在最后,会放几张图表对本学期大家的成果进行一个小小的总结,有兴趣的同学可以看看,感受一下自己这个学期的积累和进步.(主要针对网络的同学,信管的同学只有两次作 ...

  8. Head First Java & 异常

     

  9. Hadoop到底能做什么?怎么用hadoop?

    hadoop是什么?(1)Hadoop是一个开源的框架,可编写和运行分布式应用处理大规模数据,是专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式.Hadoop=HDF ...

  10. Current request is not a multipart request

    1. 文件上传需要在form表单中添加<form enctype="multipart/form-data"> 2. SpringMVC默认是关闭fileupload功 ...