|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
# o6 v) U1 `7 w7 o! }" G- x, T; o; \这几天我在忙着编一个问题,我用了一种方法编出来!
1 H/ W! {0 H) m) G3 ]# ^, t但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
" b; W# b/ H9 Y3 l注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ' m* H! F5 V* s
* t! D2 z S0 T" I, e
, F% q: p8 r) ]3 b& M j( j; k; N
题目
- ?7 H, p! q' z# s F2 t- @山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。. z; W% W% B' G K8 l6 q, A6 h& ]
第一种方法:利用循环链表
G8 P) O+ y0 ^8 ?) d, d#include<stdio.h>
* o8 j9 H2 x0 ` c# h: j7 Z#include<malloc.h>
1 V# m$ i* l$ \#define M 8 //共有8只猴子
?5 B7 o; m; r8 r( j& J: Q+ O5 f#define N 3 //数到3只时退出第三只
! O6 O! m, @) Itypedef struct monkey" h' e) j1 J, x
{int number;
9 j6 V0 W' ~2 B" [( y" Rint flag;/ [8 F2 p+ { G7 d+ P3 C1 n, l
struct monkey* next;+ L. [/ t5 T( ?% J9 c2 R% Z
}MONKEY;
/ C" `% r- D: _' Q/ f8 j3 Fmain(): G9 w% P1 w9 W2 B; H
{ MONKEY *head=NULL,*p,*s;5 ?+ x) v9 w+ s' F. H( E. x
int i,sum=0,count=0;
5 A" P$ D) r5 ]7 A3 l& ~) W$ b clrscr(); //清屏" x8 F5 P9 ?. k2 ?
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
9 q9 \: q1 G1 l" y7 ?4 m p->number=1;p->flag=1;
6 x$ ?8 G( h3 Z* s3 L+ B8 S( Y1 H p->next=head;
2 o. x/ P+ ^" L _ head=p;! r1 |0 X& e8 |* ^# z& {. O
for(i=2;i<=M;i++)
, Y) w9 V. |8 G" G { s=(MONKEY *)malloc(sizeof(MONKEY));$ y* D* M8 f9 S$ y8 o$ V. o
s->number=i;s->flag=1;
4 j* d, m3 J3 t! F7 p- s8 j7 f9 Q' y' y s->next=head;! D! m$ ]# A- }- Y
p->next=s;p=p->next;9 k9 Q( ?4 c/ [# R8 \4 l
}
7 f3 {0 M& O' t7 @1 {' m2 _& @, W p=head;. @8 q* Y( v0 u
for(;;)
0 F2 z/ O& U, \; U: d: B! C9 s {if(p->flag==1)( ~8 b; L* O: W# D1 h: `" d5 I
count++;: Q2 v4 R1 n. J4 S- `- N
if(count==N)% ? d J K7 e! K! J
{p->flag=0;
9 x7 d2 W! m; w$ l+ M count=0;
+ Y; s$ `7 o# A4 x, D sum++;}' A, i6 l' b- e4 c0 C
if(sum==M-1)! H/ _: S8 d0 {& x* J! ]3 |1 X
break;( d9 `4 J# R r! ?: p
p=p->next;
0 l" q" L& V& T+ { }1 Z" n4 u: d3 e* X$ g9 j/ I" g
p=
- P; L1 m" n* j0 z! | head;
9 Q3 h! [4 k- d8 A for(i=1;i<=M;i++)6 p+ S3 G- e) R N. C6 d
{ if(p->flag==1)
% V2 g9 k. h2 b) L0 U8 l printf("\t%d",p->number);' K9 D, V3 U( y1 z5 [& k% `, K6 d
p=p->next;
* v+ E8 {( O+ f2 b2 ~: t; I5 d } j l; ]0 y$ f0 j+ w8 o
% ^) P3 S8 ?3 F" h
+ E1 p0 g s4 R& w) X2 \( z8 T
; [' P: a$ s# u5 U' B$ F+ y} - m/ Q- B" S$ ]1 X% z9 K: |
第二种方法:数组4 ^! C# H/ L2 Z( t/ C- m. f" }% \& p6 A
#include<stdio.h>- O" \* ^$ R0 h" D% B- C
#define M 8
0 [: C* i4 `* k9 c# u2 o7 Y# y0 Qstruct monkey& e6 C9 |! N: L7 g# Y
{int number;
3 x2 H+ z* a: G0 f5 ]- j( t- Iint nextp;, ], a* x7 H7 s& P
}link[M+1];) K, J! q5 V& a& P
$ c2 {8 D) q4 ?7 j- ]void main()+ t# q& h% j: X- B4 `, z
{int i,count,h;7 Y$ t! E; T2 C& ^$ a, @
for(i=1;i<=M;i++)
% W5 o E# t; ~7 `* D+ T1 o. H" r{ if(i==M)
2 X, Y V# B# l! j link[i].nextp=1;
* S I" }0 l6 f1 H5 ^ Z0 [4 Q else* j( s3 S) ]7 F5 W+ X7 S6 P8 I' t" y) q. u5 c
link[i].nextp=i+1;3 t/ \0 O" j- W5 K& r1 Z
link[i].number=i;# Q# }5 d! @) |
}
% }2 ^7 b; n2 a/ \printf("\n");
+ ^7 D- | l8 W+ G4 I7 i8 icount=0;
$ g) S$ v5 m) M. @" fh=M;
- F5 f M: d- Gprintf("依次退出的猴子: \n");
; T9 @; K* c: t* x1 Qwhile(count<M-1); l) ^$ f- i/ d# Y8 u! ~
{i=0;/ O( X O8 |* Q0 t1 T3 {8 r' Y
while(i!=3)
# z+ z! _; f( _2 C4 ^/ s, l$ U. ?{ h=link[h].nextp;
7 h; i9 Z+ F1 }6 X/ s; q% B* l if(link[h].number)5 }" f8 H5 M7 q; ^! s6 Y
i++;}7 t( ?) J6 m# A* o$ u" r
7 |% F S* }: m+ cprintf("%4d",link[h].number);1 i, c, c2 Y3 C6 C! Q/ s
link[h].number=0;, a7 G6 [1 ?- m9 R' c- Q4 e; D9 c* A
count++;% Q A* U E9 }* d" [! N6 J
}
' w9 ?4 M) j/ d% _3 I# f& U
; I* \* Y- u! k9 E @printf("\n大王是:");- J+ t7 Z% @8 N
for(i=1;i<=M;i++)
7 x/ F4 u& |8 q if(link[i].number)
( K4 T m7 g/ o- i. S( R/ ?; a printf("%3d\n",link[i].number);
" `$ F& W2 D- t( F6 ~3 ?) r; _8 K0 S0 T% y. U; c9 D# k. h2 y
3 I- `0 V2 k8 h1 H) R}
+ h" ^% N- g, J' j2 n ?第三种是普通方法for循环
& t2 l6 x4 p1 O |1 e4 v+ D; S#include<stdio.h>
! ?2 l$ f- X. _# U& R3 Mvoid main()
. W5 Y) l* Y4 c{ int i,k,m,n,num[50],q,*p;
" p) T: t6 c5 f clrscr();
* N+ z4 t K1 |" T printf("input number of person: n=");' J9 `8 n1 }0 a0 u4 X
scanf("%d",&n);: h3 }) O$ z" Y, u! x+ B
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
9 A+ `1 r& ^( K% T" e0 f scanf("%d",&q);
: _. w: V& F( M3 G9 D) n8 \, r p=num;
7 U3 t y- Y' J3 l8 s$ L$ ?$ n# Y for(i=0;i<n;i++)* s: H5 ?, [0 z( s3 |) a2 |, u! |
*(p+i)=i+1;3 q4 K4 j. R; p3 D& O; c
i=0;
$ \9 y! t7 r2 c k=0;$ u0 j, p% _8 O9 x
m=0;% g2 e: P- u4 ?/ d
while(m<n-1)
2 ^5 S2 {$ G3 q+ H! D$ [ {if(*(p+i)!=0) k++;
( `6 @1 x- a" h if(k==q)
$ t9 v' n T1 z4 Y! A { *(p+i)=0;
# k4 |7 ~4 t; a k=0;/ J. f5 t. W0 K, V+ B
m++;
; ?' |4 W4 ?8 F }1 J% f, C; |7 ]; Z
i++;
) c( b$ B$ C$ j% A" |& I. n if(i==n)i=0;; P: Q! _/ G& q1 ?4 r: E
}' ?8 F8 b. Z0 `
while(*p==0)p++;
9 W/ r( P+ s# L1 v printf("The last one is NO:%d\n",*p);
* o) ~7 Q: w# N getch();/ Y0 P2 a3 V$ r& u
V4 B9 [! V" }! G1 D+ a- `* f) P} |
|