|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
×
大家好!# r# V& y) L% _9 T* I) T0 U1 t- P- U3 Z
这几天我在忙着编一个问题,我用了一种方法编出来!
: \3 i$ A" m. O. [! S' Q但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!' u0 Q5 a# j! [. m& H2 F$ f) m- W
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
' R3 q! w- Q9 q1 Z) P9 o$ k! T3 n7 c0 U7 t% V8 X) M1 h# X; v
; R3 s& N8 J2 ?$ a, J% @
题目! v7 {9 {# d6 Z! _( }- I
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。; ~* x: s, m; v4 v3 J
第一种方法:利用循环链表0 ~% J# d; L/ S: A) ?5 j, o
#include<stdio.h>& z' N+ w7 h" f
#include<malloc.h>
% A7 ]: v2 n1 S5 `#define M 8 //共有8只猴子
) i7 _& V4 A1 Q. ~2 O#define N 3 //数到3只时退出第三只# m. k: z" T9 t. T( f
typedef struct monkey
& U1 M+ |, E$ |( w/ G{int number;
# i+ X: ~4 c6 [7 E1 C! Sint flag;
* {2 M! x4 [' a6 l& M/ u+ n' k( pstruct monkey* next;
/ N; j: \, l1 m: h$ {}MONKEY;2 u* {& M1 r$ d h" x( _2 q% Y& y/ p
main()
9 I G; l& b9 k{ MONKEY *head=NULL,*p,*s;
, j. s, \- q+ G9 g. ]+ y! ?6 T int i,sum=0,count=0;& g. O& N+ C) q" y
clrscr(); //清屏$ w7 F' w) ]- ^+ V! l) ]
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存% T e5 v( ]9 D$ L* a9 \
p->number=1;p->flag=1;
3 Q! q* {/ I0 z3 C p->next=head;: x, [( H3 h3 {
head=p;
. w8 x7 U% k% k9 i9 y for(i=2;i<=M;i++)
1 R$ h( M# L; K$ E { s=(MONKEY *)malloc(sizeof(MONKEY));
5 T+ I' v- h5 ^$ X& Z s->number=i;s->flag=1;6 W5 h: _$ K W) J
s->next=head;4 _8 D8 `/ A0 R; O7 Z
p->next=s;p=p->next;6 n' O9 z6 M8 j5 v3 s
}
4 h: a2 u* M1 D0 J p=head;
; \/ H' i8 y- B! G3 B+ K; [ for(;;) h/ {2 |1 V' W0 i- `* t
{if(p->flag==1)% i/ \! S9 d. k) f' g9 k
count++;9 }9 b5 Q g1 w/ {0 _9 D! {9 w6 x
if(count==N)
# s2 k7 ]: d* ?4 c6 H) E. g0 q {p->flag=0;" Q8 r# P( Y* `# J9 c2 @
count=0;
" c: z) b5 f: F+ q sum++;}8 N3 M- g" K! ?$ o6 o" y
if(sum==M-1)
5 d' W, J& U$ t" S; E; d7 }' a% u9 _ break;
7 c' j* L+ O8 [, t p=p->next;
, Z1 ~; Y& c- L- S0 s }
6 D q$ U$ H( M0 g- x p=
0 I) A9 a1 B* p( P) R) G head;
1 t) v4 X% X" ?% `% D" l1 s for(i=1;i<=M;i++)) b" q0 Y7 P& c
{ if(p->flag==1)' ]8 ~! I' _! x9 k- @" h. ?6 x
printf("\t%d",p->number);+ \' C' A* r( E- v' y6 I
p=p->next;
8 _ i7 s1 P% `: ^! I% H7 l+ O( W }7 y& n6 C) q o5 P$ z
. w+ Q8 w7 K' }2 i
' B7 y4 W7 b* Q& J
3 y; {; |/ g2 i5 A
} * c# T5 l- l( u/ E4 N P# y% L& @
第二种方法:数组
6 J9 I: F, {. c#include<stdio.h>/ J7 |+ B# d" L8 U! U
#define M 8
; ~9 l$ q7 m) r! m0 Astruct monkey
8 _; o9 w6 `) Q; I( K9 z{int number;4 D& \ P5 X% d! f( s+ I
int nextp;, N1 r5 t" t! [: G
}link[M+1];8 }1 H" m5 Y1 I8 W3 V4 C3 d
, k5 A# u: d7 \* q9 ?/ X cvoid main()% e p4 }3 }3 d. Q% _. s
{int i,count,h;
: y+ K& `( B) i" d- l1 _7 @, `for(i=1;i<=M;i++)% h% G+ L- V2 F* G
{ if(i==M)5 `3 o) ~5 Z) f1 i% ~$ Q
link.nextp=1;
/ W. J5 i, ^! L- h else
7 I4 S) J( e3 p3 ` link.nextp=i+1;- @0 N- f' F0 y, `1 ?- g
link.number=i;
5 E. U, C# C4 Y9 T5 J$ W0 w}
, a8 M8 n& G5 p( v. G" a. f/ lprintf("\n");
5 q5 f7 l) U) Ocount=0;
6 @5 n! @: c. N2 O* k0 `2 Q: Qh=M;' Q1 S( [8 c3 d9 |$ L+ p
printf("依次退出的猴子: \n");2 D/ O1 q6 x) f2 w% B" z0 F0 V5 X
while(count<M-1)0 T$ z% F! v" g7 G3 E, |
{i=0;, f6 n5 x$ A) b$ [; M; a9 {
while(i!=3)2 X2 E: {, \* w1 D! t$ m6 q- o
{ h=link[h].nextp;+ {! b' z- Z; [! M v! b8 G/ o. M
if(link[h].number)
& ?+ q6 G2 i, h( y# e6 O, F i++;}' ~' q! v/ v' _7 j. h
# f/ D3 E( k7 _$ Hprintf("%4d",link[h].number);3 c1 S& l- K: q' z( F' A# r
link[h].number=0;
$ @1 U+ Z; W1 y$ q6 V# N5 Ccount++;
9 ~; r8 ]* V9 c* x! l6 [} } k4 G: x" k6 t0 U
4 N5 u, I, W+ Q, uprintf("\n大王是:");* i! @. O, {' ~' f5 y
for(i=1;i<=M;i++)8 s7 l$ Y6 h* X5 `0 {# P
if(link.number)7 p- Y# n" W6 Y W3 H% h
printf("%3d\n",link.number);- F! n4 @) j! N* B' @6 r
* ?' q; H# r+ K( G# R
# Y2 F8 T1 R/ u7 w! J} % q0 y' L3 ]6 w
第三种是普通方法for循环
+ @% O/ E9 p) _' M8 m a" k+ r; X2 \& }#include<stdio.h>) L7 V1 i2 U) b' t; A5 b. @! [4 X+ h# W
void main()# Z: i A" Q0 o+ U/ j
{ int i,k,m,n,num[50],q,*p;
* k9 g' [; e- d' x* J clrscr();
, i9 a" ?; `0 K+ ] printf("input number of person: n=");
( e4 q: o# N' @ scanf("%d",&n);6 R% a8 S8 c2 p) |7 ^' U
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
9 k! `4 e9 [: p% X6 X scanf("%d",&q);' r0 ^( P- {) L
p=num;, [; c( M1 { m! l" B1 }0 e
for(i=0;i<n;i++)% x/ d% l7 z* r% Q( m! h- ^- U
*(p+i)=i+1;
& [. a: B, Q7 B3 K- _% ~ i=0;0 m' D* c9 D+ Y* n$ X% M
k=0;* K4 A6 W/ c7 g" j; T2 K
m=0;
& S1 A: f' F" \5 b while(m<n-1)
# y5 W7 D3 t& _2 G7 P {if(*(p+i)!=0) k++;, q; I! F5 w8 V& Z1 o D7 h
if(k==q)
8 O0 N' j( `; F4 v { *(p+i)=0;
% d' A5 N& _7 [# Z* ?+ Q' O& ^ k=0;7 l; ^4 f% `7 D, S" J: j H
m++;6 C) t* O- Z# ?8 U4 S Q
}
7 a9 M: Y' ~- c6 ~ i++;
$ Y6 L/ f, f3 }2 @ if(i==n)i=0;
2 X" E X0 r8 e. E% D1 O! i- ~ }
& Q" G2 A. U+ c( v while(*p==0)p++;0 n; Y9 x) [; I% ?* E6 D" [" y
printf("The last one is NO:%d\n",*p);
& S' Z2 X; O) Y6 R getch();
2 ^! e& `* H, v$ `6 p
% _4 A) k9 R9 K$ R} |
|