写以下代码注释#includestdioh#includestdlibhtypedef struct node int number; struct node next;NodeList;List head=NULL;List pFront = NULL;List per = NULL;int nm;int b100k;void Create;void Josephint numberint m;
// 头文件 #include<stdio.h> #include<stdlib.h>
// 结点结构体定义 typedef struct node{ int number; struct node *next; }Node,*List;
// 全局变量 List head=NULL; // 头结点 List pFront = NULL; // 前一个结点 List per = NULL; // 当前结点 int n,m; // 输入的n和m int b[100],k; // 数组b和计数变量k
// 函数声明 void Create(); // 创建循环链表 void Joseph(int number,int m); // 约瑟夫问题
int main() { // 输入n和m scanf("%d %d",&n,&m); int i; int a[n]; // 数组a // 输入数组a的后m个数 for(i =n-m;i<n;i++) { scanf("%d",&a[i]); } // 遍历1到n for(i=1;i<=n;i++) { head=NULL; pFront=NULL; k=0; int flag = 1; Create(); // 创建循环链表 per = head; Joseph(n,i); // 求解约瑟夫问题 // 比较数组a和数组b for(int j=n-m;j<n;j++) { if(a[j]!=b[j]) { flag=0; } } // 如果相等,则输出i并返回 if(flag == 1) { printf("%d",i); return 0; } } return 0; }
// 创建循环链表 void Create() { List tail; for(int i=0;i<n;i++) { List pnew; pnew=(List)malloc(sizeof(Node)); pnew->number=i+1; if(head==NULL) { head=pnew; } else{ tail->next = pnew; } tail=pnew; } tail->next=head; pFront = tail; }
// 约瑟夫问题 void Joseph(int number,int m) { // 递归终止条件 if(number==0) { return; } int count = 1; List p = NULL; // 找到第m个结点 while(count != m) { per=per->next; pFront=pFront->next; count++; } p=per; pFront->next=per->next; // 如果只剩下一个结点,将其放入数组b if(number==1) { b[k++]=p->number; } else{ b[k++]=p->number; } per=per->next; free(p); Joseph(number-1,m); }
原文地址: https://www.cveoy.top/t/topic/i5jr 著作权归作者所有。请勿转载和采集!