|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
3 D, R4 o. ]7 X' b% ]4 u这几天我在忙着编一个问题,我用了一种方法编出来!; }1 k j. `% p/ [/ D8 G0 G
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!+ t4 S# A* }; r3 y
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 1 |6 U) u8 d6 E# E5 O2 A# a
, p$ I. g c8 q$ j; x, ~/ s
$ a7 k6 m8 m4 c* K3 u
题目/ p) U% \/ }9 \5 ~3 A6 U+ Q
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。8 n! H; g& I# K4 M3 O: E2 e1 t4 ?
第一种方法:利用循环链表! ?0 z: [: I) E7 S& Y: x
#include<stdio.h>
* }8 k, Q5 ?) _# G; m6 L#include<malloc.h>! v8 O) u7 X- t
#define M 8 //共有8只猴子% L# ^4 P( E; [% }" p
#define N 3 //数到3只时退出第三只6 D* F! ?/ C7 r; J, h9 `( M P
typedef struct monkey7 H6 k$ c" K9 |( m6 X$ [) C. K
{int number;1 I# ^2 e2 Y& _1 \. b3 V2 T
int flag;
# ~( P4 l/ g- U& P% hstruct monkey* next;! e: j9 V+ B0 i1 f2 L! F" l1 U
}MONKEY;
; V+ ?/ u3 k6 {# Bmain()
5 Y' ~9 ?: n: B6 h( l# v{ MONKEY *head=NULL,*p,*s;- J: p7 a2 [/ g5 `6 X
int i,sum=0,count=0;* H E# t* E( K' y
clrscr(); //清屏
! E' M; { p# g+ w# A9 Q p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存' I8 T' w D2 Y2 a. ?' S$ @
p->number=1;p->flag=1;
1 o# t3 v7 D8 P5 f7 X, d# s% i, a p->next=head;: x# V& e5 a) h6 m0 P9 d4 w) O1 [9 V
head=p;( l9 _9 I6 y( |- ]1 G7 P+ a: Q! J
for(i=2;i<=M;i++)
( n6 n4 @; d# ]+ |& M { s=(MONKEY *)malloc(sizeof(MONKEY));
9 ^. l2 a l5 D8 ~ s->number=i;s->flag=1;( w5 q) q4 s3 ^
s->next=head;, d) U1 O, T+ ]
p->next=s;p=p->next;5 s+ R/ M- |6 q: E/ @3 ]
}
$ p/ a) M2 T. j1 b r% [6 m; S: m4 c p=head;% Q) A d3 s, j! ]/ @8 F2 x1 K
for(;;)
T. O9 r5 v* ~0 A/ ~% D+ }4 p {if(p->flag==1)
1 {- d" L% [( P: y0 L1 z count++;
8 J `7 h& u# S1 s if(count==N)
: W9 c3 ]# x' h( C9 x+ O1 U {p->flag=0;" ?3 m' u8 Q" w$ k
count=0;
/ N# X- [7 A$ X3 b1 y9 n. \ sum++;}
. N& |( I. e, T2 W if(sum==M-1)* _+ j1 c* A; p& }0 Q; K9 O+ x
break;1 z8 F4 c& s5 H/ H: s3 q2 ?4 a. i3 }
p=p->next;8 `+ y' S8 M8 z
}
; m$ }0 w! n, W: Q! T2 u p=. p4 E# h7 C0 W# h$ i0 o1 J
head;
" l' _1 n5 Y4 `5 f2 E, Y for(i=1;i<=M;i++)
' ^3 b& y) i; C4 D6 t { if(p->flag==1)
1 }4 o6 G1 ^3 l& l( v, c& H8 ? printf("\t%d",p->number);
1 c l2 \! T F2 M, Y! ] R p=p->next;% O0 {7 @' T: w- U2 j1 T
}6 P( s M' x W6 E- W
# G4 k. P" S2 u; O: `0 w0 I
; U( h) z0 z: l# U
9 X* x/ |3 x b* E4 E} : ] l4 s% f1 l$ r
第二种方法:数组
* j) D0 ]* p! U! q) C3 T" t#include<stdio.h>, L- ? _% m) F8 f
#define M 8
& h T; R9 c% s2 f! Ostruct monkey* `! |2 g" s2 t! K9 o
{int number;
3 ]) o5 W9 I( L! u: kint nextp;
. E/ z3 S" j8 O0 ~6 {) d}link[M+1];$ r. G" p( v! ~& P) Z; ?. ~
* O4 M/ h' V1 ?2 W8 s1 M
void main()
) t0 n: f2 p# {. B: O q# Q% b{int i,count,h;
4 n7 D% Y4 m0 O( `for(i=1;i<=M;i++)
2 `+ O/ }5 z* _2 r! K{ if(i==M)
5 P9 @+ ^5 K8 }& s% ] link[i].nextp=1;4 o4 ^4 f- @. e( }: h8 s1 r
else
- g! b. y/ E- u# o link[i].nextp=i+1;( |/ f. I/ a: H# V q" y' w
link[i].number=i;) |5 d4 { e" W# j- c, D& c
}- l. x# l. T% M' g) t7 ]! P) f
printf("\n");
# i4 W1 g9 L; ^count=0;
; O6 s2 { C# z: i1 {h=M;
' }, s( I- t+ Eprintf("依次退出的猴子: \n");
: n# w: k# ]* H. G* f! f; C$ G R. Qwhile(count<M-1)! S) P' H- P2 }! m1 U# g& O. G
{i=0;- N" K+ l, f, q3 K
while(i!=3)* i. D3 M F' d" a6 O
{ h=link[h].nextp;: A4 g/ l7 h& P7 O& e
if(link[h].number)
* ]& \- \8 J; X; q, E i++;}) u6 P! o* ?0 u u" Q) Q
5 I" H* v% S/ q
printf("%4d",link[h].number);
4 g% V5 L4 B3 X# K' k( m4 Blink[h].number=0;
! u+ {) @0 V# t9 d% fcount++;
( T& k- [# _ y @! x3 g2 [+ c}
/ y( G$ J. E0 {: S* J: Z/ U: Q, W+ \+ O- r' q# b# v) _) Z: |
printf("\n大王是:");
/ \: p: n! ^" K) Q; U2 y for(i=1;i<=M;i++)4 C9 `" \2 x1 H- k: u
if(link[i].number)+ j# ?' h5 ^; @2 q
printf("%3d\n",link[i].number);3 H' }1 S# S, p# h0 {
/ _2 e+ ~; R5 r, l6 v' }) w
# b0 ^" H$ i: F: O
}
# ^5 U0 C# a& v! w5 Q. H第三种是普通方法for循环
$ J. p# i1 |6 |1 H7 _7 G* ~/ i#include<stdio.h>
" g' m$ t" I: E& ^" S; lvoid main(). s. m$ d! r& w$ h5 q3 v9 S6 q
{ int i,k,m,n,num[50],q,*p;6 V, G) {: L e# G3 p
clrscr();* m, P' e) t, z1 ~9 ^
printf("input number of person: n=");0 f' u0 D: u' S- ?
scanf("%d",&n);
0 K5 s e7 m+ i6 k- X; O' Rprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
2 q5 f/ K$ x: M1 X1 K scanf("%d",&q);
4 c* N' ~7 _, v8 z. s p=num;
# h- P6 W! o( j' ^ for(i=0;i<n;i++)
9 q! x( v/ K' y: a! q2 b8 D h *(p+i)=i+1;1 Q) D- D" a* o8 [' w+ p, U
i=0;* ~6 h8 O' {: B& f7 o) T" `" N# @9 ?
k=0;
& F3 V9 u- ` x7 _; M% @+ n m=0;
; g) M; j# Z* D" {2 Z6 q& C( c0 T while(m<n-1)
( I- Y( R. m% D9 V2 c' z {if(*(p+i)!=0) k++;
0 q8 \5 L. b5 \0 h- A0 A if(k==q) d: a1 ]$ ^1 f$ Q- l
{ *(p+i)=0;
! C+ O) P' w+ s( Q9 n" `6 g4 m& d k=0;
5 ^+ Q8 {$ B* @3 f) N) Q m++;
$ V/ n" ~9 v+ b }
* @# r9 W- X! F a i++;
# \5 f+ {% u! |7 t- b if(i==n)i=0;) K& s5 v7 B" D2 z" [! n0 x; U( B
}
2 ^ A: q d, G: S. ~ while(*p==0)p++;
$ n L" I& k! x3 `$ f printf("The last one is NO:%d\n",*p);
9 X" e9 Z" T3 j( Q! _ getch();
: q6 G6 _# v) `1 h+ R+ i, i( P6 e: _1 e$ ~+ V( A
} |
|