|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
' ?9 ^3 G0 r$ j/ c- M) ~0 D3 e这几天我在忙着编一个问题,我用了一种方法编出来!9 w' p5 R- O @ ?3 q
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!0 c% c# e6 p. x' P" l1 F
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 4 c1 Y. p F. |6 k5 G
9 d/ X" ^6 K# \
7 q" T6 H% S l( u 题目
9 I- C. G- y9 g, L山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
& T( I0 @9 W t+ Q第一种方法:利用循环链表) u7 L7 r8 T o, S" `- h5 q
#include<stdio.h>0 f* ]8 }. ~8 }5 Y# h
#include<malloc.h>
' `/ H- c2 G( @0 n- k#define M 8 //共有8只猴子. D$ Q; P# c) I8 K9 q. m
#define N 3 //数到3只时退出第三只
, }! ^6 q" T+ ]; p4 ?1 d; G; qtypedef struct monkey
f, s! V- I: o3 N3 V1 a3 j{int number;
! i' Q! u6 T3 q: iint flag;: c, g, C. {# @* w! d2 T
struct monkey* next;2 s' @' Q' z( _* L6 S5 s
}MONKEY;' r. V$ e% `, k! b
main() ^" K: e3 ^3 E
{ MONKEY *head=NULL,*p,*s;* m. p1 w9 ^+ H. e
int i,sum=0,count=0;1 F+ Z( F7 g& B( v3 ?
clrscr(); //清屏
) {" L1 I6 a" C$ \ o# R& N; ?- Y p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
% J( \; @9 u e, k/ D0 F) m4 x- R p->number=1;p->flag=1;: W! o* r8 T2 L- C. M& z
p->next=head;, L# Y- ]# q4 j* G
head=p;1 R- G0 }. K5 {5 r; R& {1 b* o+ W
for(i=2;i<=M;i++)
0 S; ~$ _2 x8 N/ Q) _9 p! X { s=(MONKEY *)malloc(sizeof(MONKEY));" l( Y' A" p6 K I0 S5 t
s->number=i;s->flag=1;
* A2 q s3 M: m( i s->next=head;
# f7 V' r2 @% H! l9 a+ y0 V# i! a8 p6 h p->next=s;p=p->next;0 ^ q) X8 e( X0 z0 p( v
}
% h6 ~, c' m. F. ? p=head;
/ _0 G# W" q0 T3 M5 D for(;;)! B0 n: e* A* G& B+ @# B/ Y5 c
{if(p->flag==1)
8 k9 E" D3 Q3 Z6 I2 c. V count++;
8 X- h. l# c5 P0 Q5 V if(count==N)
7 Z0 N1 J! L; Q& ]7 @7 d {p->flag=0;& z- [3 q2 T7 M
count=0;
, ] j! }9 X# Q, S0 Y& V sum++;}: H9 V: v- X2 u9 K$ Q4 U
if(sum==M-1)
( t1 x, d8 p' ~) ` break;
( v5 O; m% X* q+ O; R6 ^7 j4 L p=p->next;% K5 U$ }+ ?& `5 S1 V# t. n
}/ h, j, |5 ~% a! L) v1 ~) W
p=
" `0 |7 n* }' p7 D6 m5 w head;
0 f, a' P+ G( M2 ]' G& ]" _$ T for(i=1;i<=M;i++); Y6 G# o+ M4 O& z
{ if(p->flag==1)' i; r! j- R, C% @* B0 b3 _3 A. j
printf("\t%d",p->number);9 J8 f+ V/ t5 z/ r5 d
p=p->next;$ k" W% B* o& B6 Z
}! ?5 Q2 D+ a: M5 p
8 u1 z: u0 v# E& v1 M
W3 I% ] k8 G/ q7 T4 w' y; ]4 y& T% e# d7 J, E& W V* a' b
}
6 L2 p5 u; B4 w6 G第二种方法:数组$ l& h& _* Q5 M ]
#include<stdio.h>$ L0 }$ n$ m1 I+ i) h- R. b! U
#define M 8
8 a2 ^6 W( }. D$ C' x" Zstruct monkey
" {6 A2 B' T& X4 z* ?{int number;
* l) b% B, v! Z6 m3 I1 uint nextp;
/ ]8 r4 _2 S3 ]' [1 ]/ [. b}link[M+1];4 H5 p3 U; \0 N/ z5 T( E; t6 Q
% F# O4 s4 H6 Y- p, i O
void main()! I. R2 k3 @$ p4 o
{int i,count,h;
W$ ~4 H- z1 g' xfor(i=1;i<=M;i++)
% w1 N& c+ N" ]8 r) U5 [$ L3 v{ if(i==M)3 n {' ~3 }# F: _' ]6 E! x+ ]
link[i].nextp=1; x5 @% |( [, ~# P5 n
else
8 q& X5 C% f% K0 x link[i].nextp=i+1;
* M% g0 i& ^) ~ link[i].number=i;# A5 \5 a7 t* x- ~) \, x/ v( ^
}% ~. f; |1 d% \; o2 ?
printf("\n");% ^# h l6 R1 }# e3 `
count=0;
f6 m: A' g+ Qh=M;; q" z* ~% b, `! \
printf("依次退出的猴子: \n");
. P+ W6 _" Q- z: o' owhile(count<M-1)6 z S5 L. Q, @3 ]2 B8 ?# _
{i=0;3 {: j4 {& N! \- q
while(i!=3). Z+ M- l. U$ J; P0 s$ Q$ Y
{ h=link[h].nextp;
( o v& A7 K5 U9 N* w+ a7 @ if(link[h].number)
9 d# D: m7 p' @: {$ j2 ` i++;}
! o+ J1 ^9 A6 D8 m- e/ u, |/ E# l, g: N& }4 y, q* F
printf("%4d",link[h].number);
0 j: q+ D5 a, m. L" M& J* d6 o8 B/ _link[h].number=0;: J5 `% F+ h" u
count++;" }# Y: `6 G6 i4 e6 U, C% e2 e. W
}3 J0 S- Q( [, `7 w2 k# ^
5 F! \8 ?) } Q9 D! s$ lprintf("\n大王是:");
+ ^# W9 K s9 {; w X A0 z" w for(i=1;i<=M;i++)$ R2 f5 ~: n' J+ D
if(link[i].number)
' F7 c, @6 V0 p! M printf("%3d\n",link[i].number);
7 B4 ^: C7 I' J6 X; ?+ x: ], G% i7 r" h6 d% f1 Z
, v, T& D1 x2 @6 O3 `: D2 b}
( B4 f" p7 M, X) M9 M: D6 L! I第三种是普通方法for循环' i+ L( l! n/ P0 {; G
#include<stdio.h>6 @/ d0 C9 r. \* k1 ~8 v1 X0 F
void main()$ l# M+ o) s7 s" b* m9 L7 o8 D9 {" A
{ int i,k,m,n,num[50],q,*p;5 d' {5 N4 O. q% F8 ~- k
clrscr();% T* A) M, J# Y% ~7 i5 u7 v7 }* K
printf("input number of person: n=");) D5 i @# ]' a* G1 w
scanf("%d",&n);6 m, {& g# N' L& Z. f0 s& B
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只% l% h% n. @; ^0 P1 f! o0 K$ P, j
scanf("%d",&q);7 n N" m8 N2 }/ n
p=num;
s7 N3 X& L& o- U+ i- |% d for(i=0;i<n;i++)
% `& C0 t" C5 V- ]" e6 r *(p+i)=i+1;
: k) i, ~4 t: K+ p# [ W. O i=0;4 K% N5 F8 K- r7 R0 K+ J- _! Z( S
k=0;& h- B$ ~1 A, B/ A0 \2 m
m=0;
$ E# N+ S1 j) l6 n& K while(m<n-1). Z2 f9 o9 R7 |& R' t, ^. w6 l9 n
{if(*(p+i)!=0) k++;) \: V, V3 u Y! l; i1 l$ \0 S
if(k==q)
/ s# Y q. q g { *(p+i)=0;2 L; y; |% H" @! N0 O0 d' M
k=0;
+ G) `: a$ f# F7 {$ c; @' c. y m++;
. K) h; n8 T3 [$ B Y }
4 y2 l; o/ s/ [) ~; ` i++;7 M: B$ U4 ~2 j. K3 w" K
if(i==n)i=0;& R8 x3 K' c) c8 v6 Q8 y
}" J& m0 E, z: k0 y8 T( l
while(*p==0)p++;
; Q9 [4 `% f) D }' y: `& q printf("The last one is NO:%d\n",*p);
3 W6 G9 U% z% G, g( D, h5 L! S getch();( g% \9 G: o! L0 T$ P
/ O: Y6 f# n* T, H% ^% n4 K} |
|