原帖及讨论:http://bbs.bccn.net/thread-209612-1-1.html 大家好! 这几天我在忙着编一个问题,我用了一种方法编出来! 但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦! 注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
题目 山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。 第一种方法:利用循环链表 #include<stdio.h> #include<malloc.h> #define M 8 //共有8只猴子 #define N 3 //数到3只时退出第三只 typedef struct monkey {int number; int flag; struct monkey* next; }MONKEY; main() { MONKEY *head=NULL,*p,*s; int i,sum=0,count=0; clrscr(); //清屏 p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存 p->number=1;p->flag=1; p->next=head; head=p; for(i=2;i<=M;i++) { s=(MONKEY *)malloc(sizeof(MONKEY)); s->number=i;s->flag=1; s->next=head; p->next=s;p=p->next; } p=head; for(;;) {if(p->flag==1) count++; if(count==N) {p->flag=0; count=0; sum++;} if(sum==M-1) break; p=p->next; } p= head; for(i=1;i<=M;i++) { if(p->flag==1) printf("/t%d",p->number); p=p->next; }
} 第二种方法:数组 #include<stdio.h> #define M 8 struct monkey {int number; int nextp; }link[M+1];
void main() {int i,count,h; for(i=1;i<=M;i++) { if(i==M) link[i].nextp=1; else link[i].nextp=i+1; link[i].number=i; } printf("/n"); count=0; h=M; printf("依次退出的猴子: /n"); while(count<M-1) {i=0; while(i!=3) { h=link[h].nextp; if(link[h].number) i++;}
printf("%4d",link[h].number); link[h].number=0; count++; }
printf("/n大王是:"); for(i=1;i<=M;i++) if(link[i].number) printf("%3d/n",link[i].number);
} 第三种是普通方法for循环 #include<stdio.h> void main() { int i,k,m,n,num[50],q,*p; clrscr(); printf("input number of person: n="); scanf("%d",&n); printf("/ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只 scanf("%d",&q); p=num; for(i=0;i<n;i++) *(p+i)=i+1; i=0; k=0; m=0; while(m<n-1) {if(*(p+i)!=0) k++; if(k==q) { *(p+i)=0; k=0; m++; } i++; if(i==n)i=0; } while(*p==0)p++; printf("The last one is NO:%d/n",*p); getch();
} 点击下载附件 |