|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!$ @* `. i6 ], z" m
这几天我在忙着编一个问题,我用了一种方法编出来!
' @$ y0 z$ X$ y! U但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!1 Q9 I, n/ q. c
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
7 t4 [6 u4 k w* `1 U! Q, ?5 Z
' ?4 ^/ k" w l1 W9 T9 k6 I* t- |; }- R! g- H0 U
题目
) {" m2 N) d2 D; g. S* x山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。" g3 b: i: O3 b
第一种方法:利用循环链表* Y+ Y. M2 q8 g3 l8 N
#include<stdio.h>4 z6 B+ i9 ^. ~7 e1 \
#include<malloc.h>
2 A! v0 y% ~; m( }& o, w#define M 8 //共有8只猴子- `0 y% V1 e2 I' G7 ^. G
#define N 3 //数到3只时退出第三只
! r9 k" q: x' r5 ^1 T) K# Ftypedef struct monkey
: Z" H q, n% |% r. ?{int number;
, H& a T+ P/ ?int flag;4 }/ O% k! Y: J, f
struct monkey* next;0 O& L2 Z! F) ^/ M
}MONKEY;
, ^. m+ {: |1 p+ ^, Z Qmain()' s2 K: R( z6 g1 D1 |! @
{ MONKEY *head=NULL,*p,*s;
6 C* F; D( X% C0 w+ Q4 v) r1 f int i,sum=0,count=0;
/ [5 f. }. q# t; A% Q( }5 L clrscr(); //清屏
L& K( d. r& e( ?7 a- x8 U p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存6 v6 s, T/ D- n& w* z2 w
p->number=1;p->flag=1;+ ^& o Z- z, @
p->next=head;
2 J$ P% f$ N$ d( I, I3 d* V& ?8 y) ] head=p;% j. n) y! V. e& Z: _
for(i=2;i<=M;i++)
# y, T7 n5 Z; A% h { s=(MONKEY *)malloc(sizeof(MONKEY));
9 R. O" g5 g( \ s->number=i;s->flag=1;0 ?* r5 P6 u- ^& n
s->next=head;# F5 j9 m( P1 K! R: o
p->next=s;p=p->next;
5 e& M G- n/ Q, U+ H$ H }
6 A2 w$ [9 [% |$ v7 T p=head;
- [1 O4 v8 d/ L1 J! p for(;;)
5 t/ e; ^) o: C( G7 w {if(p->flag==1)4 S1 s9 Z% U$ v ^3 j
count++;- D! m* v( H% _) d
if(count==N)
* j/ D5 o9 W% F+ f% m* t; \ {p->flag=0;
3 j' ?( F9 Q! A3 A. o. p3 ^' i$ y count=0;
8 g' w% u+ _2 ~- f& L# {1 F# D+ v sum++;}6 M( O# C' K* G+ N7 o; ?7 J H7 U3 H, l
if(sum==M-1)2 A0 N& V* b/ Z/ P. I1 x# L) \" E
break;
) G' |& Y3 {4 F; I p=p->next;
+ x$ y2 q$ Y ]. k }1 }5 B, F1 a9 t4 t
p=* t! s' q7 N) g8 [8 H+ O+ n0 O
head;
5 t, H7 |, ?$ t% q- {8 H# g for(i=1;i<=M;i++)
/ {# f I# w3 _3 I { if(p->flag==1)
9 c+ L5 w9 C& K% Z printf("\t%d",p->number); ?' e i0 S, t$ q
p=p->next;% G4 y+ ]4 q: S& Z+ a8 \7 E6 H- m" i
}3 N6 z! f2 S: Z8 z x
% z" z0 z/ v8 b6 i
" t8 u+ ]% W: @% e/ |7 Q
5 D# I O' G3 G3 j5 J) I0 J0 n}
& i* i v1 B V9 [ L$ b, J# F第二种方法:数组( g; w/ _1 k' D% Y. Y8 D
#include<stdio.h>0 {7 U( R6 [' q7 |
#define M 8
( c3 U% E9 n6 x/ _struct monkey
- S- J8 }% B" i0 s, j) o{int number;3 v; J/ j* `% O* d- L
int nextp;
/ o3 F, T- p3 f# I+ C; C}link[M+1];& D! A0 E9 k7 U# `9 o+ ?) P- [, s
1 d. n0 @! Y9 Y- ~! vvoid main()
* C1 R& Q# A6 c2 A{int i,count,h;
$ h" \- \9 W' }6 n' a1 Jfor(i=1;i<=M;i++)
* j; `. _* O, i+ n0 u{ if(i==M)
! D. E+ ?* a; ]& U link[i].nextp=1;7 {. }1 e9 v; y
else
$ y' T" S. t/ V- Q- f9 \1 \$ Z& f1 I9 O link[i].nextp=i+1;2 u" v8 I# B! A
link[i].number=i;
; f$ E: G4 g$ e/ {}
$ ~* n" j6 D& p6 T- }printf("\n");+ J/ O# L) A0 V3 r
count=0;2 ?3 U' }& ?1 y2 Z7 ?! r
h=M;' q7 E) Q7 z5 X1 D! k
printf("依次退出的猴子: \n");
% c4 e5 u, X1 s3 Hwhile(count<M-1)
' r7 d B: |* C/ M6 o3 W, r{i=0;2 q; {5 {) n- v8 [, H# U
while(i!=3)* z, w/ s" d" r! q4 r" T: Q+ i/ s
{ h=link[h].nextp;
) L# c! e& L5 Y. ~) V2 g# @ if(link[h].number)
/ B$ [+ ^* p9 n4 j! W7 R' H i++;}# i- Q4 T: N* }! H8 P
/ ^! j+ a! B- c% e$ _
printf("%4d",link[h].number);
7 a- E0 @" A3 r$ p; Ylink[h].number=0;
( l! }8 k+ W6 l" ]+ Ycount++;
1 ?6 l" q& T* u5 a! [: g3 P6 k}, t2 I2 B/ s7 q
& _* _) Z* o m D7 F5 hprintf("\n大王是:");
$ @1 M* e1 x0 }/ I, p for(i=1;i<=M;i++)
7 O; x. m! j/ g$ c3 v% Y if(link[i].number)& z# ~1 S2 i) j0 R
printf("%3d\n",link[i].number);, {: M# {1 Q5 B C4 ~ m' f% l: Z
* B. [8 T9 J" y9 u* p. }6 X/ A+ x5 A
* j! J& H" G+ ]3 g
} g5 Q4 H4 T8 b- z4 L9 x7 O$ ?
第三种是普通方法for循环: q' \3 F+ m ?, }0 f0 @- K8 z
#include<stdio.h>
: C& @3 A2 q0 I" ^/ Kvoid main()
1 b: A$ Y; G# g M. `; {{ int i,k,m,n,num[50],q,*p;
4 @4 {% a, U6 M clrscr();
0 a% ]: ~& C1 L/ U7 l9 G5 }0 b" y7 W- @ printf("input number of person: n=");$ a- N- b9 D) L5 t- w
scanf("%d",&n);
* }2 Z' k+ |& e! H" g5 T: }* _printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只5 Y4 X" C" \* [: l
scanf("%d",&q);. R+ V$ R# n8 Y5 O$ k0 P' [" J* g
p=num;
2 `% n1 j8 I, Y( p& U for(i=0;i<n;i++)( U# Z% E# ]% V, `8 |
*(p+i)=i+1;. a$ ^# A2 c4 D/ C
i=0;4 o# Z) y$ }1 G/ Q
k=0;
, v2 M$ x( l2 n. c8 k# I: o: e m=0;9 T8 T, X, d( C
while(m<n-1)
+ L( L1 G% E5 f4 C {if(*(p+i)!=0) k++;
4 i. C% c( ~$ \5 F: Z) J if(k==q)
`1 X7 S" `# Y3 C$ a/ y7 y { *(p+i)=0;
7 F4 S6 a- |& v7 e! w9 V' ] k=0;
" v( {( D& U; v3 z m++;/ I% F. S6 ~3 O; ^/ m1 e$ M) A
}
3 e" ?! {3 Q! r) W7 w i++;
0 L0 R$ ^- [" c2 Q: O if(i==n)i=0;8 |7 }. M3 s, B7 K/ z) M5 B
}5 v, X) P0 \1 N! R$ w7 Y) r! |
while(*p==0)p++;
' U& M. l8 I9 T+ e+ O$ q N printf("The last one is NO:%d\n",*p);6 ^3 e7 z' t0 F: ?2 m" d- P6 }
getch();
4 L* K1 I2 q$ O7 U. X+ h6 F. ] s; H
} |
|