|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
0 N2 e9 F' s' C9 W& k* N: d这几天我在忙着编一个问题,我用了一种方法编出来!
# _2 K' |3 r0 Y W8 n/ B( x但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!7 F/ T: ?/ ?: g! L: j" g: X7 n( ?
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 / h6 w# b( ^$ U- M; t6 K
0 ? I# o' u1 J1 l# E2 W' R8 Q- `2 A ]3 y& [ c- y2 T. ?
题目" D+ M. \9 V9 J" P+ n' V
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。7 d# {+ ?+ y# o' K1 S" U L
第一种方法:利用循环链表
( L. c9 L9 e7 y; F#include<stdio.h>
( {$ ~- T& U$ n#include<malloc.h>
& p. X5 m1 S1 P#define M 8 //共有8只猴子* T, i4 q5 ^1 l l3 H
#define N 3 //数到3只时退出第三只
1 ?0 l- e i. R$ D* b1 u* m% Vtypedef struct monkey* J {# _+ \1 P% Y
{int number;
$ V7 X3 v- y, W) h- k+ J+ Qint flag;7 _, I6 f% ^. J
struct monkey* next;/ q! O1 W a" R1 u
}MONKEY;
+ b6 n, S P3 U* B0 t9 o- Emain()
& E) z- u5 [5 S5 H{ MONKEY *head=NULL,*p,*s;+ G7 u5 B- O9 h( O# |
int i,sum=0,count=0; n8 K* W, R' Q+ U" Q
clrscr(); //清屏* D8 H6 s1 b! n7 |
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存, o1 q6 R- o1 i$ I6 [7 r! a' o
p->number=1;p->flag=1;
9 W% f" x5 S0 m$ D p->next=head;: _: X5 P. m4 C' Z* v1 }
head=p;; w1 p4 \& P8 W; }/ v9 c! A
for(i=2;i<=M;i++)
& \' |, ?) `! J+ h! l { s=(MONKEY *)malloc(sizeof(MONKEY));9 `0 H& S ~2 Z9 a5 L+ t! s) _5 R
s->number=i;s->flag=1;0 W7 N3 S* Z2 A9 Z2 O
s->next=head;
! Z+ N" i% h, [ E; M( B0 E p->next=s;p=p->next;, k" E8 C6 \2 |1 F0 j6 Z
}9 y! E% C: b# ~( [: W! P9 F
p=head;$ R" X7 {- Z0 `& W: t
for(;;)" ]! n" \$ c" |) v+ _4 P$ v, k4 O
{if(p->flag==1)
" z: Q6 K. \1 [ count++;
' |( m7 _" Y; H if(count==N)
7 H4 |" Q% d" Q2 D {p->flag=0;
* R; C* ]2 z5 {) I/ m# K2 ? count=0;$ }; N& \! M: {* r. I f
sum++;}1 L- t' M! a* |0 P" Z' ]+ t9 H
if(sum==M-1)
: Y5 K ?' D$ V break;3 A9 V( c7 x* X
p=p->next;
8 D, X2 @ Q/ E+ S! e% ^3 k4 _ }
( B3 V* ?" L7 M p=: N+ T$ u, d) p! F- n R% [
head;
8 x1 M( ^* i+ h! D for(i=1;i<=M;i++)3 B- ^5 I& ?8 j' X, n
{ if(p->flag==1)2 Z( U* D% o. L
printf("\t%d",p->number);
* t6 {9 n/ G* r1 P7 n p=p->next;' z. t* z( Y% N
}
& }: Q9 d( d' y1 f0 I; I
E" g. h" a9 z% o" x: l7 [3 m& g, e" o
4 ^; ~# _; B7 |; g1 w" A+ H} 0 W" G* {5 h5 L' _/ r* W
第二种方法:数组
7 Q. z1 \ n0 n1 [#include<stdio.h>" @& ~8 Y, H j0 R% h1 ^
#define M 8
5 R3 U3 q7 k9 Ostruct monkey
* t) s3 p, z2 K* \{int number;0 w z1 P' @( J, i9 \' F+ q1 W+ b; i
int nextp;
/ ?" N Z; a0 @/ b}link[M+1];
) |" B7 b) i9 z2 [: N4 y% {; U) z. r& G0 ~0 K9 N8 C0 d
void main()
% v3 ?: T5 X9 k7 F{int i,count,h;! x3 H7 r0 U k u& X
for(i=1;i<=M;i++)1 y9 Q% n6 y! F/ Q
{ if(i==M)
: u! k1 f: u/ f. d! b2 g link[i].nextp=1;
, t- C. Y. J" {' q2 n- T- F else4 h* [& }- U* C% S1 J' Y" ?: K
link[i].nextp=i+1;
6 M2 e/ q) W5 s+ n- p* H link[i].number=i;# q1 M7 \' B- r2 {: {0 R7 P
}* |4 ^6 U' j# ^$ F k. c$ P u, [4 J
printf("\n");
6 S. j# P: \2 fcount=0;
/ c0 A2 r0 ?1 h1 J- m1 S# [h=M;
0 W" r/ H, @( zprintf("依次退出的猴子: \n");: V9 ~, A! e& v1 H
while(count<M-1)
0 u4 d/ c3 T! u{i=0;/ q9 v: w+ a& }, t; R$ O
while(i!=3)( T+ Q% ?1 a7 y1 y3 z5 e
{ h=link[h].nextp;
- n6 f, c" ?" g1 [, @ if(link[h].number)5 @3 n! Z% W( b4 E, x
i++;}, ]$ R8 r& e, W* U! z; j* N8 f
8 A7 k' r: f5 a/ S Rprintf("%4d",link[h].number);1 @$ g* n: A5 z9 H& y
link[h].number=0;
5 N) ?/ x8 M7 d& Icount++;2 p7 p: `* [, J, x7 W C- h
}
/ P2 |" x4 z6 i8 I8 E4 q1 @ }
/ Z' e+ C# f" b1 X0 x- B5 Q: uprintf("\n大王是:");
~; R2 M0 e0 F1 k0 ? for(i=1;i<=M;i++)
& O/ h9 P4 S2 ] k1 V, @3 m if(link[i].number)
+ d" t( R" r: l' v, F6 d printf("%3d\n",link[i].number);
: e3 a# `8 u. t/ H3 k
" F a: C! Z0 y. W6 m% \
# a Q8 U% r* [: x" Q" \3 `) q}
, P- {* t1 H* s9 x- o$ ]第三种是普通方法for循环% B& e' t4 F" j5 D0 B) k: h
#include<stdio.h>
; i- K! x3 k5 {4 mvoid main()
( y0 c" d+ ~; M, x9 [ V{ int i,k,m,n,num[50],q,*p;* c) p- {$ r6 u Q. Q6 B- p
clrscr(); _& ^2 f) y% U; H3 `4 q j5 d
printf("input number of person: n=");
4 N4 E/ h6 _% M1 i scanf("%d",&n);
: C4 T( e" w2 T7 w( \$ g# Jprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只+ ]0 Q% R5 e+ o% ]1 d
scanf("%d",&q);8 |* ?& I: F2 f+ j! _
p=num;6 p* p+ d" V; ~( Z0 A% g: l
for(i=0;i<n;i++)% |5 \( Y0 F) A
*(p+i)=i+1;/ e' i' E% f$ H' N" z b
i=0;% T! K0 b% h4 f3 s5 X
k=0;
) N+ _! n/ F: h4 ~6 p& D2 _' r1 | m=0;
/ p) d9 N2 Q% l, p2 [5 M0 I2 A while(m<n-1) U; g H3 N0 N! ^: c( k
{if(*(p+i)!=0) k++;4 N2 f* a0 n/ i. T
if(k==q)
" L" s. I' l( ~: G) | { *(p+i)=0;+ T6 q1 F) j# V3 ~. X5 H
k=0;
$ z4 L$ B8 H7 c, U) V m++;- [8 E3 `/ ?% _6 j6 N+ T
}& ^8 d) E/ D! _/ m1 V
i++;8 n# h) v2 S" y* ^+ A4 `
if(i==n)i=0;: l F) N. [; I2 q" ~/ _
}( C, K; {- D: J4 K. D9 Q5 N/ d- v
while(*p==0)p++;
$ G* j9 P* D& b( q printf("The last one is NO:%d\n",*p);
) D% I8 ~6 ^1 N getch();
$ ~) q& k, D' f! [ T$ ~
1 |/ O3 H& J( |, j8 P} |
|