约瑟夫问题
设有n个人围成一圈,每个人的编号依次1,2,3...n。现从编号为k的人开始报数, 报到m的人出列,再从出列的下一个人开始重新报数,报到m的人又出列,以此类推,直到所有人都出列,求这n个人的出列顺序. 用C语言编写算法,将结果以顺序表和单链表两种方法分别实现 注意:这种约瑟夫问题没有所谓的"输入密码"!
#include #include typedef struct list { int data; struct list *next; }linklist; void main() { int n,m,k,i=1; linklist head,*p,*q,*l; printf("enter n:\n"); scanf("%d",&n); printf("enter m:\n",&m); scanf("%d",&m); printf("enter k:\n",&k); scanf("%d",&k); l=&head; p=l; for(;inext=q; q->data=i; p=q; } p->next=l->next; /*创建循环表*/ p=l->next; for(i=1;inext; while(p->data!=p->next->data) { for(i=1;inext; q=p->next; printf("%3d",q->data); p->next=q->next; p=q->next; /*p指向第k+1个人的位置*/ free(q); /*释放空间*/ } printf("%3d\n",p->data); free(l); free(p); } 。
见附件.
答:我自己实在是无这方面的思路,从网上找了一个不完全版的,希望对你有帮助。 #define nmax 50 main() {int i,k,m,n,num[nmax...详情>>
问:挺简单的一C函数,不过我是初学者,暂时还不会写,请好心人多多帮忙!
答:int mystrlen(char *str) { int n = 0; while (*str) { n++; str++;} return n; } voi...详情>>