数据结构中的约瑟夫环问题用C语言怎么编写出来啊?

关键字:约瑟夫环问题,C语言

题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出
   圈子,问最后留下的是原来第几号的那位。
1. 程序分析:这是一个比较经典的算法--约瑟夫环问题.
2.个人分析: 算法比较经典,对于这样的问题本应该使用链表的形式会比较容易.约瑟夫环算法
则体现了使用数组来完成链表该完成的功能,虽然形式上完全不相同,但却求出了
相同的结果.有异曲同工之妙.总之我个人认为是数组中非常经典的算法了.希望本
人写的代码不会叫大家啐骂!

3.程序源代码:

#include <stdio.h>
#define N 50
#define S 3

void main()
{
int a[N];
int i,k;
int sum=N;

k=0;

for(i=0;i<N;i++)
a[i]=i+1;

for(i=0;i<N;i++)
printf("%-4d",a[i]);

printf("\n");

for(i=0;;i++)
{
if(sum==1)
break;

if(a[i%N]!=0)
{
k++;
}

if(k==S)
{
k=0;
//printf("%4d",a[i%N]);
a[i%N]=0;
sum--;
}
}

for(i=0;i<N;i++)
if(a[i]!=0)
printf("\n最后一个数为:%d\n",a[i]);
}

两年前念书的时候写的,献丑了!
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-10-21
#include <iostream>
using namespace std;
#define FALSE 0
#define TRUE 1
#define MODNUM 3
typedef int BOOL;

void main(void)
{
____BOOL bLoop;
____int iRotation=0,iCounteract=0,iLast;
____int iTotalNumber,iNTotalNumber=0;
____char *piInGameing;

____cout<<"请输入共有几人参加游戏\n";
____cin>>iTotalNumber;

____piInGameing=new char[iTotalNumber];
____for(int i=0;i<iTotalNumber;i++)
____ ___piInGameing[i]='1';

____do{
____ ____bLoop=FALSE;
____ ____for(int i=0;i<iTotalNumber;i++)
____ ____{
____ ____ ___if('0'!=piInGameing[i])
____ ____ ___{
____ ____ ____ ___bLoop=TRUE;
____ ____ ____ ___if(0==(iNTotalNumber+(i+1)-iCounteract)%MODNUM)
____ ____ ____ ____ ___piInGameing[iLast=i]='0';
____ ____ ___}
____ ____ ___else
____ ____ ____ ___iCounteract++;
____ ____}
____ ____iRotation++;
____ ____iNTotalNumber=iRotation*iTotalNumber%MODNUM;
____}while(bLoop);

____delete [] piInGameing;

____cout<<"最后一个是原来的第"<<iLast+1<<"号\n";
}

//注:各句开头的下画线'_'全都代表空格
第2个回答  推荐于2016-04-04
#include<stdio.h>
#include<malloc.h>
#define Namelength 10
typedef struct CLNode{
char*name;
int ID;
int pastword;
struct CLNode *next;
}child,*ptrchild;
ptrchild CreateCList(int n)
{int i;
ptrchild p,head,rear;
printf("please input the children information:");
rear=head=(ptrchild)malloc(sizeof(child));
rear->next=head;

for(i=0;i<n;i++)
{getchar();
p=(ptrchild)malloc(sizeof(child));
p->ID=i+1;
p->name=(char*)malloc(Namelength*sizeof(char));
gets(p->name);
scanf("%d",&(p->pastword));
rear->next=p;
rear=p;
}
rear->next=head;
return head;
}

Joshpus(ptrchild head,int m)
{ptrchild p,q;int i=0;
p=head;
while(head->next!=head)
{while(i<m)
{q=p;
p=p->next;
if(p==head){q=head;p=p->next;}
i++;
}
printf("\nID:%d Name:%s",p->ID,p->name);
q->next=p->next;
m=p->pastword;
i=0;
free(p);
p=q;
}
printf("\n");
}

main()
{ptrchild CL;
int n,m;
printf("please input the number of children:");
scanf("%d",&n);
CL=CreateCList(n);
printf("please input the initial value of m:");
scanf("%d",&m);
Joshpus(CL,m);
}本回答被网友采纳

数据结构中的约瑟夫环问题用C语言怎么编写出来啊?
1. 程序分析:这是一个比较经典的算法--约瑟夫环问题.2.个人分析: 算法比较经典,对于这样的问题本应该使用链表的形式会比较容易.约瑟夫环算法 则体现了使用数组来完成链表该完成的功能,虽然形式上完全不相同,但却求出了 相同的结果.有异曲同工之妙.总之我个人认为是数组中非常经典的算法了.希望本 ...

约瑟夫环问题怎么解决啊?请用C语言写代码,谢谢!
程序可以运行的

用c语言实现约瑟夫环
正好之前写过基础的约瑟夫环,稍作修改就可以满足你的题目 include <stdio.h>#include <stdlib.h>typedef struct _node { int id; int key; struct _node *next;} Linklist;int main() {int n, m;scanf("%d %d", &n, &m);int i, count = 0;Linklist *head = (Linklist*...

约瑟夫环(单向循环链表)_C语言「抄作业」
约瑟夫环问题 该问题求解Josephus与最后存活的另一人最初的位次。具体而言,当剩余人数为n时,从第一个人开始,每报数k次后,淘汰当前报数者,直到最后剩下2人。最终,Josephus与另一人分别位于第16和第31的位置上。示例输出 在C语言抄作业系列中,提供了关于约瑟夫环问题的代码实现。该实现旨在解决Joseph...

求助C语言大师! 这个是约瑟夫环的程序代码,跪求给每一段代码打上正确...
\/\/由于L在get函数中没有复位,所以仍然指向链表中最后一个内存空间的头地址 q=L;\/\/循环打印链表数据 for(int i=0;i<n;i++){ \/\/设了一个变量k用来和参数m也就是初始密码做比较 int k=1;\/\/这个循环的意义在于比如当初始密码是2时,则将指针q后移1位变成指向第一个内存段头地址 while(k<...

求助, 约瑟夫环问题(C语言)
int num;int val;struct node* next;}listnode;\/\/两个结构体可以合并以减少程序复杂度 typedef listnode* linklist;int main(){ int n,i,b,m,j;linklist q=(listnode*)malloc(sizeof(listnode));q->next=q;\/\/即使只有一个元素,他也是个循环链表 listnode *p;printf("请输入总人数:");sca...

用C语言解决一个实际问题(不要太长)
约瑟夫环(很有名的数学问题)已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。void JOSEPHUS(int n,int k,int m) \/\/n为总人数,k...

C语言编程丨循环链表实现约瑟夫环!真可谓无所不能的C!
约瑟夫环问题是一个经典的应用场景,描述了在一定规则下的淘汰机制。该问题的基本设定是 n 个人围坐在圆桌周围,从指定编号开始,按照特定规则进行淘汰,直到仅剩一人。循环链表是实现该问题的关键结构。考虑一个示例场景:假设圆桌上有 5 人,从编号为 3 的人开始,每数到 2 的人数淘汰一人。具体流程...

C语言约瑟夫环切西瓜问题
x*sizeof(int));while(left<x){ if(0==arr[i])c++;if(y==c){ arr[i]=1;left++;\/\/不需要打印切掉的西瓜的编号的话,\/\/注释掉这句 printf("%d ",i+1);if(left==x)printf("\\n最后留下来的西瓜的编号是:%d",i+1);c=0;} if(++i==x)i=0;} free(arr);return 0;} ...

求c语言用循环链表编写约瑟夫环代码(速度求解)!!!
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) ...

相似回答