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

我是想用一个循环,人数为n,密码为m.当报的数等于密码m时,此人出列,记下他的位置,下一个人重新从一开始报.请教高手能够按照这个思路指导我,谢谢.... 我是想用一个循环,人数为n,密码为m.当报的数等于密码m时,此人出列,记下他的位置,下一个人重新从一开始报.请教高手能够按照这个思路指导我,谢谢. 展开
 我来答
百度网友0974edce8
2009-10-11 · TA获得超过490个赞
知道小有建树答主
回答量:381
采纳率:0%
帮助的人:253万
展开全部
刚好有个现成的,楼主加分,,嘿嘿:
#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);
}
光点科技
2023-08-15 广告
通常情况下,我们会按照结构模型把系统产生的数据分为三种类型:结构化数据、半结构化数据和非结构化数据。结构化数据,即行数据,是存储在数据库里,可以用二维表结构来逻辑表达实现的数据。最常见的就是数字数据和文本数据,它们可以某种标准格式存在于文件... 点击进入详情页
本回答由光点科技提供
北风微风
推荐于2016-09-22 · TA获得超过1094个赞
知道小有建树答主
回答量:411
采纳率:0%
帮助的人:0
展开全部
#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;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
thinkluoqi
2009-10-11 · TA获得超过113个赞
知道小有建树答主
回答量:109
采纳率:0%
帮助的人:192万
展开全部
嘿嘿 我不是为了分,, 我是为了学习 做做题而已,,

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

// 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));
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yu2212
2009-10-11 · TA获得超过2391个赞
知道大有可为答主
回答量:3915
采纳率:0%
帮助的人:2958万
展开全部
用数组实现的那个不错。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2009-10-11
展开全部
写一个好写,不过让人给你讲明白了我估计没多少人赶接这活。这种东西网上很多,还是搜索一下吧。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式