数组实现约瑟夫环问题,用C++编写

我是想用一个循环,人数为n,密码为m.当报的数等于密码m时,此人出列,记下他的位置,下一个人重新从一开始报.请教高手能够按照这个思路指导我,谢谢.

刚好有个现成的,楼主加分,,嘿嘿:
#include "stdio.h"
#include "stdlib.h"
#define S sizeof(struct node)

struct node
{
int num;
struct node *next;
};

typedef struct node NODE;

NODE *createlinklist(int n)
{
NODE *head,*p,*q;
int i=1;
head=p=(struct node*)malloc(sizeof(struct node));
p->num=i;
for(i=2;i<=n;i++)
{
q=(struct node*)malloc(sizeof(struct node));
if(q==0) return(0);
p->next=q;
p=q;
p->num=i;
}
p->next=head; /*使链表尾指向链表头 形成循环链表*/

return head;
}

void printlinklist(NODE *p,int n)
{
int i;
NODE *q = p;
if(NULL == q->next){
printf("the list is NULL!");
return;
}
printf("所有玩家的信息列表:\n");
for(i=1;i<=n;i++)
{
if(NULL == q){
printf("the list is NULL!");
return;
}
printf("%d ",p->num);
p=p->next;
}
printf("\n");
}

void joseph(NODE *p,int n,int m)
{
int i,j;
NODE *q;
for(i=1;i<n;i++)
{
for(j=1;j<=m-1;j++)
{
p=p->next;
}
q=p->next;
p->next = q->next;
printf("%d ",q->num);
free(q);
}
printf("\n最后剩余的是第%d号.\n",p->num);
p->next=NULL;
}

void main()
{
NODE *head;
int n,m;
printf("请输入人数N:\n");
scanf("%d",&n);
printf("请密码M:\n");
scanf("%d",&m);
head=createlinklist(n);
printlinklist(head,n);
printf("依次被选出的是:\n");
joseph(head,n,m);
}
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-09-22
#include <iostream>

using namespace std;

int main() {
int m, n;
while (cin >> n >> m) {
int* a = new int[n];
for (int i = 0; i < n; i++) a[i] = i + 1;
int j = 1; //用于报数
int k = 0; //遍历数组
int l = n; //跟踪剩余人数
while (l > 1) {//剩余人数大于1,继续报数
if (a[k]) {
if (j++ == m) { //报到m出局
j = 1; //重新报数
a[k] = 0; //记下位置
l--;//人数减1
}
}
if (++k == n) k = 0; //循环数组
}
while (a[--i] == 0); //找到最后一个人,即为答案
cout << a[i] << endl;
delete[] a;
}
return 0;
}本回答被提问者采纳
第2个回答  2009-10-11
嘿嘿 我不是为了分,, 我是为了学习 做做题而已,,

才学习数据结构 请大家嘲笑把

// help.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

typedef struct node{
int number;
struct node *next;
} linkNode,*link;

//建立一个单循环链表
link CreateLink(int personNumber, link lk) {
linkNode* head = lk;

for (int i = 1; i <= personNumber; i++) {
head->number = i;

if (i == personNumber) {
head->next = lk;
}
else {
head->next = new node();
head = head->next;
}
}

//返回头节点是number为personNumber链表,方便查找number为1的前趋节点
return head;
}

void ShowNumberByM(int m, link lk) {

int index = 0;
linkNode* tempNode = lk->next;
linkNode* pravNode = lk;

while (true) {
index ++;
if (index == m) {
printf("%d,", tempNode->number);
pravNode->next = tempNode->next;
delete tempNode;
if (pravNode->next == pravNode) {
printf("%d over", pravNode->number);
break;
}
tempNode = pravNode->next;
index = 0;
}
else{
pravNode = tempNode;
tempNode = tempNode->next;
}
}

}

int _tmain(int argc, _TCHAR* argv[])
{
link l = new node();

ShowNumberByM(5, CreateLink(9, l));
}
第3个回答  2009-10-11
用数组实现的那个不错。。
第4个回答  2009-10-11
写一个好写,不过让人给你讲明白了我估计没多少人赶接这活。这种东西网上很多,还是搜索一下吧。

