|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
* K& g" d* N1 o) l, h% u这几天我在忙着编一个问题,我用了一种方法编出来!( E C9 V4 t0 _& m3 f
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!8 n' H9 p- g4 @4 Y. x! O
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
2 m I; u" j0 P0 l7 y9 B" {* C9 f% i9 l& z) |' Q
# x. x! i$ G( `! C; I2 D
题目
6 a" I X6 G" }& s8 A {山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。$ t: A2 p" P# ^! c. r" M7 p
第一种方法:利用循环链表6 |+ t3 T7 r/ o; A
#include<stdio.h>. H. l- }+ {* `0 n' G4 z1 ]1 y. \
#include<malloc.h>6 Z! `. F7 O, J& y" |4 u
#define M 8 //共有8只猴子
# G/ f0 F% \9 r: F#define N 3 //数到3只时退出第三只6 D3 ]& R3 b/ b0 I3 C0 j
typedef struct monkey
0 f+ } p8 U0 R9 g{int number;
5 Y3 E* k. _, z* h( Yint flag; K7 ]$ l/ x: {. j" q
struct monkey* next;# t+ y4 ?" D0 l. c
}MONKEY;% y8 |' R& A5 F+ |+ n
main()
% }* [8 }& [1 T2 o0 L) `1 _2 b1 c{ MONKEY *head=NULL,*p,*s;
! \" w3 U0 e" Q& t5 b int i,sum=0,count=0;5 G9 _ ^" {7 Y! L: a3 e' A% a- {
clrscr(); //清屏
2 I; ~% A, W) G p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
& M3 z% D5 U( y: G& H8 z$ Y+ ^. y p->number=1;p->flag=1;# E2 t* o5 y7 u# ~; h) D
p->next=head;
+ v% F# c+ Y* H head=p;
6 [6 v x. w* ]- `1 R6 }; ?- M4 m for(i=2;i<=M;i++)
4 I/ E4 Z& X" | { s=(MONKEY *)malloc(sizeof(MONKEY));7 R x, H7 P& i% s
s->number=i;s->flag=1;5 R0 C5 K; t$ P% X
s->next=head;
8 t0 t0 E4 u3 D6 _2 P0 r/ e p->next=s;p=p->next;
F( p$ l/ j2 j3 |$ F7 D: L }4 H2 ^* u, ~. ~' s3 ] Y( P8 X# c
p=head;
. L V: X" T* R0 m( x2 K& T for(;;)
j. H, M! t+ ^7 B4 }+ O {if(p->flag==1)
' ]! r; ^1 T$ K/ R0 [+ ]; d# \3 F( N count++;. o) M1 b" m& D* Y3 P
if(count==N)
% S/ o# H4 c6 | {p->flag=0;
- ]2 ]0 M6 y0 s( s+ G; B count=0;
6 t x2 E4 D4 n/ U" ~% ] sum++;}2 Z( B; I) R1 H8 j
if(sum==M-1) z4 J1 {# Y) `
break;
9 f$ H: ]: W- m# r9 f9 {7 \ p=p->next;9 M0 M( n( Z b) O6 R! A9 m5 B
}
$ e3 y7 [5 b. j1 E! w2 P. X/ t p= E1 q& I; H0 z T4 {+ v6 P& o/ C
head;3 q' a; ^2 R4 r' z9 f5 Q; m
for(i=1;i<=M;i++)( U# n7 h- m- ~, }7 y* `/ r
{ if(p->flag==1)5 p% V. s) Q3 U& O. y# _/ ~* P) x
printf("\t%d",p->number);& x, r0 i- u9 L1 I, G
p=p->next;+ @1 H: ~& P$ U5 k2 Z& G
}
1 E0 ^( I8 r% _8 g: _0 h& G
$ B3 l4 ?" ]) p: J5 I- B5 ?
( `0 v( Y/ e& X; K6 M4 n0 }7 b7 l, V0 }# c3 O1 J
}
% f% Y- V& |" w2 S7 Q8 ^( q: a& E1 d第二种方法:数组
! w; R, s N0 V' z0 X#include<stdio.h>
8 h2 B# s) A; n3 j* v4 {, I#define M 8
, v: s8 K+ R% p! Ustruct monkey! A, G% L+ k- ^3 W+ ?( J, L: O
{int number;
1 E6 D5 L8 J% t( ~4 Rint nextp;' N5 T# M' r7 Y/ k1 m
}link[M+1];. Q% m+ B' ~0 x
! I5 W" S* d" O- r
void main()- ~7 L) ]7 G" S4 }1 m- K9 L( H
{int i,count,h;
/ P+ r7 B0 s2 o1 Cfor(i=1;i<=M;i++)
5 ]3 S+ _, W2 J{ if(i==M)9 S" _% Q& Z; u" h* K
link[i].nextp=1;
4 h0 q6 a0 D) u _, D' }0 a. K+ w else6 \) N. }0 m$ m0 D {
link[i].nextp=i+1;
/ x( x9 b7 e0 y5 E( Q link[i].number=i;2 G2 T6 g6 g2 O( j! V& _& v
}) o& C# h* ~( u
printf("\n");
/ f% n% F/ r; v' S; R# vcount=0;' u% @2 M6 C7 ~; Z3 m W7 ^
h=M;
+ } n/ W( v# _printf("依次退出的猴子: \n");. [5 p. s/ c+ @* q; x
while(count<M-1)
% ?0 N I/ ]4 q5 y7 k: A{i=0; n! b K, F: j# \5 G! {4 v
while(i!=3)4 a$ }4 ^6 \9 u2 G
{ h=link[h].nextp;
4 F" C/ t5 ~) L if(link[h].number)
' k7 |9 r p# s: d9 P3 F. z i++;}/ ]6 L; k4 C, ]! t8 J3 ?( o4 [- i
$ w- }( ]# b* u# u7 j8 [; U
printf("%4d",link[h].number);, X% @; m, r5 e# ^+ Y& ]
link[h].number=0;
3 u( H' E) M# I6 a9 v) A! Gcount++;% b8 F, k7 q; h S \
}
7 h9 o* U. l: K. _: P# M
3 i+ [4 T" A. H, x7 Wprintf("\n大王是:");
3 `9 _, u8 n5 O4 |) c! K2 S for(i=1;i<=M;i++)& w- f4 B* a- X7 k' l
if(link[i].number)) K, _; b" S- G) i* X
printf("%3d\n",link[i].number);+ ?+ q1 `( s- g# W5 [" @7 Q; k
' `4 B! }. p2 v- o' ~) X' T9 p' n7 s% `! y3 j0 Q0 z8 i
}
1 o1 D$ k' o1 h第三种是普通方法for循环
+ |* _- |2 w8 S7 |2 Q& O#include<stdio.h># x0 \4 p# W- k# { l: f
void main()
/ {: |* k- S& [{ int i,k,m,n,num[50],q,*p;! h" t' L/ X& I/ Y' l
clrscr();' b( G4 R; L+ Y
printf("input number of person: n=");
& Y5 b9 L% O6 {% i scanf("%d",&n);
, M: M8 h9 @! \# H' Tprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只1 D6 s; p, L6 j! @. t& e
scanf("%d",&q);
, |4 @1 A: r* Z. ~, b7 X D7 m p=num;
; g3 x9 \) t' F for(i=0;i<n;i++)
8 k O- a7 S% B+ z& U- } *(p+i)=i+1;) U" S/ ]* J& t. u0 |
i=0;
# w3 q( ^0 [# U: z4 n k=0;
6 Z# c! |* i m, E m=0;9 K; X \; v& } I3 i
while(m<n-1)
3 B+ h6 ]% r- q- q {if(*(p+i)!=0) k++;
) z( L$ T- D& j) H3 w5 Y' a x if(k==q)
: ~4 R, L, ]$ s { *(p+i)=0;
% c; x! w x2 T+ J! \ k=0;/ E# w6 o% `* E+ d' E( Q- u
m++;
) Y4 ]( B- D. N/ X }7 D2 V8 g+ X! s. Q- x6 s7 A
i++;- T2 z; s2 Y8 F z
if(i==n)i=0;6 d7 a1 o; T) f
}5 ^* Q1 D- D) a, T" e
while(*p==0)p++;3 K' }* z* x1 T. v, Q9 H% |
printf("The last one is NO:%d\n",*p);
2 o$ F* i& y B1 Q getch();
/ k: H, ^5 u+ I8 @) v8 N& K$ P. Q$ s; Y: }
} |
|