|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!: Y, R& z1 E. y4 P" b ^* X; ]
这几天我在忙着编一个问题,我用了一种方法编出来!
6 D) p0 ?. J X7 r% X) F但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!7 c( z) _" w: k# s8 J: J3 t
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 1 c" J3 L) N! r) y' o
- v9 p2 s' }: }0 D
3 G7 L" g/ c* @: e3 ?8 d- d9 S 题目
9 T! B9 X2 L; o; l5 F山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
+ _% t V; z! t! l6 O$ e0 z6 H% c第一种方法:利用循环链表
. [* u0 x% y# |- O; r& V/ f4 C1 {#include<stdio.h>3 r9 k& X! T& B- R6 z
#include<malloc.h>
0 D0 d$ B5 `; Y1 V' \4 y5 S n#define M 8 //共有8只猴子) ?7 @' U) b4 J7 o6 E% x9 K) d
#define N 3 //数到3只时退出第三只
6 F0 o. \( _- [) s! ?typedef struct monkey/ k2 \3 w$ k8 c* M$ N9 I9 Q! ^# m
{int number;
+ o6 Z* B" N+ \# P2 S1 |int flag;9 P& O. Z' F' m% M5 G3 K; f
struct monkey* next;
1 \2 M0 k x2 ?}MONKEY;7 ?/ T( O5 z+ j8 N- y; z2 q
main()
. t5 ]5 J$ |: x5 ~{ MONKEY *head=NULL,*p,*s;
e' J5 t% V; P+ U# D" [ int i,sum=0,count=0;
5 j0 [) D5 O+ P clrscr(); //清屏8 A2 M; u8 G3 U; R
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
6 _. K% v d3 y* i( O1 _( _ p->number=1;p->flag=1;
9 t# r! g5 l7 f! ? y* ? p->next=head;
3 _9 `. U; w7 w2 M head=p;
0 b- e- Y4 ]( g$ x5 H for(i=2;i<=M;i++)
% X; l* U* J; k, m7 A- L, A; h! [ { s=(MONKEY *)malloc(sizeof(MONKEY));
; c$ j4 U2 \: B s->number=i;s->flag=1;
' s9 U |0 | @3 S s->next=head;: ]6 r$ [. \9 i- e- s
p->next=s;p=p->next;8 t- b& e+ B) w7 ]3 C$ ^/ Y0 k- i
}4 n( a* W2 ?) e2 V0 s' h3 u
p=head;" e, b, i1 q/ i* G+ h
for(;;); e1 x* ^: n+ W: l5 [
{if(p->flag==1)
g4 y: y" ?+ s5 n9 @# Z/ a count++;/ e! n2 w+ {' {2 A$ a1 k0 K
if(count==N)
2 p5 ?. |" M1 Q7 x {p->flag=0;( @$ `1 P( p9 q. q
count=0;
/ r+ N) E1 C g4 @ sum++;}
" \6 N7 S8 W9 e; c$ f2 c if(sum==M-1)
2 O; M0 D; I) ^4 z- c; Q2 Q break;
" I' w0 U* R: f2 w1 D p=p->next;
) E1 Z0 U, |9 L6 f5 ?+ K* w4 g }
% J$ `: {. V0 e4 t1 C% X: [) G7 _6 f p=5 S- H% L/ Y3 h6 M. l5 N5 C
head;
% ~) l4 u, F. [7 q3 s for(i=1;i<=M;i++): e! q; u( h) ?# l+ a& G
{ if(p->flag==1)6 e- o% D# S9 J7 [0 E
printf("\t%d",p->number);- i! j2 p0 X {
p=p->next;/ `+ @7 J" G2 I6 D, V; ^
}
/ k+ B1 ~$ I( h3 A3 ^* i4 ?3 o
8 [. f4 J/ J6 L& W# [# x3 W9 y9 ]/ [/ q' F I
( c" k' X3 \2 U: u
} 2 g2 C: p- |: z5 Z% V% }3 f- x) Q
第二种方法:数组8 Y/ K6 W, g, f) `* u
#include<stdio.h>
+ \4 W( v1 n# H7 l- h#define M 8; e( {2 ^ I' j# t5 y# W8 M Z/ O
struct monkey! }1 H: E9 s3 H0 j/ `6 Q$ k& S
{int number;
( x @7 t) L- aint nextp;
# X. l) D a* S}link[M+1];
# o I; _* Y4 g! E7 h8 e: l# i g9 w& [2 J. `
void main()
/ c) Q. X7 t6 |9 L+ v; p j6 d{int i,count,h;* P t4 E7 ^+ X
for(i=1;i<=M;i++)
6 H6 Z a6 ?- y( p7 R* E5 E6 U{ if(i==M)
. @: b: f1 j8 ?- o/ z% u link[i].nextp=1;! g! S4 G; r# t: B0 P/ x' B, i5 e
else7 I! w7 _# a. x$ n
link[i].nextp=i+1;
) @& u1 m& _- U1 r3 k link[i].number=i;
+ c/ N, o# o" J/ V2 v/ u6 s+ I}6 q# A& m/ h+ u3 a" \3 ? E6 [# F" |
printf("\n");
8 i% a- q2 o+ m Z4 B9 jcount=0;
0 i; Z- \% |1 t" C) B, u+ lh=M;
4 v3 v; J, E% m- m" r' R- Wprintf("依次退出的猴子: \n");
5 ^! ~( W$ h5 Z; L: d( Q1 Vwhile(count<M-1)) j! G/ e& {2 O
{i=0;
, o+ k7 \! k) P/ N; O; {! Swhile(i!=3)
) d3 |' i7 L# B: @# \$ C{ h=link[h].nextp;, o, `# }' Q: }4 ?/ [, r
if(link[h].number)
8 q9 i* ~: K& {. B2 M i++;}9 B0 o4 Y7 I- u4 v6 w+ i
* d0 p! ~- g+ R# {printf("%4d",link[h].number);% w$ a- y# h+ u, y! y
link[h].number=0;
' b' ^4 P/ r& _9 b% ucount++;( @- v" T9 e0 d6 d5 ^# _
}
% c k4 ^) |/ @- S" A$ G0 l* w" k; |1 T# ~* C3 ?, _/ K1 a
printf("\n大王是:");9 m* I( m3 c4 O1 L+ K5 T7 N/ b
for(i=1;i<=M;i++)
+ ^9 _ F4 o$ T- u1 o5 }8 n' P! I% I if(link[i].number)
, y0 I2 s2 I+ d* }! t/ I& z' s printf("%3d\n",link[i].number);" Z" G8 G* k/ y; X1 G2 s/ C
/ _4 ]8 l7 l( V' c& s A) Z; W5 O ^- I+ W9 M) S
} 4 h7 q7 R5 g: I* C# Z
第三种是普通方法for循环6 q: B. x% Q, K7 d
#include<stdio.h>6 x9 Q6 z' G5 E" f4 s6 g* v
void main()
5 b2 V6 ^/ V( z. `7 O3 c0 U{ int i,k,m,n,num[50],q,*p;
; k$ Z6 X/ p& L) b clrscr();( z! `4 i. c% s U! p0 }
printf("input number of person: n=");
+ F8 o0 t, J* c scanf("%d",&n);
w& d* D; R2 q: s+ k$ R7 zprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只$ f6 x$ f' @ B
scanf("%d",&q);& B1 Z) b/ h2 ^. W, o0 v
p=num;
- e" i8 x5 ?4 p for(i=0;i<n;i++)
# y- }% K ^' g! h; z- q7 g *(p+i)=i+1;
4 w0 y6 i. M7 b* N- d i=0;
2 ^; x. o0 {- Z A0 G8 N6 p1 O! H" h k=0;/ F/ X, C) v3 q) J7 K
m=0;
5 J! ^: V2 B# t! j; g* Y2 g+ Y while(m<n-1)0 R. u0 J! c7 j4 N# _
{if(*(p+i)!=0) k++;
* }5 U/ Z" o; @' @7 s; P if(k==q): j( F, T5 m' N" U( o8 {/ w; l
{ *(p+i)=0;8 O& M$ W$ t/ u; ]2 Z$ r7 H4 U8 i ~
k=0;+ T( }4 \2 i( [# ^5 U% {4 M
m++;9 J1 F6 ?5 K* l- q" F& w O0 Z
}
+ s8 [2 h5 ]: h n% R4 ~ i++;
8 q& c9 V* ?2 m, d& k. K" C if(i==n)i=0;7 x/ O; v+ H1 a$ a& Y
}# V) Y- C2 w0 X9 H! e3 }' \% }# Q8 L
while(*p==0)p++;0 P2 a5 f% |4 Y. @
printf("The last one is NO:%d\n",*p);( T5 b% g" a- c/ D6 o% ?0 B
getch();' X( f9 A( F% y1 b& B
& n0 M$ e, J' a6 f8 A, S} |
|