c--约瑟夫环
Posted yasina
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c--约瑟夫环相关的知识,希望对你有一定的参考价值。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 7 8 //解决约瑟夫环问题 9 //分别使用数组和链表 10 //问题描述:n只猴子围成一个圈选大王,从1开始数m个数, 11 // 第m个猴子淘汰,然后下一只猴子从1开始重新数, 12 // 最后剩下一只猴子为猴子大王,输出是几号猴子 13 //1、数组 14 /* 15 int main(){ 16 int n,m; 17 cout<<"请输入n只猴子和数字m"<<endl; 18 cin>>n>>m; 19 int a[n]; 20 //0表示未被淘汰,1表示被淘汰 21 memset(a,0,sizeof(a)); 22 int cnt=1;//用来计数淘汰了几只 23 int j=n-1; 24 while(cnt<n){//淘汰n-1只猴子 25 int k=0;//计数,用来记录猴子报的数 26 do{ 27 j=(j+1) % n;//计算报数m的猴子的位置 28 if(a[j]!=1){//未被淘汰,计数器+1; 29 k++; 30 } 31 }while(k < m); 32 a[j]=1; 33 cnt++; 34 cout<<"淘汰:"<<j+1<<endl; 35 } 36 37 //遍历找出最后一只猴子,注意数组下标+1是猴子的序号 38 for(int i=0;i<n;i++){ 39 if(a[i]==0){ 40 cout<<"猴子大王是:"<<i+1<<"号"<<endl; 41 return 0; 42 } 43 } 44 } 45 */ 46 47 48 //2、链表 49 50 typedef struct node{ 51 int num; 52 node *next; 53 }node; 54 55 56 int main(){ 57 node *head =NULL; 58 node *tial; 59 int n,m; 60 cout<<"请输入n只猴子和数字m"<<endl; 61 cin>>n>>m; 62 for(int i=0;i<n;i++){ 63 node* s=(node*)malloc(sizeof(node)); 64 s->num=i+1; 65 if(i==0) head=s; 66 else tial->next=s; 67 tial=s; 68 } 69 tial->next=head; 70 int cnt=1; 71 node* p=tial; 72 while(cnt<n){ 73 //p指向目标的前一个 74 for(int i=1;i<m;i++){ 75 p=p->next; 76 } 77 node *q=p->next; 78 p->next=q->next; 79 free(q); 80 cnt++; 81 } 82 cout<<"猴子王:"<<p->num<<endl; 83 }
以上是关于c--约瑟夫环的主要内容,如果未能解决你的问题,请参考以下文章