|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!: w0 r5 I) U' K5 A2 s S- C1 @
这几天我在忙着编一个问题,我用了一种方法编出来!7 L, s, U4 t* K2 d0 U' a- t
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
: [, D" R3 [6 r9 {; k2 X7 L: s注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
. r) z% g/ ?8 K% H/ R C7 V8 D/ P+ H0 ?1 D6 @9 e
A$ ?( R0 t3 L; }7 `9 i# T
题目
7 K9 K! n" q+ I) D* l山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。# \3 V/ v$ {0 T
第一种方法:利用循环链表$ ^( Z) N& C/ G$ Y
#include<stdio.h>- d# a1 S' D5 Z3 r9 o! c
#include<malloc.h>
- e. v1 x O) \5 p. j#define M 8 //共有8只猴子
" T# f3 I" s( K) h: q#define N 3 //数到3只时退出第三只" N, Z* j$ z Q5 D
typedef struct monkey
; z L4 ?$ R9 U- `7 ^" R9 X{int number;: L2 W# f& {3 p/ L/ |! O
int flag;
- f/ d8 D9 r& |( T2 R9 C" r7 S2 `struct monkey* next;( n" [0 a5 m( Y& H& {( x8 D" g4 e
}MONKEY;
& q, R) H* ^9 j* G+ Amain()0 S5 V+ ^' O& l# x
{ MONKEY *head=NULL,*p,*s;' [6 Z; e, S6 I7 V/ I) I% y
int i,sum=0,count=0;
; E$ V3 ]1 k# L clrscr(); //清屏
3 t: b# X, L! U5 N" v1 m1 s: @; X p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存. W" ^: w$ J% K5 Y# a9 g" X, X
p->number=1;p->flag=1;( @' O- B0 W& H* `3 ^
p->next=head;4 ` |8 j! K) K) u5 _0 M
head=p;
* ~3 k4 Q* c; s9 X7 I6 u: k, M for(i=2;i<=M;i++)- i( I' Y$ E8 |6 U1 Z/ C1 N
{ s=(MONKEY *)malloc(sizeof(MONKEY));
. U: f6 C$ Y) i& q6 p s->number=i;s->flag=1;1 o/ `& d p& C/ x# u
s->next=head;1 w- Z6 H' B8 e/ ~# `
p->next=s;p=p->next;+ q+ S7 {$ L! H' W7 }6 }. T
}+ W" H0 y7 h; f+ p j
p=head;
0 C: r% u" p/ u" N- d for(;;)9 Q _& m% e2 E: }% F" }
{if(p->flag==1)8 N# w/ }$ D$ w: O1 z, v
count++;
! d+ n# h0 P1 A9 Y7 r if(count==N)
2 @% |# c1 K- _$ j {p->flag=0;
; s0 {/ u2 |# N! l count=0;* P/ }" Y( H& q0 j5 C' L
sum++;}* F8 @) g! }& j8 b. @" d/ T7 m6 ^
if(sum==M-1)6 b; N) r) ]4 T7 J9 S
break; Z1 e3 z5 X! K( D$ o% |
p=p->next;
6 |4 x- S4 c' X0 \- w, ^ }
0 _5 `6 s/ x9 H$ @# U, w p=
- m+ Z9 r8 J8 ?4 W head;
1 q& d' K7 ~* h& t, J9 o for(i=1;i<=M;i++)4 N i. h, M3 z% U8 d
{ if(p->flag==1)
' k' [& a& _5 u7 V; p printf("\t%d",p->number);. _3 X% N4 S# f! [8 E+ `2 F
p=p->next;
. v# p. d6 e# M4 j }0 Q P% k! z+ D u, U
- A6 _) ?% v0 u9 W
5 T: ]" \. v. h' p. t1 t/ C! F0 _+ \$ V$ z1 H
} 3 w, t" o3 K6 m6 N6 T0 x
第二种方法:数组& N% r4 @# Z% Q* y( [1 O
#include<stdio.h>
z/ i/ h! |3 D#define M 8% f/ A& a- k/ a) L
struct monkey3 G# g6 y: O+ |
{int number;! I; n0 K7 n0 L+ A! w# p* A
int nextp;. [2 P" h% r% [2 x. O; d/ d- p! x
}link[M+1];
; ~( s* ]2 w6 [1 ?2 t
- d, S, z% ?, p$ M( J; X8 F& Tvoid main()" U* e# i, i- ^
{int i,count,h;
! h) d# J6 T4 ]- H& O8 J7 K' a) f$ _for(i=1;i<=M;i++)8 I& v# @( \' `/ t
{ if(i==M)) U. i0 ~& K/ }
link[i].nextp=1;
- g9 \- j& Y' P/ r# s; n4 ]; p else5 g6 W+ O( V j4 w8 L3 e7 r- b
link[i].nextp=i+1;
4 ]4 f5 g8 ?/ r8 g2 m, J" U link[i].number=i;2 [9 I9 |& ]( N+ C7 ]3 h8 t
}
% i! P4 o( o. s- Eprintf("\n");
7 z: }6 ]3 P6 M4 ~: z6 }count=0;% [* `% t6 B. ~* X- C3 E
h=M;3 A W0 l$ w9 C9 K/ Q
printf("依次退出的猴子: \n");
' T) ]- A4 P3 G" ^& Ywhile(count<M-1)
( n0 C7 t1 \) G, z8 x' f; d1 V{i=0;! _# a* |1 p- M; w9 y: E9 O( w5 C
while(i!=3)0 A. A+ ]0 F+ n! `7 i, p r
{ h=link[h].nextp;: {/ p( d( y' k& ] B$ s9 Q) \
if(link[h].number)2 _* f+ c5 r: U; E3 w9 ]
i++;}
& S- q' } n F. s, v+ W. n+ T/ u6 U
printf("%4d",link[h].number); q6 y! x, v5 F5 i9 x' S: H) T$ N
link[h].number=0;
0 ~* @/ f+ z8 _6 i# i/ P( L: Y% n+ d8 bcount++;" O! B9 [" G7 }% b
}
. q2 U6 u! [' k* B9 ]: x' x0 ^! {( s2 W! p4 j0 c9 R3 Y' ]( p
printf("\n大王是:");" Z7 h) o7 r4 k) J$ E; R
for(i=1;i<=M;i++)6 R5 K6 ]+ e M: m
if(link[i].number)
8 g6 J7 ^: K3 |- e printf("%3d\n",link[i].number);
7 x& ?! O4 `7 c6 i, l6 [
B) w' l$ x8 j: h }! J. G; J+ ~$ F5 P7 I9 ]
} $ V. }) e) P# R: t
第三种是普通方法for循环# Y6 F" @. U; m0 E( i
#include<stdio.h>
$ D |# j9 b; ~7 P% N8 vvoid main()& f4 A; B8 F {% Y @- s* @
{ int i,k,m,n,num[50],q,*p;( O9 j/ a. _9 u+ {% z# u
clrscr();- N: y- q- r* U( S
printf("input number of person: n=");3 }/ L b( ^, b; f
scanf("%d",&n);
5 g* _5 a/ ^; F; Fprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只: C; q' P c" h+ W! G' o/ s
scanf("%d",&q);' A! C4 Q0 f. @* @4 J6 `
p=num;
3 r- L0 l1 B/ Q for(i=0;i<n;i++)
' C: q: r% M+ S1 H *(p+i)=i+1;2 Q* `& M+ ~$ B: \& L. x- M- n4 Z
i=0;
8 D( U3 B7 V/ K9 }' a# F5 w1 p7 z k=0;
& N7 r$ g; C# O, V. c5 I m=0;
7 w# k0 e1 O4 \* L# Q; u3 x while(m<n-1)
; }1 X* M; F) t2 J! R {if(*(p+i)!=0) k++;0 r+ y, |1 e! z$ Z0 z+ n" O u
if(k==q)% A% p& n. J9 D- \$ Q+ s
{ *(p+i)=0;9 o9 r3 W, d; B8 z6 h
k=0;
: I$ Q8 g6 M; A/ ~ m++;
$ H9 J& S/ b& f3 F }5 x2 o, Q8 d- Z; t, n
i++;8 b! h0 ^* H6 A& T+ U+ L
if(i==n)i=0;
9 |$ c& |# T) M }
! X; Q3 a3 U% i4 C, U6 ]" v while(*p==0)p++;
U$ s) _$ b" z' ] e- m2 z+ Z; \ printf("The last one is NO:%d\n",*p);
3 ]' n; H/ C; G getch();. u: X n6 u( @/ c+ ~
! Q# i' }$ l. l8 _! f
} |
|