|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
0 C7 i! h3 y9 j- K这几天我在忙着编一个问题,我用了一种方法编出来!3 k5 G) ]2 M, E. M
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!7 S/ T/ @( _2 p6 n. q& N& u u
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
9 K- E5 P2 j- p; W
6 E1 ?, [* r$ L' t! r" p L: z8 h+ H* }, g! w+ \' c
题目( C/ O1 u3 r. E. l. N* n; E9 p
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。4 F( \, n) m- w+ c9 E0 I& t' o& Y
第一种方法:利用循环链表
/ o' v& h' j, m#include<stdio.h>
# A& J& `5 `" D#include<malloc.h>
b" H! D ?- R' ? S! @& p* w5 M#define M 8 //共有8只猴子
3 `2 c g1 C, N$ Y( q7 V4 ~% z: C#define N 3 //数到3只时退出第三只6 K, W! d6 t% d" y& [
typedef struct monkey
1 G3 C+ V& d0 s4 I{int number; _' N$ [4 \$ s. R- T/ }$ F
int flag;
8 G, P: Q9 K4 D& X6 n. ~& W* dstruct monkey* next;- ?/ s0 R h. Y8 s. ]+ o9 l
}MONKEY;
4 q- N4 K$ i0 h- k4 Z5 P$ ~6 imain()
4 i/ {' b. M2 t1 o- u, p" J. p{ MONKEY *head=NULL,*p,*s;
! n7 ]8 X8 Q- e" S; A& }3 w int i,sum=0,count=0;
4 g5 R7 a4 ^7 o clrscr(); //清屏( W) A) Z8 Q- F
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
" u% f: V* q; l; U% c+ S p->number=1;p->flag=1; |# P/ g7 Z: x7 c/ b4 @
p->next=head;
2 \5 ?3 B3 D& A3 v5 z5 G7 p' @ head=p;( Z/ ?% c6 B3 t, H, q* F% y+ q
for(i=2;i<=M;i++)
2 f& p9 M4 W# _( u { s=(MONKEY *)malloc(sizeof(MONKEY));
8 ?. R$ w: S- w" I s->number=i;s->flag=1;& Z. z7 c3 y- |3 ]) e; L/ [& k8 |, W
s->next=head;
' C$ l% e. m) M" ~ p->next=s;p=p->next;
: S& s+ l! H5 D: L }' ~2 r' B7 }( D& J; f6 y8 F; M
p=head;
8 h& y! [9 Q! g0 I% @ for(;;)0 V4 \6 X9 z, p, e. a6 g, W' y
{if(p->flag==1)
8 D( d# s5 n# \5 s- k count++;0 _/ ^( h3 D6 B4 m3 W5 R8 T" K+ ?
if(count==N)
4 `8 @& p7 J- b4 _* N, B {p->flag=0;
) s# p1 b& Z! v+ d& n count=0;
9 B& {0 L7 f- H' d: l$ y4 j sum++;}. ]: K/ O0 a% L# [, Q
if(sum==M-1)
) W* ~/ t! i! N* ]: V break;9 ^% B# m7 Q$ O: S
p=p->next;9 ~* i' m& Q) W% J+ ~6 N
}
4 t# U) `+ O( |" j0 H7 ?7 o* y& b p=
. a# p$ h1 p" b# H0 Z3 v% E( ? head;& @5 k! a" X$ w& N
for(i=1;i<=M;i++)
8 W* m, ?/ M" k1 z2 W { if(p->flag==1): H% b0 h- A% ^( b5 S
printf("\t%d",p->number); I8 n: {3 G0 g% o! X5 P
p=p->next;
4 X8 A, Q, P, u9 X0 k }
$ v" u5 N# a& S( L h; S" Y
7 Q5 `$ `& L* K: [3 l( S4 \- j
* y0 D" j1 t2 `: S- @7 o! X1 @% G6 h' i5 v
}
6 p1 N% ?/ g7 n; P3 o0 `/ }第二种方法:数组3 Y% v& c7 R& ^; z
#include<stdio.h>
' v: a- X; }6 p) K+ }+ i! g#define M 8
: l+ P# q1 z3 n# d( ?, H5 C1 gstruct monkey
3 M/ O2 T4 R# ~. Y P% D+ t{int number;
! y; J' e2 [+ _0 }int nextp;; E" a9 Z+ H% u) n. u* T0 [
}link[M+1];- m4 f. X+ d) d8 A+ c. g' Q
3 r% `: x$ g9 F
void main()
* M$ B' B0 E P' o{int i,count,h;
/ T# N. M# e4 X+ z! lfor(i=1;i<=M;i++)
0 t) U4 c3 X: g# _6 t6 l{ if(i==M)! m2 E- `9 p5 |$ ?+ z# b
link[i].nextp=1;
7 m4 U. g e& I! s5 V9 ^ else; e! W G/ O# r' {0 K% J3 U. b
link[i].nextp=i+1;
0 Z6 ~8 r- F$ N) n# s. @ link[i].number=i;
9 Z; }3 Z! M$ c( e- F& ?}
4 {( h8 c% H' h7 i! W- S+ Iprintf("\n");' X! p' {) W& R2 Z
count=0;
$ l" S6 A1 e& e7 F/ Q# V; ~h=M;
/ Z3 Q% ^ c3 m0 Q( ~5 ?/ Lprintf("依次退出的猴子: \n");/ h4 \% V. h6 D* h [
while(count<M-1)7 r# z" I8 B V
{i=0;# f7 M; w0 [# A! K' Q- C; r7 g* l
while(i!=3)
: j2 x4 k$ |( p* M; F8 n5 _{ h=link[h].nextp;! a$ k1 Y0 X8 l- ^0 k; X8 }
if(link[h].number)
6 }" R5 v2 v# K, D' r i++;}8 O, n% P( f* R1 A2 J1 Q J6 k, i
) i% ?6 {* W9 Z8 P9 I9 Y- W! C. K
printf("%4d",link[h].number);
% z. Q Y& T+ j/ D( i8 _3 j$ T9 [* @link[h].number=0;/ B* R2 f9 P) _
count++;/ [& n3 }& J4 L1 a
}2 ~, z9 d4 H8 B6 u3 F. u5 P- Z
6 J' q8 I+ [& Jprintf("\n大王是:");* W4 x- x! h7 H' M
for(i=1;i<=M;i++)
7 y9 l0 x' y* v I if(link[i].number)! O: _) N/ {& r* q" r, x
printf("%3d\n",link[i].number);
& B9 A( E* Y3 ~ h6 ]9 Y% _# ?0 V8 f' p d% I: h2 T
7 F. @. Q/ J8 P3 J/ T} ) V: O, M! F) S$ L, s
第三种是普通方法for循环1 x1 \: U+ g7 ~9 G, O
#include<stdio.h>
2 b6 C- U5 o3 y0 n9 Qvoid main()" }; {3 o3 q. ~; Y% j' O
{ int i,k,m,n,num[50],q,*p;+ }# e* y8 k0 G' M8 v& r
clrscr();
: ]8 G4 g3 R9 {, z printf("input number of person: n=");* c2 ?+ C, }, N7 }% @1 c1 B0 \
scanf("%d",&n);
/ o0 K: _% d' d* c1 hprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只 P# e. [, \8 e. `% j7 D
scanf("%d",&q);
& L+ f0 Q$ b0 r p=num;
1 w6 z. ]7 Z6 F9 o3 z for(i=0;i<n;i++). `* W" k: K R; ?6 t4 l
*(p+i)=i+1;1 |% g3 p, T. O
i=0;. Z9 _ Z" m( x
k=0;5 a4 r" |+ J& g$ P$ s
m=0;4 R. Y; n" Z, Z+ r' W
while(m<n-1)- s# Y; ]% F& D% ~6 X8 h
{if(*(p+i)!=0) k++;
/ J0 L7 V6 R+ T* a( T& p if(k==q)& k. \1 U& j* f' m
{ *(p+i)=0;
8 _. w9 o% m# O0 w k=0;3 z/ }) W; T8 U8 k
m++;
8 T. a" m& J0 H) }/ d2 r }* g2 L1 V- `) I! A0 r, g
i++;) T0 c: y7 N$ z4 ?8 b& E2 o8 Z/ {
if(i==n)i=0;
9 l! C( q1 i: Z9 ^5 U% M }! A* r: B5 y. i/ Z% e+ k4 s! y
while(*p==0)p++;% Z- t' t, q3 H! D1 n y8 q* s& V) Z
printf("The last one is NO:%d\n",*p);, X. z8 [0 ^4 C8 F! `0 e F1 c, V
getch();: }7 o. ?/ Z% A: d# y( \+ c, s
- B* M- H, F, c" p. O' ?2 N `
} |
|