|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
$ V. R8 V* [$ ~1 q4 X* g6 p! Q这几天我在忙着编一个问题,我用了一种方法编出来!9 }( G4 X6 R: E' {! S
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!5 ? T' r/ x* U8 ]. z7 D0 V* P. L
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ' n6 ~1 x) B/ F; L7 A1 p. f
* k5 |/ {% T9 e" r/ Y* j: k
& ]5 X" L+ I; n3 G; ?
题目
1 r [% ?6 r0 E3 }/ V山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。- A2 @: P, D1 ^2 c2 v
第一种方法:利用循环链表( L0 n. B& n8 B( X: ?: \
#include<stdio.h>" x0 x& h$ q1 o. J" T" j% K
#include<malloc.h>( l3 d! z+ ~8 Q% V* Z' t0 z
#define M 8 //共有8只猴子3 v5 H, Q0 a' k6 O
#define N 3 //数到3只时退出第三只1 Q* w5 o$ p) k3 L4 H7 j' F
typedef struct monkey
: ?% q8 \/ O4 g4 h1 c{int number;* F. h. g! B1 n
int flag;1 t4 g: E+ M6 ~1 ]2 b
struct monkey* next;
. ~3 M* R7 ^" B2 l}MONKEY;! f# g- C; g( E4 u, k
main()
5 C- O: ^$ j; e5 Q+ ^/ F2 }+ f& r{ MONKEY *head=NULL,*p,*s;$ J' W- _3 {( J% R; F; ~2 P& E
int i,sum=0,count=0;( n. h! e% b U0 J* A4 b" s
clrscr(); //清屏2 c" S J3 N1 ]$ l) n# n2 @1 C
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
+ K! e! V5 E1 f/ z4 l! m p->number=1;p->flag=1;/ N( E: }" M1 F2 ]7 b/ N
p->next=head;
/ l8 `% V7 y( u2 i( f head=p;# ^+ q, R" G+ z4 j- M3 S
for(i=2;i<=M;i++)2 v+ f1 @$ Q7 z5 g
{ s=(MONKEY *)malloc(sizeof(MONKEY));& x+ @' }. v7 o# [
s->number=i;s->flag=1;
2 f2 e' k1 B6 U) g2 T s->next=head;
: y! a/ s$ U% U. y% r p->next=s;p=p->next;
8 T& O; ?% u, ]9 Y: S0 F0 x }$ A* q2 u8 X5 X
p=head;4 A$ E9 e$ F/ m/ E5 {
for(;;)
6 J+ ^' o e2 C# N1 ^* H( p {if(p->flag==1)+ ?% R4 h! U! E2 T! M
count++;
1 R' M. G& `. f4 F4 \7 L6 u if(count==N)
. H: q: ] e* e; ` {p->flag=0;0 b$ V G: V+ ~/ L9 d5 @# _# W
count=0;' G3 n M# @) l+ O& z( N" Z: g
sum++;}- j6 m- N# c/ ]/ O% T, u5 y+ X
if(sum==M-1), w6 q- [2 v* Y$ A. `: A/ f
break;
D% k' Z/ L( i; T" j9 g3 ?+ E p=p->next;5 v/ F7 d/ \/ q
}
9 A7 q) q, `" q& i( D1 _' m p=
4 h* |2 Y8 Z$ a! W& k% [ head;
% k+ d/ s3 y& v _% l S& W for(i=1;i<=M;i++)
8 P4 r) F6 d! f { if(p->flag==1)
0 G- p2 G9 M* y6 d8 Q% o& _ printf("\t%d",p->number);
% Y/ g/ Q2 J0 m) o8 p. V, z p=p->next;% t+ E; H& I$ \0 M6 N i- w
}
& v# L A3 o! P' g0 Z8 T8 d" h$ A8 ?: _: ?$ ]) q* a4 T# c
/ ^5 T1 ]3 |; @
8 r! I* A( N0 u5 Q8 z# s}
j6 ^! X* j$ @/ S; g$ h6 ?, P第二种方法:数组* u6 e$ }3 ]5 }# d; O, \, Q
#include<stdio.h>% M. B+ h7 r" i! Q# U
#define M 8$ s2 f, A2 x7 j" Q3 \) g i/ B
struct monkey
A: i& [: H$ Q0 Z1 y{int number;
7 P' b: L2 H$ j5 E1 Pint nextp;# Y0 C. K3 \4 d7 k' g$ j4 t
}link[M+1];1 q! ~8 P! k1 ~* Q4 U" I0 f+ ]
: j6 K8 n5 O7 [7 O: ]! }void main()+ W+ p( N. v0 ?$ u# F7 s& i
{int i,count,h;: y0 I' |# i7 [& M7 Y
for(i=1;i<=M;i++)+ e% Q) K, z1 H( t
{ if(i==M)
. A. y7 m' G+ J" Q l# p' r, P; \ link[i].nextp=1;$ L+ q2 D) u) z3 L% ~4 o7 j: E
else
/ z' V5 j* y# R2 X+ k* u& } link[i].nextp=i+1;
# e. g: b3 C' p link[i].number=i;) ^4 Q; O, m/ L' {; |4 O
}
. \% H5 `: p8 U1 e) s, B9 iprintf("\n");
' Z4 |. M* I8 Q7 r# dcount=0;3 n! R+ ?, {# @4 ~1 W
h=M;
8 H2 m/ l- y* m( M' Oprintf("依次退出的猴子: \n");
% N0 T" z! N7 j9 Nwhile(count<M-1)
( ?6 y) g0 V, G+ p. z! I' ?3 x{i=0;
7 c, ]$ a7 M! ?! zwhile(i!=3)3 S- l' O3 A2 |6 M0 U
{ h=link[h].nextp;* D: O+ L( A+ L- `, f7 f
if(link[h].number)& P9 h; z+ k0 N" I5 ^* K4 y
i++;}0 l) b2 x! j* K2 G( C
; |" }4 y2 |; i( b4 R! K, U- V
printf("%4d",link[h].number);
/ q! y* u& f2 w; olink[h].number=0;
9 E) J, c" n3 wcount++;
8 ]2 H$ m, z3 B) ^5 _. t}& |# E) ]1 g- t2 U/ \5 \
: @8 f6 a0 G0 m$ j" K4 l* P( @printf("\n大王是:");( t: i- G8 x/ f
for(i=1;i<=M;i++)' `/ U+ p2 ~0 o) N2 D8 c+ }5 P
if(link[i].number)
3 t$ k( J" {3 T, I printf("%3d\n",link[i].number);1 T0 w0 f o2 k x
' q7 t9 P5 `+ a7 x7 B0 a% v1 E" r* w4 l. [" b) h1 Z7 g
}
4 D; }2 h0 T3 B% E1 }9 d3 ^- s第三种是普通方法for循环
& B& c* V1 T1 ^0 N$ z- y#include<stdio.h>
1 e+ q6 l7 ]7 H) Q' G4 |) a' X Z2 ^2 @3 evoid main()
7 C' R' _$ w* `) u{ int i,k,m,n,num[50],q,*p;
; {3 i/ b( v& Z# o$ k: q clrscr();
4 }3 H8 O: R% S' d printf("input number of person: n=");# c: W( l# s; M/ X( S+ W7 H* r
scanf("%d",&n);6 ~6 R) l: n. Y Y
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
* [3 \* m* M% y: | scanf("%d",&q);. F% v) m1 F6 i& X3 n
p=num;
$ y h5 d! _8 P. ~# p4 c1 s for(i=0;i<n;i++)& b0 q/ d2 {6 T: e5 ^" h
*(p+i)=i+1;
" n& ], }# g& t0 e/ ]7 k* V4 Z i=0;5 D. o6 [7 W( `4 k- g$ V
k=0;
9 w2 c( f+ e, c4 ~- m m=0;
- n; T7 ]* l$ i; m while(m<n-1)5 j- R* Q6 W4 g. `: N% f; @
{if(*(p+i)!=0) k++;
' x/ t: p$ |6 [ h# {7 T if(k==q)
* U+ P& [. l n+ p { *(p+i)=0;4 F# z$ b1 {0 n: h0 u, R
k=0;4 {4 R7 m: y1 Y) ?5 \- s: @
m++;
- C# X- K0 A3 F2 a0 F {. C5 V }" N! M6 h6 `2 }" P
i++;
$ m( z' o$ \+ Y7 D) j if(i==n)i=0;
% W- _4 A7 i' x9 R# N! e }5 z% U( y9 D- q6 V6 y) F
while(*p==0)p++;, }- Q* M& n; ^+ Q2 v# `' H
printf("The last one is NO:%d\n",*p);
" C- x9 w* V- n! j$ D getch();4 D7 H6 ~% ` @2 `, C! r
0 m) x; }3 Z" |8 y5 J; x' A} |
|