|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
, z1 t# N/ z: N这几天我在忙着编一个问题,我用了一种方法编出来!
9 t$ w' N7 K% P" w但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
2 D5 J, {. l, [6 l5 E V4 ?% a( ^注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 9 |# V: c8 [1 \ z; l5 W8 p+ E* C0 q
; f) X9 _5 w1 C
9 u2 Y& j5 D4 B1 P1 [ 题目
! r6 v$ C- \, c5 ^. W9 X# _* G% o山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。: Z$ T, f8 @$ d3 O( r& @
第一种方法:利用循环链表
* ~' x: D4 f* |2 w; R2 H3 n#include<stdio.h>
, F* a/ W# m: ?#include<malloc.h>" r& N$ P9 F( j9 d% s7 @6 G/ q
#define M 8 //共有8只猴子
% C- k" \' q. P* P5 P#define N 3 //数到3只时退出第三只
/ B" a; s c0 c$ L6 _typedef struct monkey( N% _ Z- K, G0 J, y: G/ _
{int number;( Q# D) t/ P6 a
int flag;. x/ g# D4 C1 O3 I, ~ D! v
struct monkey* next;. e5 W2 S/ b$ X0 e! I
}MONKEY;
4 Y; ^/ ]. Y0 |& O( E/ omain()
3 I0 K1 C% l7 U{ MONKEY *head=NULL,*p,*s;
. I0 S& q4 ~# ?5 k$ l$ I# _) a int i,sum=0,count=0;
) G/ J# W7 u3 T7 @ clrscr(); //清屏
8 g7 F8 `; U( N0 j) i. J! h) P p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存% w4 @# e4 G: |3 p! ^! A2 Q
p->number=1;p->flag=1;
/ ^4 D: p+ t0 W# T7 R: ~( V* h0 } p->next=head;" F) M) _8 z, g3 x* V& a
head=p;
# X& {! C5 p9 J1 \' F T9 X: f for(i=2;i<=M;i++)1 a8 i$ A F, z- d
{ s=(MONKEY *)malloc(sizeof(MONKEY));
r4 s$ `0 b5 Y: M8 { s->number=i;s->flag=1;
' m6 w8 a- ^6 p9 S s->next=head;
$ m$ W3 Q2 \* r# M& T2 G1 | p->next=s;p=p->next;7 ~6 K7 |) H8 ]) ~
}
p3 a7 m8 w& i4 b% g2 w6 |: Y$ l p=head;
5 y2 {8 u% v/ [- P for(;;)8 p, \& U) F! \ F' w g8 }! I
{if(p->flag==1)
& M, I6 y# R, b" l- ~" s8 F1 Y5 f count++;
1 Z+ X3 k a- \& |4 P if(count==N) d6 h; a$ y' ~4 }7 l3 W
{p->flag=0;
, j% _( k& \' \" N0 A# ^! w count=0;3 p6 L( \; F4 \! Y8 g$ ]- [0 ]) ^3 e
sum++;}7 v D; J" M }' d* o( V9 l( `0 s
if(sum==M-1)5 g& A2 t/ ^( i! e( `& X
break;2 I% z, B* r, T& Z7 A; v* z; U
p=p->next;- \. U& A$ Y% z: G
}) a% f) T1 B% J/ w# Q
p=
( f& W# W5 ~% p8 D# d8 z) w head;
' p2 ^/ ~8 X, z for(i=1;i<=M;i++)( }4 g- V1 M. T6 X+ m
{ if(p->flag==1)
, s( ^/ g9 z7 w+ S- ] printf("\t%d",p->number);9 f2 C9 a" V* R7 m0 z. C- K
p=p->next; ~- ~$ ~6 v; A- r9 f
}$ Z0 O x( r: F. k/ {. J
" |" m, B: j8 h+ b6 J9 ?/ X5 H$ A+ i8 v5 s" V
& p, T7 T' A" F t) E# x! [& m
} " F4 s$ B# F" H6 }; |
第二种方法:数组0 @; n& s: Y- y
#include<stdio.h>' R8 v. G! H! T3 B
#define M 89 i- v6 }& @! h8 k% O1 |- K
struct monkey' ^$ d1 s2 f* Q& ^/ D
{int number;
. F% N2 a2 Y: H) ]' p5 _int nextp;, q5 P( G% j- M Y
}link[M+1]; v5 O* a8 T' N) G% j7 ?9 u
1 O, _# {8 ~) H( Q2 H( M- b. e' d# `
void main()1 x7 z! Z1 J2 u O( {$ w# J
{int i,count,h;0 K" Y+ Y2 w3 G8 r
for(i=1;i<=M;i++)/ |! J# f" u1 n$ _" X- n2 S
{ if(i==M)
* C6 p. b" A/ Z( e+ S link[i].nextp=1;7 e9 y. P5 `$ [. a4 }9 Q7 ~
else
, _" A- | p% R. d) B- j1 a link[i].nextp=i+1;
: n- S7 _2 z5 e% h link[i].number=i;
- \, b7 b( Q& h( J}* h3 y) E! k& R8 m6 x
printf("\n");/ S. A1 F& J1 V' b
count=0;
! L, ?9 q! `. _. Q/ i+ d8 k4 Uh=M;7 z I3 ?5 i3 _. {& ?; V$ ]. I
printf("依次退出的猴子: \n");
( Y+ V+ e% x# S& P: Hwhile(count<M-1)
7 Q6 C G6 t& u& L7 f1 o w) z: v0 h9 D{i=0;( n6 m; y9 \% `6 I
while(i!=3)
. U4 E- p4 t% E E% v{ h=link[h].nextp;
8 x+ R1 O! F% V! f; a if(link[h].number)
! o' y2 x. ?$ O; \. h i++;}0 M/ e k: E! {4 x
1 l+ O0 L, _6 }. Nprintf("%4d",link[h].number);
" e9 l4 i+ F/ s* ^link[h].number=0;
! z+ t3 L2 k5 t& i D% wcount++;
: _, M- ]1 a/ H}6 u# i9 H5 O$ a) {
+ m% ]) C5 U& p6 Zprintf("\n大王是:");% E2 w( I3 t) G% K( f% z
for(i=1;i<=M;i++)
* s5 {* S4 n8 S2 J/ P if(link[i].number)5 F9 u& S! L K. f8 X: D( H# E
printf("%3d\n",link[i].number);- P! r- D$ P6 b
% O! S' U7 b7 V1 Z- E7 j5 V% J8 ?0 d" S' T M7 K
}
- `1 e0 \8 }: _第三种是普通方法for循环& s6 f% J% u0 V/ Z
#include<stdio.h>6 Z. X! V7 I6 @0 D! e6 Q7 P3 L
void main()0 W7 B# \4 \+ H j" \: Y
{ int i,k,m,n,num[50],q,*p;. r) C2 Y0 Y; ?: @5 Y
clrscr();" H7 L% h! H; U$ F
printf("input number of person: n=");1 y- k2 N# @3 L+ X% v6 q& h7 L
scanf("%d",&n);3 M6 e) }3 M# V% h# _
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只: j. a) r4 j" I# W* L
scanf("%d",&q);7 ~, W, H- v: U$ N0 r
p=num;9 e K9 H2 V# N) Y1 p3 y
for(i=0;i<n;i++)
( _8 N+ J5 z. C! H7 u0 z7 G *(p+i)=i+1;' i* D8 r8 f# \' X
i=0;: B$ A& e+ P* l3 B$ K4 n6 D
k=0;9 a5 Z3 J/ D* p4 S. r* Y* Y# G/ Y0 L
m=0;
7 M! M6 L( h& b4 O- X% O v while(m<n-1)
2 P1 N: f M& u$ C Z {if(*(p+i)!=0) k++;( x/ R3 G* F3 ^6 n- P
if(k==q); O6 [! V8 q2 P6 @! u8 a# }
{ *(p+i)=0;
0 L6 F8 d$ t9 ^- o* O3 A) Q/ B k=0;
( Z( b* x3 H D, y2 _3 m8 _' c m++;& P& m5 J% I$ v, W2 [
}
0 t" z, U( u4 m) k8 O0 Y i++;
: n7 i5 Q; r! x8 @/ X if(i==n)i=0;
" J' y8 u0 y7 w$ a }
/ M* B/ a+ N, [ P- B3 V% X while(*p==0)p++;
4 _. o [3 m, e0 U1 ~5 S- W printf("The last one is NO:%d\n",*p);
4 X8 D6 d$ x' q$ F- p& O getch();
& e4 E$ Z( I9 t; U7 g: _% L$ L1 z* m6 @- ~: w) q$ f/ h
} |
|