|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
$ x, M6 n5 E3 D1 J这几天我在忙着编一个问题,我用了一种方法编出来!
: W- P# T: U+ N; h5 Q+ q: _$ o但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!/ x. l" F" P: `1 _: L6 b/ A: d: l" `2 n
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 . i- \1 Z. a& }. F5 V
) W8 w0 Z7 |" [ y- G( v& l' c
. p, J: w6 K, e 题目0 u% R/ D" t+ T9 O" Q
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
2 C% y/ W( H$ t& p+ h& F第一种方法:利用循环链表$ z9 ?$ I: _) y' t% {
#include<stdio.h>
8 W$ g+ y+ p1 T0 S#include<malloc.h>* U$ c. `4 ?! o1 D
#define M 8 //共有8只猴子+ H3 [+ n$ Q' p4 U; Q
#define N 3 //数到3只时退出第三只
$ G2 p; Y' q- _$ Btypedef struct monkey: K+ E9 k, s+ x9 U# S
{int number;
2 h; e* K+ Z) g# X) e. T E, j& Jint flag;
0 o3 M- U$ r* Q% |. F9 @6 Ostruct monkey* next;
; n( U3 S$ S, s1 K) _$ L: H/ R, e}MONKEY;$ C+ C9 b9 T; }5 c; m8 P- o
main()
) `+ e6 C8 p+ @' r& N; X( O& B) E{ MONKEY *head=NULL,*p,*s;
1 g7 K( @+ [, H; a5 E% @ c int i,sum=0,count=0;
3 x L. |! o9 C @& S clrscr(); //清屏
0 s! e. Y2 h: b: @ p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存# o' j6 y' S0 d- M- U4 E' y) S
p->number=1;p->flag=1;" C1 j- u6 n% Q$ C# x
p->next=head;
! y. q! k# O/ A8 _ head=p;' V7 j) c1 H* N/ \+ U
for(i=2;i<=M;i++)
# b6 Z7 j$ _- d1 y0 H4 D( r$ d { s=(MONKEY *)malloc(sizeof(MONKEY));* ?3 n/ z/ D% Z4 o# ^ K
s->number=i;s->flag=1;
% T) }$ g! p& B3 [$ | s->next=head;. C! ]; Q5 T5 Y# r; g
p->next=s;p=p->next;" y7 h3 P; M2 {1 Y) ^9 [1 C1 p; {
}
0 s5 ^6 |8 p2 d0 F8 H4 f/ ^ K p=head;
; s# p. U" U1 C& ?* V u for(;;)4 m M: j8 w# c& I- t- ?$ i
{if(p->flag==1)
1 Q- t: {+ y2 b: r: _ count++;
6 j! C- e8 X" @4 w4 u+ c if(count==N) ^2 O1 }" S3 T! Q- _1 K9 }
{p->flag=0;1 d# t+ @5 Y5 K
count=0;
( k9 U7 H2 I* m5 j* C7 a2 \ sum++;}
. ~* {8 b; Z1 u( u- [2 s$ v if(sum==M-1)9 P% x1 v* _- f3 U7 r
break;( D# ~. s1 D+ w1 s
p=p->next;
$ k& W! d$ U1 \6 x2 S }$ T8 C) W# i; K _; }# x f
p=
2 W5 ^0 e5 b8 l head;
. H/ Z0 _. N$ X3 q for(i=1;i<=M;i++), @3 l" Y0 _# O# S0 J
{ if(p->flag==1)' d& ]1 L; ~: L+ E9 W6 W8 n
printf("\t%d",p->number);$ ?' f8 L1 a/ J* A1 n
p=p->next;* _9 ~8 S( t) @6 t
}
1 j+ e8 l: e2 \. P4 k2 U7 P9 q A( D5 J. z: t- h
% H1 N& o- a+ {( l3 ~/ I5 F7 x* Z. S. S' ?# _% P
} 4 v1 u( Y9 |8 X8 x
第二种方法:数组( j0 m' f2 y) J2 Y# B j
#include<stdio.h>
5 ^2 c6 ?3 w( w- V! H#define M 8
. l2 O6 b6 {5 d& s" estruct monkey+ m2 M) z" G, ]+ u) T5 i" R' H5 F
{int number;
6 g) `6 e/ d6 Aint nextp;
# c. L- c" X% @1 a}link[M+1];9 |* o9 K; e" E+ h( m; U+ u
/ D8 ^. Q5 B" T- c
void main()- f9 h. D- o. V( l1 }
{int i,count,h;5 T* F# ]4 y3 S/ i
for(i=1;i<=M;i++)0 \0 r- A+ u( U7 V* F
{ if(i==M)
2 ^0 x; ^8 J3 ^& w8 H: j; z link[i].nextp=1;
2 h" l' f7 N" X; z2 J else
# l% K) ]* s5 H. Y# i3 ?3 z! H& W+ i link[i].nextp=i+1;; _2 Z5 @5 ` l6 H0 k6 L
link[i].number=i;9 A0 ^ z" ]- C2 V5 r! V& Y
}
. K- R8 Z' ] v: ] lprintf("\n");
" \7 b# r" O7 O( o; \/ y0 Z: dcount=0;
6 Q1 ^' P& P) N# T' r6 ~; ]h=M;/ ?# _8 j1 u, q7 d/ A. Z
printf("依次退出的猴子: \n");
" f( }% b6 ^" L# O8 e* hwhile(count<M-1)6 f/ L" n" B) L( D' V9 V) j
{i=0;
$ N, r4 _5 M" r4 rwhile(i!=3)( y/ N: h2 {, f+ u' Q
{ h=link[h].nextp;" h0 e+ N y# J, e
if(link[h].number)2 M- B4 s* a1 E- S) `
i++;}: K$ \! r* I6 o. `
! N' ^9 U, d5 C. e" _6 xprintf("%4d",link[h].number);4 s9 }+ v" x4 ^# o! [: X% c
link[h].number=0;2 D) n1 H, f# R0 W8 @
count++;. z a, u: T+ [3 N* C; H
}" j w/ a0 m1 S
/ b! J6 E" ` n4 j0 l% ]: ?printf("\n大王是:");; q b3 s/ S! {6 o* ?
for(i=1;i<=M;i++): h9 u6 j0 K! A* P$ k/ t& C
if(link[i].number)0 F6 v: }7 V1 H' P$ b& A
printf("%3d\n",link[i].number);5 _ x/ F$ T3 d4 e& K, s. l4 S
# Z* Z+ u* }# R2 ]
4 F" S1 ]! {8 F5 q( T} 0 c# y b7 m6 {' X9 ?$ K; W1 F
第三种是普通方法for循环( W I$ A9 B0 I' }; r# I" H
#include<stdio.h>$ X- I0 |" A4 d; r( ` ^
void main()
# h( A/ f2 m( G5 o5 q; K2 o& n. a{ int i,k,m,n,num[50],q,*p;
8 C, {0 U6 N7 e6 {1 t2 \ clrscr();
/ d6 _9 X* l$ H5 H printf("input number of person: n=");3 y" ^7 V4 l- ]8 ?+ O S) |- |. Q! W
scanf("%d",&n);5 T; u0 g! w" s4 Y, ^' i$ Y% n
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
/ O/ S, [: M9 ^4 ^% y# ]- H3 c3 @& W- x scanf("%d",&q);
/ J% g$ J, k5 a# W5 R* x' C3 d p=num;& @- v& O# P1 M
for(i=0;i<n;i++)
( _( x* s8 R3 @& D& Y I% P5 ` *(p+i)=i+1;
9 w- s: Q( b1 i y* o2 q- l i=0;
9 y8 W' i7 I# ]2 y k=0;
1 g7 G, b! q4 O4 I m=0;9 E. Z! X2 Y9 {; y1 d3 Q. e: b
while(m<n-1), B' N. R5 r$ z# f$ f9 j! U/ o3 ^
{if(*(p+i)!=0) k++;! W5 R2 ^5 z2 R. x# v( c- K+ F
if(k==q)
- e. G2 C# D% L$ [ { *(p+i)=0;2 P. D0 M2 C- y+ o
k=0;
, t+ `( c% A) | C- e; c m++;9 _! a2 R; b0 w6 L% h1 c. e3 S
}
, q5 r) L' B- b' w/ l% R i++;3 a% B K; Z7 K7 H [8 S, Z \
if(i==n)i=0;, w/ q9 w8 v1 l% m8 f% j R
}# ]" p' L- }8 Z/ y7 E9 e
while(*p==0)p++;
, G7 W3 l5 d; J* _0 m' P4 u: w- T/ H printf("The last one is NO:%d\n",*p);
7 l3 N0 a8 n- T getch();& _8 D0 x1 C+ W) o$ P5 j1 b
8 d! ^, ^* F1 S! u# Y3 a
} |
|