|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好! G$ P# N- ^- l0 A! V0 Z. Y
这几天我在忙着编一个问题,我用了一种方法编出来!, R( S; u0 F8 j) Y
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!9 l. w/ ?$ h! m% f
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 8 Z. Z5 q$ h0 o8 ~9 {6 z
5 A- p* @& r7 r* h: c
4 T% I& J; v. m7 f" U, Y6 C5 N
题目
; f: S3 J9 [- A9 _" ~山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
- c% t) c& S0 P第一种方法:利用循环链表
+ F: ~# s. [: C" w2 j0 s! l) Q8 j#include<stdio.h>
; i! @2 n) R/ [. t/ {" h#include<malloc.h>
$ O! }" b: K. D* g6 w#define M 8 //共有8只猴子
5 t. } |0 A! H& @) g% D6 |#define N 3 //数到3只时退出第三只
7 g6 y( `; b+ i8 E! Ctypedef struct monkey3 Z; y* g. ?: g2 j4 ~. @
{int number;
- Q( W9 T# v4 h1 M5 j- Z$ v' |8 ^int flag;
; s" Y- z, I1 D% U h1 J D P) _struct monkey* next;
! V" D6 g3 i! p/ t& T( }/ z}MONKEY;) H3 n0 _2 x$ d) P( P5 k, J
main()
2 }$ O$ v' T# d2 Q3 f: J+ M+ }( G{ MONKEY *head=NULL,*p,*s;. c2 w: z3 p! |
int i,sum=0,count=0;
+ f: ]( n- ^7 s! w$ F/ O- ~( i. ? clrscr(); //清屏
, @3 }1 R% |9 k% S6 S) Q9 Y# S p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
4 V! ?0 T/ T( z8 A3 { p->number=1;p->flag=1;/ o$ v+ S" e) k! N& u9 i
p->next=head;( u% o! F3 z+ g( R/ B, o F
head=p;
+ n ]$ C2 \2 ^+ ^; M; d* r% S for(i=2;i<=M;i++)" x3 ?' _0 W1 ^5 ~
{ s=(MONKEY *)malloc(sizeof(MONKEY));8 x+ @! @, p& L
s->number=i;s->flag=1;
( T0 Q/ R# J& o" q s->next=head;
' q8 I* V3 |& U: N5 y p->next=s;p=p->next;
4 X0 \' {, }3 Z9 ]7 h. ]8 } z/ u }6 ^6 h! p9 b( l0 i4 [; q/ M# \$ M% R
p=head;3 }' x l; @8 Q: S& j1 C
for(;;)
' q( c( W- ~/ ^+ b& J) v6 { {if(p->flag==1)
/ F4 d8 V! E6 r5 [ count++;# ?3 p$ _7 V% o7 b' M
if(count==N)4 w$ z5 M& `4 T4 ^
{p->flag=0;& G4 i/ e5 i8 A! J1 s
count=0;7 ^$ v' \* t# S v" b3 u$ z% q
sum++;}# k. l. h8 m* K
if(sum==M-1)
- B0 T1 @. P( x" V3 M m9 i( G break;
5 V3 Z' j% y! e& a& t p=p->next;" x, r, ~6 x7 F3 c
}+ ]( R0 e0 V+ G% y% K! U2 R- L8 _
p=- `; W# D0 g( b/ `7 p9 o! h
head;' O* B J, r/ u9 y- j
for(i=1;i<=M;i++)
. Q) b0 Q' h' v/ y6 Y* Z& X" h { if(p->flag==1)
8 T( h+ ] z/ F @6 L$ r9 Z printf("\t%d",p->number);
) W) Q! S' w0 W" U$ Z8 y* r/ _' D p=p->next;2 ?' v) q u# o/ V7 ~4 d
}
9 k+ R% I& n% [$ ]4 B6 h
- {5 R- h" q% \0 ], d" I/ m& g( l' p* [$ _. p4 g
6 h, F, u! w8 C$ M
} : n- U( I/ \/ i3 n+ a
第二种方法:数组
( p8 ~' [9 N9 T0 C. o#include<stdio.h>: p: z% h" }" U( h0 c J
#define M 8# q y. f; v9 y, t3 e( Y1 j" `
struct monkey
% r3 J8 e# P; b @9 V3 Y: X{int number;
- ]: c: i4 F# ?' M) k1 S- w1 eint nextp;
7 U+ ?8 i" p+ ^( F$ n}link[M+1];
: {2 C9 x6 R& f$ F; A7 @/ C% B7 y- Z8 |4 Y8 ~: z; J
void main()
6 a# M" u' L& x{int i,count,h;, o' T5 D- _0 ]2 @& V4 Y$ t5 G
for(i=1;i<=M;i++)
% V% f/ u( f G{ if(i==M)
1 R- s& Z& Z3 U3 f link[i].nextp=1;2 T" Y: x! B5 r1 g
else4 J) Q1 Q* D& ~- x5 R, |
link[i].nextp=i+1;" O4 _1 Z, Q* a4 A1 G3 G
link[i].number=i;
) S2 t; ?% |1 `3 K, b}- _. U% G7 x0 |( H5 Y
printf("\n");8 K' G5 A: j& R1 c
count=0;& ^( S0 z6 c8 N0 M }" m
h=M;
. _3 c+ N# d6 ]2 o3 P: jprintf("依次退出的猴子: \n");6 E: k1 ?5 c! I7 ?% G8 L
while(count<M-1)
% F7 ]* G. J$ A: y{i=0;
. |; ]6 \" {- d5 U# M/ Ewhile(i!=3), [9 k& n/ ]" H \( ~
{ h=link[h].nextp;
9 i5 S" w+ f, Y g if(link[h].number)
1 W& k0 M# u3 Q& g S7 G; ^ i++;}
$ i% w O) b8 T: u# m, L' w7 t1 ^+ M2 ~4 f
printf("%4d",link[h].number);6 D+ y" J K* r2 A6 t
link[h].number=0;( K. W R# l5 D3 w& v' T
count++;
5 I) W1 B! z2 ~0 d( ]3 U$ d1 P+ i5 Q}6 c/ z9 b; L3 S. c. @( I
& w% p1 ^7 c# Y3 f6 V% f1 rprintf("\n大王是:");
+ s5 j' J/ [% k" ^) u- ] for(i=1;i<=M;i++)4 C/ h3 h3 ?$ r" R: L p
if(link[i].number)& J3 s9 W- E$ [! l4 X
printf("%3d\n",link[i].number);5 f+ o, _# M* p
' g0 Q6 c$ L* U$ o1 A
8 `* j8 h, M u7 v$ \
} 3 s" |1 H8 W/ l' \) e, e" j
第三种是普通方法for循环
n2 L: B( |# W1 E6 ~#include<stdio.h>2 m7 X8 a2 Y" q: O' P
void main()
9 K0 l- s( j( p* Z0 }, r{ int i,k,m,n,num[50],q,*p;
4 a8 w! N" w+ s; P0 Q& Z% ~ clrscr();) p( v; c9 t8 r" `
printf("input number of person: n=");
7 ?$ H4 @2 R- N/ f/ G2 U% u scanf("%d",&n);0 x, _. F% I4 C/ L% k" d6 V! G
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
4 M, j% l# G0 W( T, I- o! M scanf("%d",&q);
& K$ x! \, ^4 A5 p# l( ~ s p=num;
$ V# R; K2 S! \+ p( P for(i=0;i<n;i++)
7 Q, ?. q9 `0 T! V; h8 x *(p+i)=i+1;& f Q8 J6 E' \$ c' h
i=0;' ]6 d% H: x& ]9 N* _
k=0;
8 O! B A6 @! h m=0;* Y- ?: R, q' j/ V
while(m<n-1)5 A. l9 n9 {& R9 L* H* s1 u
{if(*(p+i)!=0) k++;
1 }4 S! F; [$ o8 v- X) F if(k==q); k6 a* V* D' n( F. e; L% M
{ *(p+i)=0;& Y( o0 v7 d) c4 ^
k=0;$ @8 L1 V e8 q
m++;
$ F/ o/ D6 z, P$ G2 a u* p# @8 j }
4 U4 v# [( s6 W* }) \" r: b4 W i++;
" u1 q6 O$ y- q" f/ x% B if(i==n)i=0;
~1 z( v% t, X }
* a- ^7 j# g! c while(*p==0)p++;
t" k8 A1 L4 S- c printf("The last one is NO:%d\n",*p);
2 Q3 O4 ?- {8 ?( I6 n getch();0 d. d: F) E% z: a
, F6 I* ~9 f& N! P' P* n) K. F4 G
} |
|