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. [shell] bash数组(for时排序)

    for处理时会自动把顺序按A-Z排序了 [root@XM-v106 ~]# bash b.sh A -> B -> C -> D -> E -> [root@XM-v10 ...

  2. centos安装eclise启动报错

    A Java Runtime Environment (JRE) or Java Development Kit (JDK) must be avail http://blog.csdn.net/u0 ...

  3. <!CDATA[]]用法详解

    所有 XML 文档中的文本均会被解析器解析. 只有 CDATA 区段(CDATA section)中的文本会被解析器忽略. PCDATA PCDATA 指的是被解析的字符数据(Parsed Chara ...

  4. VR论文调研

    IEEE VR 2018 1.Avatars and Virtual Humans--人物和虚拟人物 2.Augmented Reality--增强现实 3.Body and Mind--人体和思想( ...

  5. Beta阶段——第三篇 Scrum 冲刺博客

    i. 提供当天站立式会议照片一张: ii. 每个人的工作 (有work item 的ID) (1) 昨天已完成的工作: 账单与舍费余额数据库关联,删除功能 (2) 今天计划完成的工作: 账单排序显示 ...

  6. [转]让opencv输出人脸检测的得分(置信率)

    转自:http://www.cnblogs.com/sciencefans/ 作者:sciencefans 最近项目略多,其中一个需要找出一些和脸比较像但是不是脸的负样本,想用opencv的人脸检测器 ...

  7. 学习laravel源码之中间件原理

    刨析laravel源码之中间件原理 在看了laravel关于中间件的源码和参考了相关的书籍之后,写了一个比较简陋的管道和闭包实现,代码比较简单,但是却不好理解所以还是需要多写多思考才能想明白其中的意义 ...

  8. aes python加密

    # *_*coding:utf-8 *_* #AES-demo import base64 from Crypto.Cipher import AES ''' 采用AES对称加密算法 ''' # st ...

  9. curl 实例详解

    使用PHP的cURL库可以简单和有效地去抓网页.你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据 了.无论是你想从从一个链接上取部分数据,或是取一个XML文件并 ...

  10. [转帖]awk 入门

    awk其实不仅仅是工具软件,还是一种编程语言.不过,本文只介绍它的命令行用法,对于大多数场合,应该足够用了. http://www.ruanyifeng.com/blog/2018/11/awk.ht ...