|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!3 w# ]$ C6 R8 ]2 o: A
这几天我在忙着编一个问题,我用了一种方法编出来!+ i4 d- {& i( |9 R4 T1 Y8 d7 U
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!9 P0 {0 |- ]7 k, T( D
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
9 d' I, b) q0 L5 ?! }5 N4 U$ m+ K2 e1 y! c, ~
) d \1 c" N: n3 Q0 Z6 i7 _) q
题目
+ T2 ^/ @2 |6 z4 O$ u# o山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。+ b; | _& { T
第一种方法:利用循环链表
+ ^4 W8 v6 k, T/ A2 |: ^# Y#include<stdio.h>
; _" R3 U l$ b; i% u#include<malloc.h>& ?. V! z i" i) Z
#define M 8 //共有8只猴子! D2 S$ T* w6 _* L3 I2 I7 E
#define N 3 //数到3只时退出第三只2 b% W6 C0 X$ b5 V" z* ? v) F$ B
typedef struct monkey
3 A9 {" |/ F0 i$ V- v! N{int number;9 E0 |2 K& ~% v. o% v
int flag;. b) L" ^. }( u1 x) ~6 o5 K
struct monkey* next;
- |2 k& P( s1 I# I& \+ p& p' v}MONKEY;- K3 n# e$ h& J6 P0 [
main()
3 T1 I0 [3 U# a, o; @+ _! K{ MONKEY *head=NULL,*p,*s;
( _+ [, I3 \+ c3 c/ q/ J5 {4 O, F int i,sum=0,count=0;3 b, \" C, [2 s) u9 @4 k+ ^% b
clrscr(); //清屏- g9 c& J3 o4 V: ]$ `+ @
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存: U1 W: f* J9 U# H- U) @3 T
p->number=1;p->flag=1;
5 ]: }, O! b2 q% d+ _ p->next=head;
: g3 S6 e7 h/ S' d# s' h, b head=p; t' f8 v1 b) ^7 F& |
for(i=2;i<=M;i++)
# n2 P9 m4 r1 v6 H { s=(MONKEY *)malloc(sizeof(MONKEY));/ ?3 S, T. ^& o* h
s->number=i;s->flag=1;
9 D, t: F2 ^! n1 B s->next=head;
. i8 F, w, x7 X p->next=s;p=p->next;
: U* R, G4 T* x# T1 ^9 q }% l+ I' t2 w D' L0 \( o( L
p=head;
, `7 s8 l& K& f: z' Z* R for(;;)" Q0 m% W& U) `5 v( ]: w# e
{if(p->flag==1)
8 e- E. [+ n) b# @- U8 b% M+ G& } count++;, D9 h8 p" C- B5 A& J( R2 a6 x
if(count==N)! X, r, X( _' D9 r: F* t
{p->flag=0;+ F" i4 L4 K+ ~" p0 L, j
count=0;
8 `$ E, n" l% [- S2 { sum++;}
% v+ _! ?& P9 s7 r; x9 K7 ` if(sum==M-1)
2 ~1 }5 L S/ u6 m break;: j. H1 Z9 z {1 ^( N( M5 x# U3 [
p=p->next;4 b2 e) }, Q& z5 W( E
}
6 g; j+ g" D' h( { p=% b N$ A/ j4 j v
head;$ U& \0 I- q6 K0 s/ b
for(i=1;i<=M;i++): E( ~+ d1 w7 \
{ if(p->flag==1)
. G) _6 \- b$ O: R( ~ printf("\t%d",p->number);
% c+ j& `, z; S1 W0 A7 U ~ A p=p->next;
$ C v6 ~, D, r) a% G! x, X }. ?4 Q: F: s8 u |' h6 h
; }/ T2 z6 N, @7 a$ Y) V( q
, a% d3 D! G0 C+ M5 H7 V$ v1 j6 I/ l0 k1 n- ?
} ; R& @" e W2 M4 m" b k/ V: d
第二种方法:数组! L! X; A, m# {7 ]+ Q
#include<stdio.h>7 k4 _% \7 h t1 T2 S7 Q( d2 s
#define M 8
& p! w3 Q" n! P' Fstruct monkey
2 T/ M. G2 `9 c1 P+ O. R' S{int number;
/ I2 p' u8 _* r$ [6 `9 Iint nextp;
5 S! J5 V5 m5 U f* i}link[M+1];* T( j! w: C4 \; j$ f
! O7 j0 W4 N" b' a% I/ vvoid main()0 ]; E1 e# Q( f7 H
{int i,count,h;
& z* |' }5 s- cfor(i=1;i<=M;i++)
$ x2 a9 D L. U# t# z* D{ if(i==M)* d" f( t/ l) `! _
link[i].nextp=1;7 \0 K* y1 n" e+ A& N* z/ d4 d; ?
else" h& d0 }8 Q4 W; n. Y4 k# A
link[i].nextp=i+1;; W0 E9 {+ Q( Q- S* h" h$ ~/ p0 ]
link[i].number=i;: }% k6 P+ M) H
}
8 ?4 X& ]5 E: f6 ]' |+ ~printf("\n");
3 ~) e4 C2 S& S# x' t9 Vcount=0;
- |% w" V8 Q* e0 c) n, Lh=M;
+ i$ N6 w2 T$ f( e! kprintf("依次退出的猴子: \n"); x8 ?6 c% N, K; N9 @& U
while(count<M-1)- M/ J6 G, r% M0 O0 U& A; d8 ?# F
{i=0;( t' T0 G5 f- k0 P- A* v
while(i!=3)
d0 @7 ?5 U! p( f+ x9 m9 o{ h=link[h].nextp;
, d2 u+ r# N3 I: Q if(link[h].number)$ t+ ]" k/ Z0 Q8 \$ r G
i++;}! l5 B( w" Y1 i; W5 s, Q
9 o9 n+ G( j9 u7 O E6 Z
printf("%4d",link[h].number);
; K# \: u5 s$ X6 v, slink[h].number=0;
8 H& s0 f# R6 U M$ D" l5 T- lcount++;! f! h7 ?* x0 ?7 ~" O' c- Y
}
: |0 O+ d3 ^: P
$ _* B/ X0 k; f! W* A* f gprintf("\n大王是:");( \3 x: y( p5 a% t; o% q7 K
for(i=1;i<=M;i++)! f6 Y0 w. g Q* \, V) c
if(link[i].number)- B5 v9 B0 y5 g0 ^" g( o5 E) s
printf("%3d\n",link[i].number);
`: L2 }; |! M7 Y6 B0 A# M8 A' f6 b- |5 [8 v. f. m. N& v0 w
) P* n# N/ R/ N' s0 m
}
- N/ S( a# |, o6 z! A; T* G第三种是普通方法for循环
- i3 R; C4 p6 ?7 |% Q#include<stdio.h>6 ?$ L2 G( m, ^2 ^, W
void main()
( x- G9 U! m. |+ {7 I{ int i,k,m,n,num[50],q,*p;
# x& X5 c, N" k# ?6 p clrscr();
+ @ _7 P0 n$ Y) X9 a printf("input number of person: n=");( J O, A/ I& \( t5 R& N) L3 d
scanf("%d",&n);4 A8 q- ]. i( B# z9 G
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
5 m+ n+ S) f9 I4 Q1 x, M scanf("%d",&q);
0 `0 |7 f9 G& l* ~; D+ X p=num;0 H+ ^" [$ W+ T: O; s. s, o4 n
for(i=0;i<n;i++)2 m, a/ w8 Q* ?# V
*(p+i)=i+1;+ r8 [2 `7 Y/ k, P- p
i=0;
, `6 Y0 e+ P& x, q9 A x2 Z k=0;' Y7 w7 M' m" X: V
m=0; C1 }- v" H3 a* a" p, B2 D! z
while(m<n-1)
: E& L& O8 j* F+ _ {if(*(p+i)!=0) k++;$ p0 U3 ]0 L8 [" d% o
if(k==q)% x0 t) n$ [5 o, H7 E
{ *(p+i)=0;
% W; }. w2 Q, Q5 q& H k=0;
$ L( L/ N: F/ b% c1 C5 r' w; Y m++;
* z( `! S" G" g( h9 H9 v( b }
6 c6 ^& i- C/ }) F/ s: z2 P i++;
" w( B/ `. ?& A* a& l if(i==n)i=0;5 u! T$ o* L' T E) E3 m
}
& S! \8 C* a: h, Y: q while(*p==0)p++;% ]* d# O) I' h W/ n7 U5 P
printf("The last one is NO:%d\n",*p);- y9 f! Z5 A K5 y$ ~
getch();
# ?5 ^* Q* M1 T/ S: M' B% X3 @
7 D( v ?: t2 r/ \- g} |
|