求C++约瑟夫猴子选大王问题,要用数组与最基本的方法。必重谢!!!_百 ...
\/\/约瑟夫环---数组 #include <stdio.h>#include <stdlib.h>int main(){int* s=NULL;int result[50];int c=0;int i,n,m,p=0,count=0;while(1){scanf("%d",&n);scanf("%d",&m);if(n==0 && m==0){break;}if(s!=NULL){free(s);}s=(int*)malloc(sizeof(int)*n);fo...

用C++编写约瑟夫环的代码,也就是出圈问题,n个人,数到k出圈,接着从1开 ...
include <iostream> using namespace std; int main() { int n,s,m; cout<<"please input the valuse of n,m,s"<<endl; cin>>n>>m>>s; if(n<=0||s<=0||m<=0) { cout<<"error"<<endl; } int i,j,k,temp;\/\/k为次数 int A[100]; for(i=0;i<n;i+...

利用C++解决约瑟夫问题。
这里补充一下约瑟夫问题的描述:N个人围成一圈,从第一个开始报数,数到M的人出队,然后他的下一位继续从1开始报数,数到M的出队,如此循环直到剩下一个人,求最后剩下的那个人最初是队伍中的第几位。解决这道题可以采用模拟报数的方法,建立一个大小为N的数组,数组的第N个元素表示第N个人是否...

C++编程:约瑟夫环问题。
\/\/ 基本的约瑟夫构造函数 JosephCircle(int N,int S,int D);\/\/ 发展的约瑟夫构造函数 JosephCircle(int N,int S,int M,int password[]);\/\/ 输出约瑟夫环 void print();\/\/ 开始处决犯人 void start();private:\/\/ 约瑟夫环的头指针 struct Prisoner * head;\/\/ 第一个被处决的犯人的节点指针...

c++问题小孩出列 求助!谢谢 我用n=90 s=7 m=5测试 得出的结果一到了8...
这个是约瑟夫环问题,使用循环链表做最简单,当然用数组模拟也可以,只不过要把数组假想成一个循环队列,这样才能正确模拟,使用for循环不好,不清楚到底是多少次循环,所以要用while循环,改动后代码如下:total = n;\/\/加在输入n之后,int 型 在 cout<<"Now,children of order row is :"<<endl;...

C++ 约瑟夫环问题
(1) 出圈游戏一:使用动态数组来接收输入,参加的人数和报数上限可变 (2) 出圈游戏二:使用循环链表来接受输入,参加的人数和报数上限可变 (3) 参加游戏者的编号和姓名存入文件play.txt中,按出圈顺序将出圈者的编号和姓名存入文件result.txt中。(4) 利用菜单提供用户界面,菜单格式如下:1. ...

求约瑟夫环问题的解法
自己写的 C++程序 希望对你有帮助 \/*约瑟夫环 Joseph 是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。例如:...

1编写函数求:1-1\/2+1\/3-1\/4+...+1\/n C++
第二道题是约瑟夫环问题,我之前做过,先给你贴上。第一道题等等给你做。include <stdio.h> include <stdlib.h> define N 100 void Fri(int M,int n){ int count=0;\/\/计数器 int i=0;\/\/控制循环的变量 int p=0;\/\/出场后玩家的人数(每局一个玩家出场)int a[N]={0};\/\/将储存...

JOSEPHUS 好人 求算法思路,最好有代码
*问题分析与算法设计 约瑟夫问题并不难,但求解的方法很多;题目的变化形式也很多。这里给出一种实现方法。 题目中30个人围成一圈,因而启发我们用一个循环的链来表示。可以使用结构数组来构成一个循环链。结构中有两个成员,其一为指向下一个人的指针,以构成环形的链;其二为该人是否被扔下海的标记,为1表示还在...

敢死队问题 C\/C++
问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。求胜利者的编号。我们知道第一个人(编号一定是m%n-1) 出列之后,剩下的n-1个人组成了一个新的约瑟夫环(以编号为k=m%n的人开始):k k+1 k+2 ... n-2, n-1, 0, 1, 2, ......

相似回答