|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!8 F2 t6 G- }2 A0 W& j
这几天我在忙着编一个问题,我用了一种方法编出来!
5 k" E5 B5 g5 ^0 x, t: v但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!8 I. p0 I5 i2 O0 _3 ~0 v# o, Q$ c
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 . T' V( W% Z: h, E
" y+ t! U# g: f7 E5 y
* k! ~) d. D, J9 } 题目
4 T) B. P# Q$ @0 U3 y {山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
+ H- L4 R# `! _5 s第一种方法:利用循环链表) L) Z: W2 {, M& e' n+ W7 X7 A
#include<stdio.h>5 S& D4 d' [1 z" [7 L; i! Z
#include<malloc.h>
9 H# b* @$ M c \# M: K#define M 8 //共有8只猴子* n- t) K ^5 o# ?- _5 v
#define N 3 //数到3只时退出第三只
+ _- u b& J0 d! a% g) Vtypedef struct monkey9 H0 l1 }0 V& ]# a
{int number;9 u" Q. m' i& u) u d* {3 y
int flag;
+ r# K' F ]) Y' ?6 jstruct monkey* next;6 E/ C' p9 u+ K
}MONKEY;5 h! J! g+ L! t: ]7 x& f
main()6 h1 O" Y4 B- ]6 k0 u; P3 k% ?( Y9 l
{ MONKEY *head=NULL,*p,*s;& O# y2 @7 W* O3 u
int i,sum=0,count=0;
0 G+ ]* `0 @* m" m& q clrscr(); //清屏% z, M, Q2 `& I' t8 |
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存1 |3 h; C# E# L: H/ p7 }0 I
p->number=1;p->flag=1;
, T* i8 j: p% N$ l1 d8 \ p->next=head;0 j4 ~3 v; ~1 Y
head=p;2 X% g" [, d1 E* N# ^$ X+ A
for(i=2;i<=M;i++)
. {+ S) u9 E* f& J/ ^) }9 ^ { s=(MONKEY *)malloc(sizeof(MONKEY));6 _& Q% @/ A3 @, a# v, x
s->number=i;s->flag=1;
, n8 ~8 q" M) O s->next=head;0 M6 F+ o h: s+ I5 H1 m+ Y
p->next=s;p=p->next;+ S7 v9 @% ^% c/ s: z$ G
}5 H. [ N( y3 ^% B+ `
p=head;* B5 W, k/ G) ]/ ^( v( F2 O0 e
for(;;)
# s9 g0 f/ u3 p7 c; B" k {if(p->flag==1)
* g! ^1 z' x# l% } count++;
% r" }; A4 o3 E7 w- K if(count==N)& D* Z! r5 O& X" r, T7 q- x7 k
{p->flag=0;
' h: B- M. u" | count=0;
( e1 q/ Y, r ]; l0 M [! Q sum++;}8 N" f* M. N5 I- ?: h+ t& ^
if(sum==M-1)( \& a3 P# O5 Z6 ]+ C1 l" l% [
break;
$ E4 S) ~ j) k6 r5 S p=p->next;
% a2 S" [5 l$ j Y }; c3 x1 M2 m% F! d3 J
p=; y* |+ ^7 z7 `
head;1 h7 R3 o- U% f {8 F; T! g
for(i=1;i<=M;i++)1 E# R/ O0 K" Q! n
{ if(p->flag==1)
2 S8 i7 w/ t1 U# F printf("\t%d",p->number);
, l2 G# q: w t0 }' `$ [5 Q$ M p=p->next;
6 ^& g e& W" K7 C0 i2 C: H0 [0 d ? }
0 o1 `$ Q2 }; w: h; m, J1 v9 L4 q2 j- `! z. p2 e% s; i9 B" C3 v
, w' U& a, B- t% k; i0 K7 n" E
5 c0 ~: a3 I9 T Q1 H* \
}
. w' E, C; D( ]: M第二种方法:数组% _9 d. {+ {; T
#include<stdio.h>
1 ] P; Z5 y# o5 c#define M 8
" N! v0 k7 W) r) H% j* q6 ~5 r) rstruct monkey
* k5 i: W) D7 H# {{int number;0 R1 i+ t/ ?: {2 ` ~
int nextp;
; X( K7 T, G( Q7 k) }- e}link[M+1];
5 z6 m5 N0 a* Y! m* z) R* F
; u2 t- F6 U1 y# u N6 A6 svoid main()3 w9 j) i+ T3 V( _+ ^' e
{int i,count,h;
u3 T9 C$ P) z6 d: |+ I) C; Z: sfor(i=1;i<=M;i++)( U+ l9 B) D" l+ d; G4 P2 U3 l# h- d
{ if(i==M)
' T. z3 i9 E- s, x | link[i].nextp=1;
7 F- |" R! t ` else
: ]2 y- R+ A5 V# t }7 i0 x link[i].nextp=i+1;8 ~% Y) a8 I; }7 W* {5 A H
link[i].number=i;- a1 c' O2 G( K
}
! z1 I: i9 T4 q# D! g, p% c- X; Wprintf("\n");
8 R) [5 L* x$ e! v- Q/ jcount=0;
1 M$ r5 J7 k; R6 T1 {$ O/ [h=M;
$ K# ~& C: v, S# `+ n0 zprintf("依次退出的猴子: \n");
2 k2 J2 A1 }3 ^: N& F: ?while(count<M-1)' d5 v2 J% V/ V) a) F
{i=0;1 R9 Y* e m" \6 U; F w- u6 c& m
while(i!=3)
- k4 p( }/ g! w3 K) ]/ y{ h=link[h].nextp;2 ~" v# r) Q- c! Q
if(link[h].number)
% T6 h8 u- q/ I: h. @/ Z i++;}
) |7 q9 V& L% g6 Q4 U+ C
- Y: u$ X, C6 E& I9 D y9 e+ eprintf("%4d",link[h].number);
3 F9 a* y" N! k5 P( s3 n4 W* Slink[h].number=0;
$ z: m# O, {) }5 i4 d! l& T- Vcount++;, ^. L5 p2 w. J, K
}% L+ u9 R u7 c! {" o. s7 W) m# e
! L2 I' e9 N/ W% ~, |# wprintf("\n大王是:");: I# y `: T) V/ A
for(i=1;i<=M;i++)
# J! ]- t3 w5 ^5 v3 B" L if(link[i].number)5 A4 R$ p4 V# ~( N3 U. H& h: U
printf("%3d\n",link[i].number);1 P; Y! y8 f, [% C
3 }6 i: _" z* |' M6 J
( k, H* x2 u' j- o, B O
} ; @% d4 W) c: z% Y! f+ `2 X8 x
第三种是普通方法for循环
4 O3 X" d# K0 x, ^: M$ D#include<stdio.h>) I% M' j# z/ R: t. h$ D9 ?
void main()3 o. Q) s: C( U4 t' c" M
{ int i,k,m,n,num[50],q,*p;6 a# A+ @1 j- P7 Z# \( i
clrscr();
9 Q4 g5 E" G; u% m( n: P& p printf("input number of person: n="); w- `9 @% G9 T) F# c& y
scanf("%d",&n);3 s8 p7 z% g( k! W( ?) U# a K
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只9 k3 g; P& q+ J# u( c
scanf("%d",&q);
+ }8 c' Z' Q: `( D1 G0 V4 b p=num;
2 Y4 u# v3 m ?! H3 Z' [& x, U8 f- n" J for(i=0;i<n;i++)
; y& z+ n; c9 p; E0 M+ e5 I *(p+i)=i+1;
% ]$ b% Q/ F5 _5 D i=0;
9 {6 l( d, G! P! A( b6 v k=0;; \# D# \- W% B L& j: v2 W0 W6 I
m=0;7 H: J4 I/ M1 a# U
while(m<n-1)
9 G) h/ D( j4 F h1 f& M+ _6 [- D+ X {if(*(p+i)!=0) k++;$ A: z& z+ O: X+ h3 X3 n
if(k==q)
0 K+ ?7 V3 V/ n { *(p+i)=0;
- N( u0 x5 r+ j* r4 m k=0;$ p' Y- k2 S8 c
m++;/ |' S0 M; u8 P7 W3 U0 A0 y
}
5 q6 W2 B; W, P i++;
% ~* M6 a2 e) V$ v( g; w7 d2 O if(i==n)i=0;
( W7 g- m0 L6 j" T% B" n3 m }* l% R' Q& Q7 V+ Z, r
while(*p==0)p++;
: M& ~3 A5 Q/ c& p+ e+ Q. u/ H printf("The last one is NO:%d\n",*p);* i- C: I: T% n- `( F0 O& H
getch();
. \/ f5 m5 p( T5 K6 G$ B D8 C. H$ v' T& }4 `# b
} |
|