|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
3 O' H7 Q- \6 v+ |6 R3 ?* O8 X: }; Z这几天我在忙着编一个问题,我用了一种方法编出来!$ n' F2 d; g' ^
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!- I: I" K. g# D% P6 @
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 3 L- {4 C. O' q8 l0 Q! t* y
8 \' V3 u( u: O& _* B- F8 }
! o( }9 G g( }# `4 w& E) }
题目' B t! G& I3 B8 s2 `
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
) u" w* X. r+ \1 T& z# @第一种方法:利用循环链表+ l9 W1 E3 K! J' x" R2 L* X0 j
#include<stdio.h>
, y: ? _, b0 F. t' a5 o3 S: F#include<malloc.h>) e$ M( Q- D4 p: r
#define M 8 //共有8只猴子
5 a! J+ L" b8 G/ l#define N 3 //数到3只时退出第三只; ]; ?* Q B/ i# ?1 U6 R
typedef struct monkey B# M& I8 p9 b5 Q4 U# n
{int number;1 M8 G$ X; [1 v5 a6 Q3 q9 d( F
int flag;% N# {, e6 n4 j* \8 H
struct monkey* next;
; { U# }2 C, ?2 B% E4 }! `. I}MONKEY;1 f# {4 d$ ?+ l1 o/ i: k
main()9 f4 P+ C6 e1 R, Q) G5 B
{ MONKEY *head=NULL,*p,*s;5 W! @' G# ?6 {# F& Q
int i,sum=0,count=0;
8 k1 D5 N/ L: D) {4 b% \# I clrscr(); //清屏$ t8 P8 r+ B/ K. w
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
1 k1 D s7 N* z: k- [ p->number=1;p->flag=1;
; k4 Q2 Y( W+ p, {: w p->next=head;
# ?- P5 Z7 R5 t; x+ M1 R) o Q, B' X head=p;
# ~* x! ~& s- { for(i=2;i<=M;i++)- n2 c- ~3 _7 J U6 T8 j, j+ _0 c
{ s=(MONKEY *)malloc(sizeof(MONKEY));; n9 y6 f9 s$ n6 o6 [, `5 E
s->number=i;s->flag=1;
) J8 q5 K( h) N+ J s->next=head;
7 G/ ], R, P: s: s7 W p->next=s;p=p->next; @! n1 c0 O/ }& L: i: ?* N, W5 ]
}
& W4 c. \2 r, v+ p; [' ?' d% p p=head;- S. d2 \( W% P1 X) d
for(;;)
: ]: d" C" y6 {+ Q4 b {if(p->flag==1)% m; l& N9 `0 Z
count++;6 z2 l& N& Q6 f
if(count==N)
+ h; m, M; r) @* c$ H) B {p->flag=0;
5 S* M3 |* C$ q# ^- a count=0;
* i; @( m' R. W: L# s; B sum++;}
5 X7 Y) H3 I, I1 B; A: |, v if(sum==M-1)1 C7 F; p8 [1 [7 E: \
break;
0 [( c4 N% b3 h `6 ]& h+ F, `) q1 S p=p->next;' j8 v7 g5 @- z" ^, m
}
$ L$ L* q( T# J$ j- G$ h p=6 d$ H2 P* A* X, y' u
head;
+ _ n' @( e# q7 \. @7 C for(i=1;i<=M;i++)% O- s3 c7 V4 F& }1 \& p
{ if(p->flag==1)0 n% D" A; P6 [% c5 c& F0 a
printf("\t%d",p->number);& n% [0 e9 p- Z8 C; ~
p=p->next;
. f/ L M+ Y- C+ k! e: M# R }
3 v [, `) a, H3 ^% s
# g# {, _- t4 N1 `( }$ E
& A' @) q+ w0 _% t, k4 `; }: r. p6 h0 q& M
} ; ?0 c" P0 s$ M# T1 }6 H. Q. B, Z6 s
第二种方法:数组
3 ]1 m! ?7 V% k- [% V- m#include<stdio.h>
, @: L2 ^; u+ b/ ?# z4 X/ h#define M 8
0 u& L( p W- {- g5 c* g" z8 t9 _struct monkey
4 C2 d: z" ^$ L- m3 l{int number;; s ^& Z' L' t* N" i
int nextp;
/ p& D& U4 ^* @# q* z1 B: }}link[M+1];+ v4 j4 |2 [+ J) d8 o1 i
% w: H2 |3 h- j' R$ F' A* mvoid main()
2 a/ ^! H8 M( F: g8 s* ~& y{int i,count,h;
) H; B$ c, T) k D9 S* Nfor(i=1;i<=M;i++)/ p9 d2 ~. Z0 ^9 P$ e" [
{ if(i==M)
) Z5 K {3 o8 ^, `; x/ q link[i].nextp=1;9 [3 b- Z, @' @; l# I! t# {
else
& r) S! _& Y K- M$ s Y+ \8 z link[i].nextp=i+1;
7 l% L5 }3 d% ~% b link[i].number=i;
1 m2 R6 C2 U3 a}! \7 g8 Y3 n* ]1 c/ L5 l1 f1 t# Z$ `
printf("\n");- N- {* P: T) p3 q; ?9 g7 L9 J5 ]
count=0;
/ c( p; w/ p. h' Z, [h=M;
& M4 e3 p0 }5 c, qprintf("依次退出的猴子: \n");
5 k1 l! w8 q5 Q/ {+ f) e. a8 Wwhile(count<M-1)
- Y9 b2 w2 ?$ Q) ]( I2 T3 O{i=0;
" u8 g: O" R' c! D" x/ qwhile(i!=3)0 [1 D/ V" b9 C" `( L
{ h=link[h].nextp;5 X( L, a* I& ?$ I* I! g
if(link[h].number)2 X- W3 m0 W4 x B' {4 g8 @
i++;}
6 P6 F8 }; ^. c% J( x& J0 o4 z( } ? j- g. r2 X6 r+ [
printf("%4d",link[h].number);7 ~( h: P. \ O9 W4 r+ E, S2 B; Q; J
link[h].number=0;) F+ r) j7 c: p8 k, H9 D
count++;
+ k& Z3 V& m# l8 j8 m( w( N3 T}
% L3 s6 E1 e; h- W7 F( j' S
6 {/ K# ]' F* L/ z5 D- ]printf("\n大王是:");
; i$ q! P. P1 V2 x. i+ _ for(i=1;i<=M;i++)2 b4 J& Q* z' L* `
if(link[i].number)! G: ~* @- A% V) `5 Y+ o% P
printf("%3d\n",link[i].number);
& {, I( w7 e- D1 g5 K
9 q' z i* `9 Q4 j! V, }% Q" Q9 x$ Q: {3 z
}
* V! h* } a+ w \第三种是普通方法for循环; ?# I: q R$ I K/ t m
#include<stdio.h>
) E* V. q) ]! k6 Rvoid main()
* _6 C' W$ f% S: x% B# u' I{ int i,k,m,n,num[50],q,*p;& y5 q; @! i) }, h' O8 _0 j8 y' {
clrscr();: ?2 f* l+ U5 j
printf("input number of person: n=");
* s$ M4 H; N8 z0 ^ scanf("%d",&n);0 a. G- ~6 c' C
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
) }# Q" Q8 a* i6 C/ i6 d( m scanf("%d",&q);9 q) B. H! |; i7 C3 r& m
p=num;
( Y3 S6 |5 s! ]% J! e9 l for(i=0;i<n;i++)& H! a- k! P- J0 S6 m
*(p+i)=i+1;5 Z1 [! L J& c
i=0;
- A; P2 v) }8 {' ?7 ]+ u8 L k=0;
1 z5 S5 n9 @/ ]# u; E2 q m=0;
) n1 E% o; W- B- O& i5 X while(m<n-1)5 A" s& U8 g% V% l h$ l; ]+ R% {
{if(*(p+i)!=0) k++;
8 ^' a# H# W& n8 ^) X if(k==q)5 Q( D( L" C1 n; v, {9 \2 }
{ *(p+i)=0;4 \, ~: ^8 v2 ]
k=0;
5 d' Q# [8 w/ ~ m++;$ ]3 e, v2 e& k, F# N3 X
}
9 r$ @1 Q; Z" N2 v i++;- A: {' o1 Z: N. c
if(i==n)i=0;; ?4 [# n5 K- u0 ?
}( X' W& M; H9 M& a' x: z3 ~' S- s
while(*p==0)p++;
) b. ?+ P: e6 S0 I% q printf("The last one is NO:%d\n",*p);# l" v! M2 W- U
getch();7 j, \* \+ A, N" m
, ?8 K# X) B5 n. a} |
|