|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
$ L) u# h/ A; x n0 \% y这几天我在忙着编一个问题,我用了一种方法编出来!
" m/ ?$ E# ~+ Z/ G但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!) ^2 i. ^! v/ d. L
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
" P7 `, [( E1 \& I
. d' B5 r- w7 ?$ d+ ?- G: T
. |, U- \: R) }' x 题目
. e; x5 S7 I ]1 X" ~) X" s, o山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
. D( I% E1 |$ R0 Y* L第一种方法:利用循环链表
. r. s$ b( h: ~# E! k' ~- }, B#include<stdio.h>
/ z! n/ D/ E& d5 X& x5 u3 g" a#include<malloc.h>
& D" `( R G2 Y, u" M: ~8 c#define M 8 //共有8只猴子
3 \7 W6 |; a B0 X8 L#define N 3 //数到3只时退出第三只. y( K# B# k% d1 V
typedef struct monkey/ O3 _1 c$ }7 x" X: z8 R+ {
{int number;
9 n# r. c5 d+ V! ~* {1 B0 |int flag; d; A5 v( O0 c
struct monkey* next;2 u' K0 T. D# l/ H/ F4 a
}MONKEY;
5 Y# L4 x& b) }: k: a9 |. J N. |+ emain()
; ~4 b1 v2 w1 N( V; g8 P1 p" j{ MONKEY *head=NULL,*p,*s;
& K2 U k! E- _$ D4 B0 {( d& } int i,sum=0,count=0;% g3 g5 r9 T- G! U& V
clrscr(); //清屏9 J1 y6 A. e, e3 h2 j& E( Q6 D# p
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
. u/ ?& H, n, K) h& s1 `: ^0 j p->number=1;p->flag=1;, [3 t o: K5 w7 F3 b( D& B4 O% I' b
p->next=head;
6 w* c4 Z& g/ d. V, }) Q head=p;
) t4 N5 p8 ], z* h+ @, r9 X7 W for(i=2;i<=M;i++)
9 R- B1 F% q$ [7 c { s=(MONKEY *)malloc(sizeof(MONKEY));# Z+ S6 {- _ X. p* m/ d0 T
s->number=i;s->flag=1;
1 F5 ]$ g g1 A& u: k* w# T s->next=head;8 O# }9 M- U& C0 e% C) b
p->next=s;p=p->next;
# \2 j% d! }; ?! W; d }
0 ^( w) l; V3 Z) p# Y: V" f0 H0 K p=head;
4 i3 H% T0 E* q1 o% } for(;;)
9 F6 ?7 a D! _; q+ Q X- w) l {if(p->flag==1) ?/ V9 S: _! {" [" k5 Q: \
count++;
5 ?9 i+ [1 I) \ if(count==N); E% y9 Q w# _8 g
{p->flag=0;
/ v E+ j. P, {/ b! i# K; ^ count=0;
3 R& }7 X* ?0 V# `( { sum++;}
) r9 s! q, r( M4 C2 O' ` if(sum==M-1)4 @5 k. Z: a; f& L
break;! K9 H: i2 O1 Q& C& l8 t
p=p->next;
5 D6 U' i" ^& @" c% s }
' i; K5 [, [3 G0 ]- n6 c. I p=$ P" z0 h5 A' c7 p
head;! ^$ `5 T& G6 T" K3 O; q
for(i=1;i<=M;i++)
& [3 l: t7 c3 c5 Z { if(p->flag==1)4 X& L2 Z/ C& F' ~
printf("\t%d",p->number); j8 @$ h1 q' q2 L0 N+ \
p=p->next;
7 `: h! p' l9 h k M }. }+ k2 r7 |1 T6 y0 Z' h
. z+ Z2 e: H- z6 q
/ V _: ~6 J* N5 x' m/ T
. S) F. d4 ~. X0 |}
' @4 T" n& Z( e2 t( G第二种方法:数组
; N8 y1 h6 d& T+ |1 g3 q, m7 c7 \#include<stdio.h>5 `- v: s5 q2 ~2 z6 k' ^
#define M 8
: W+ y! z9 S7 m3 A' pstruct monkey
$ v) A6 d: r" e8 O. w{int number;
1 G- A9 q7 s& k! s5 L$ p Sint nextp;1 N8 m5 ?. L) Z- F8 g9 X! i* F
}link[M+1];: N( J1 f( {+ D# F% r* O
' I2 F9 H9 Z& o; t* B
void main()
. G# x* }5 a* V: _: D+ D{int i,count,h;$ B7 Y5 J [9 w# t. {5 t6 k
for(i=1;i<=M;i++)) _# _: }7 Z3 l; ]5 n# _' I0 O
{ if(i==M)4 k1 G( @, Y" L1 @4 A
link[i].nextp=1;
: `$ O; \& o+ w" p+ n& m. p% ^3 p else
6 }/ _! G/ t) ^6 J, Q link[i].nextp=i+1; ^4 T' r8 o- U
link[i].number=i;$ z! [; u( ^7 ~, }7 r5 L
}% P5 B* ~3 C, H
printf("\n");3 b4 O& t1 b& G$ J2 k+ A1 O. o) N2 h
count=0;0 i7 R2 D8 b- `7 n& L1 N. Y
h=M;
. ~/ Z0 }- H! X+ w2 }printf("依次退出的猴子: \n");
, |* U$ n, T4 R4 W+ W" m/ jwhile(count<M-1)* r& X% B( ~% ?5 {
{i=0;
( B( y- C; L( F# v. `# V1 {6 vwhile(i!=3)$ m k# i% w+ D/ v
{ h=link[h].nextp;7 h' C* R6 K. o* u
if(link[h].number)& C) T, h$ X8 O( E8 a8 _: }9 {
i++;}& I* M" P( y x: a5 j% \" A1 _
2 w! V. P+ E8 rprintf("%4d",link[h].number);
/ ], S6 l8 a/ K9 X% glink[h].number=0;
. }: ^) K5 V4 l4 d( P/ g2 fcount++;8 c* B* M% ~! b) d7 D# {) @3 H4 l$ m
}4 M" K( M$ o$ _6 A! p
( ?! E. S: `- F8 ]6 T9 \: Y- C1 R
printf("\n大王是:");, X, h) k, s: O: d1 v5 S) i
for(i=1;i<=M;i++)
2 P5 D; u7 C1 A# W, f if(link[i].number)
4 ~0 p# M1 v% X5 K& p' \ printf("%3d\n",link[i].number);
* Z8 z5 X: {" l$ F, M% T. C: O( Y: N
9 I% L6 C' S4 K3 ]' k) R
} * F% C- _3 v) Q
第三种是普通方法for循环 m: v- V6 i9 E- e) I7 s% M+ l
#include<stdio.h>
& @+ o" L! s# u. G' E* G8 w3 ?void main()
5 t6 A7 i5 y# d% q0 p{ int i,k,m,n,num[50],q,*p;
# j1 ^% X/ o$ j1 C- m) Q6 [ clrscr();9 n: ~' ]: t: G, W( v8 Z
printf("input number of person: n=");
, Q+ f3 y) M' C: E# r \ scanf("%d",&n);$ ?1 [( d( k4 S) @' i4 f
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
' G) v) t& }/ ]9 ] scanf("%d",&q);- _+ z1 L& S" f4 ?. W- ` J9 n
p=num; ?# c0 M- M" \ m- [
for(i=0;i<n;i++)3 Q6 Y1 U$ s) D7 p f; Y
*(p+i)=i+1;
. W- U7 i* U4 {4 g6 J, f i=0;
) @: N+ `8 z* m3 c5 I7 { k=0;
2 d2 u* D/ a( t m=0;( Y* w# K U& x0 p; i" e2 i
while(m<n-1)
$ ], |& R8 }0 N8 F4 T {if(*(p+i)!=0) k++;0 r9 y" J3 b7 S/ L `6 ~
if(k==q)
# C ~' s: G: B { *(p+i)=0;
7 ] C% r: U) ~2 _+ e k=0;
$ v7 {) t/ V* _- y9 [ m++;# z) M1 f7 D U8 T7 y
}
5 S" o3 L, b$ {: l+ w) g W* N# ~ i++;
l# A6 _$ u: x& q3 C if(i==n)i=0;) m& |! w6 b* d- y) z4 W# K
}; o& M6 H; \2 d! M) z8 {
while(*p==0)p++;
9 F9 p/ d( w3 P0 f, u3 u* H printf("The last one is NO:%d\n",*p);
- Z9 P3 B9 b, v9 u* Y; E getch();
% \( O2 s/ R( q# _. ]# a; b Z$ I1 R0 ^! F
} |
|