|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
) O& B) d5 Z0 b/ e8 U& T, n7 b这几天我在忙着编一个问题,我用了一种方法编出来!% d) \2 f) u$ W; d
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!4 [! W& i" N1 A/ G. y
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 . T: K5 L& z V; t5 K% Y L
" d, F! j& g" _' V2 V( Q& x
, L+ o5 S* Q* K# U) j: t, x 题目
, G. t, P2 h, h+ d) Z3 i$ a: P9 |山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。& L9 f/ m4 |4 h+ ?
第一种方法:利用循环链表/ f2 t* F) S. |: g
#include<stdio.h>& N' f* O5 M2 C: _+ R
#include<malloc.h>1 v& G" ]5 b6 r( t& ?0 F9 f+ e
#define M 8 //共有8只猴子
' b$ c9 D. I& _: _6 G$ B4 q8 p#define N 3 //数到3只时退出第三只
. F# P7 _+ d* x" A) Stypedef struct monkey% b% P# Y3 G; R0 z- Y
{int number;
/ c) D9 A) |" D6 W3 q6 e' i0 _int flag;) z# e g# C9 @
struct monkey* next;0 Q9 D8 v Q9 f8 s- S
}MONKEY;
! J" N; U: @6 ]& R3 s2 jmain()5 l, v0 J& y' v2 a) N. V3 ] U
{ MONKEY *head=NULL,*p,*s;
3 `5 ~( H2 I3 r6 ?; c int i,sum=0,count=0;
9 F. ~2 \) I0 [% e9 l2 I3 Z clrscr(); //清屏
$ X9 J& ?5 u5 [ p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存3 x A# w! [5 G J$ @# x; h; n
p->number=1;p->flag=1;
6 a# P) S) C7 Q! i' h( B p->next=head;
: f# m" i3 x( o! q, } `7 [( ] head=p;
0 g. x! f# d" S* a0 @6 G2 { g/ ? for(i=2;i<=M;i++)
) |2 W4 Q' \/ h1 N- U+ Q { s=(MONKEY *)malloc(sizeof(MONKEY));
. U# h. g' ]/ Q5 J) ~3 ?4 F s->number=i;s->flag=1;
?6 d; v7 f/ }2 p7 s- B- h s->next=head;
% w- B2 U6 q t. K p->next=s;p=p->next;
; V$ R5 J2 C0 R9 f& |! ?7 f }
. F! X6 R$ |7 i: B% o! B p=head;
- B" w% u" Q$ M( G$ D- F+ L for(;;), E5 W% B6 @' q+ I1 @
{if(p->flag==1)) C+ p* |( b0 B \, `( _
count++;
9 M, \5 t7 i$ S% ~$ f( L) y if(count==N)
1 f6 D+ p: ]) u* m$ m {p->flag=0;
6 t- e* x$ u ~: D count=0;
) V8 E8 v2 a* J* Z( k sum++;}0 W. Y- M" Z d
if(sum==M-1)# C! a! J4 C1 o+ K9 x) v2 Z7 a: L s
break;
" t$ Q$ F( U. C4 F7 `3 A% y! N y p=p->next;2 `8 k. o& N7 U* D2 z$ q: `: f
}
5 X: F" S+ B9 D+ C: A+ F t6 ?9 J p=
a+ G# M# |# \ head;
, O- }: r6 }( ~: t for(i=1;i<=M;i++)! z0 v' Z# p% }) f: {( F
{ if(p->flag==1)
2 z9 a3 [( s* u8 i printf("\t%d",p->number);& K, @8 G* u* q
p=p->next;; F0 ]4 T6 A8 N( v8 L
}3 s5 o3 `' ]$ z& f9 e- [2 ~
9 ~: V4 n( o# ~- }( I7 n* \
8 F) D3 _0 d, z9 {- Y- }' }: |0 [7 o: D( {; ~ ?, N4 h
} , W4 F1 p0 u3 ^- _% G/ i
第二种方法:数组
2 z( S, k( S; {3 y1 [: G- l/ z! f#include<stdio.h>4 U$ h% D* b8 N# J' C
#define M 84 _/ \$ y0 {" f8 `+ n& }* i3 a* J2 N
struct monkey# O2 E) z& }6 g8 a: A( h
{int number;6 N \8 Z4 G* W1 E5 E
int nextp;
+ S$ e- Z+ c* @$ h, B s}link[M+1];2 }) Z+ {# L9 p. g
: F/ r) k) n6 X+ R2 f9 P
void main()
, h: x" z T4 M' U9 m7 d{int i,count,h;
. [2 u$ @7 a' u+ T9 E6 l( Yfor(i=1;i<=M;i++)
; F: C3 ?" m% r1 d) j7 P{ if(i==M)7 V' i2 | v2 Y
link[i].nextp=1;
3 q* J, b# H; i' U- e; H else% Z* M e2 g2 d# u4 X
link[i].nextp=i+1;6 e5 h2 }6 Y, P! o2 w6 J
link[i].number=i;
9 E* `; I0 d( E ]6 C& g}
H2 Q0 U5 o4 d( x m5 ]3 c5 O; Qprintf("\n");0 V! ]8 y$ V; n3 `: N! e
count=0;
`; J9 Y6 [' t# F5 R9 n3 n, q1 ^1 ih=M;# O1 k" S2 E1 o' [, Y5 g0 J# e
printf("依次退出的猴子: \n");% I. \. y g. S% E) |
while(count<M-1)
0 v* i; Y4 l3 O{i=0;. I3 Y/ B# u9 p$ z
while(i!=3)! Y0 X$ m, q2 Y) L0 H1 @
{ h=link[h].nextp;
1 r0 y$ t: m* J; V6 D0 ~$ H- f if(link[h].number)
; s# \5 `0 v1 o1 [1 z8 n! G i++;}
0 y; a7 d2 P2 _; c1 O: D$ k6 W( n5 @" G
printf("%4d",link[h].number);
6 y& U; d. [/ d( v4 A9 O& Glink[h].number=0;# o% R5 J9 V- S5 d4 Q% c
count++;
0 [9 a) ]7 s, b; p9 ], w/ t}' _+ K% O" c8 A2 J8 Q! @
% w: {) o/ u1 v2 n
printf("\n大王是:");, p3 k* P6 l. b
for(i=1;i<=M;i++)
* O' z' J) U% U if(link[i].number)
6 u4 S* H7 _1 T, v* x$ f W printf("%3d\n",link[i].number);
+ y% s, t+ C8 ]2 j' ~' d$ p5 A7 N+ j* s" u2 O
# L) a! e; t& D q- F+ }- h}
! O! y( X* l: ]. n( C第三种是普通方法for循环1 ^' ] z$ ]- V9 Z* r4 G0 P
#include<stdio.h>$ Z9 }! s5 x ]- U% s
void main()5 `) Z! I. i9 [; |, g' N
{ int i,k,m,n,num[50],q,*p;
7 G- B% K' Y! P$ s clrscr();+ Z, U' M4 t# G! ^
printf("input number of person: n=");
1 I8 _! V1 d; \( ] scanf("%d",&n);' G* X/ W6 E7 _. R% R* A" M @' }
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
1 J+ o- c, V' x% _ scanf("%d",&q);# p) y H6 G3 ^& R6 V) E
p=num;
' w! R4 D9 K7 l* b for(i=0;i<n;i++)/ l, O# _3 c; N% @5 P, J$ I( P6 f1 \
*(p+i)=i+1;6 U% x& X, B9 }- a
i=0;
' h4 m x, P* @+ q$ w, S) v k=0;
- k1 ?8 f/ @' G( o, Z r$ y& k# J* c m=0;* X: N Y5 W I1 g) m
while(m<n-1)/ ~% o# M- W' E; ^
{if(*(p+i)!=0) k++;
2 S, u6 h) {8 e, F if(k==q)
( `5 l( A1 B: m! L& c; ~ { *(p+i)=0;1 v. ?: E5 i; W* J. E% `0 M ]
k=0;0 d6 {! }. o8 p8 i' V
m++;; U4 t+ s! W, M I' u
}
$ M% s- U, {7 i! b i++;
; o9 ^9 N. B M+ C9 D1 L* ]3 D if(i==n)i=0;4 z/ P% |! v2 ?/ O
}
8 B F( [8 U1 w) t( i6 O9 Y. V& m while(*p==0)p++;9 x$ Y' E( T0 A. |
printf("The last one is NO:%d\n",*p);1 G7 E1 d. {8 ^/ \0 f" l' ^
getch();
1 v2 y: X8 H! z }' u( o% v5 ?" h2 V2 l* y$ Y2 ?0 V
} |
|