|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
5 t9 m; @$ ?/ N6 ]2 ]这几天我在忙着编一个问题,我用了一种方法编出来!: n& T$ q3 E/ b3 D: O
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
4 c7 l6 F! {+ d+ ^5 y6 l0 y注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ; q5 a( W$ O. H( n w
) v7 E, ^$ A$ m* w# _3 N3 u) |, s
2 q4 [, ^/ A7 `: K# q: u
题目
* o1 _8 N& w- w5 M1 }' t山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
h5 |& p* [; g1 I# ?, @第一种方法:利用循环链表) z. D# U6 e2 g
#include<stdio.h>, ^2 X& ], K! f% }- L) D
#include<malloc.h>: k! @1 y8 r- ~! z$ ]/ {
#define M 8 //共有8只猴子
. P8 q3 A9 d5 f: m0 O1 v#define N 3 //数到3只时退出第三只8 [: |# F9 r7 e/ s8 C y( g
typedef struct monkey4 n" r0 m, U: k' ~8 Y/ x
{int number;
6 ^0 c- E( U8 b7 Q1 Lint flag;, P7 ~" Z. @1 I
struct monkey* next;
6 R/ n- \! _2 k3 }}MONKEY;
7 k# A2 z+ q; o5 }$ [main()) }* v! {, G. K0 v
{ MONKEY *head=NULL,*p,*s;
! j9 r; Z: m3 d5 q int i,sum=0,count=0;
- M1 [) _- U( k! o) J; F) g clrscr(); //清屏
- |! D7 x: O& o& o% g! a* q p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存& e9 x, z6 m! } O* N, ^
p->number=1;p->flag=1;. w0 H0 _ H, c& N
p->next=head;
$ C* I" L9 V% H. z, n* l head=p;
5 S! i1 b8 x9 E- H0 W for(i=2;i<=M;i++). t2 l, T$ x$ [2 P R
{ s=(MONKEY *)malloc(sizeof(MONKEY));
" g2 A, _+ X1 A3 t5 ]5 J3 F* @- V( h s->number=i;s->flag=1;/ G! X! g' g* Z1 D7 h$ a
s->next=head;' w) l/ E9 L# T1 V) O1 G$ _
p->next=s;p=p->next;
2 b8 ?3 H! L1 t8 n' m! L }
) { q2 z! O( c8 n p=head;
5 ~! G3 e! c$ `6 u4 H5 y for(;;)
1 {: Y1 _5 d0 D. d {if(p->flag==1)5 k) W* M0 h/ F. B( D
count++;
* c9 f% t! b, J% @! W7 p* K if(count==N)
# B3 ^5 X0 \# n5 N r1 { {p->flag=0;$ V9 V; X% Y! p
count=0;
7 Y7 {# i: p @' Y) Y( W5 O sum++;}
" O0 \2 J3 a8 z0 k5 V if(sum==M-1): R7 g9 j! j2 [7 D% l! h
break;
3 D; Q! z u3 ~6 {8 ` p=p->next;
7 w$ H, Z+ \( D$ l ?+ ] }
. y2 ?. q5 L0 H" z! S3 P9 l) r p=
. `. J8 f; E- Y! w0 ~) \: s head;
( Q n1 I) e; y) e for(i=1;i<=M;i++)
& c% h/ B! c1 E1 t; Y! \. ^3 S. X. E { if(p->flag==1)1 r; ?$ q: T; r$ z5 [+ M
printf("\t%d",p->number);
q9 p' Y8 L* m: K0 B p=p->next;
0 ?0 c5 c3 U. C3 ]9 f5 E# e }1 I3 e( p. q$ K: R, d+ y" l
1 M* q2 P( h/ X2 v5 z' E" S; V1 K+ F5 G ^
4 D% b8 J0 i% I3 _} 5 q' D8 x& n+ X! Q& }
第二种方法:数组$ }6 L; Z/ Z, z* Z: r# W8 S6 P
#include<stdio.h>
4 f. n! e/ S+ Q7 T0 V#define M 8
7 e9 N6 Z8 |1 t4 H0 M0 S! |struct monkey, w& p) s) h# @) n6 ^
{int number;
# L: }# d* D& H" ^, |7 Uint nextp;/ K8 E5 @0 \7 o6 |; x4 S* y: l) ^
}link[M+1];6 F8 g f' G6 m7 l9 p& L. Q% u( g8 e
0 U! b# s' v J. q$ l
void main()
8 l5 r0 n1 q7 W{int i,count,h;+ d& R8 z2 K0 \5 h% I+ y
for(i=1;i<=M;i++)5 F- Z+ q( r0 |# ^, _
{ if(i==M)
+ Y$ `& Z0 Z( n" H8 h link[i].nextp=1; N% a$ F# B) g3 _$ b
else
" S# ~( _% M. K" Z) U$ y3 s link[i].nextp=i+1;: |) V4 S" U$ G! X9 l
link[i].number=i;" {; k5 P3 |* E" Y
}
# s4 a+ e8 d- T2 Z/ J" kprintf("\n");+ x' _* R# H7 O0 s" E0 l' P: A
count=0;9 J; W1 {+ f2 M/ p
h=M;
! v4 c" h" ~& U3 j7 P: p/ F1 E* Sprintf("依次退出的猴子: \n");
: n) Y$ S) E* B0 d0 m4 g* kwhile(count<M-1): { E6 l- I% f- ~# }6 _
{i=0;
9 [9 x6 K7 m# i6 g; M+ d1 ewhile(i!=3)6 b5 e* P2 H" O# h# [
{ h=link[h].nextp;& V$ h/ a" a) ]0 h+ l5 d" h
if(link[h].number)
) Y1 o+ G1 a8 j( } i++;}' m' X* V& M! v: q3 i8 D
+ y; ]1 N3 Y% r0 x' V& dprintf("%4d",link[h].number);
& ^# Y. u% F) Z: y7 tlink[h].number=0;
, F, ~7 l7 m' S( Z2 V! lcount++;: Q+ t4 N- q! F. Q& l6 Y
}4 A; b U, [, Z5 N- v' o x
1 O1 E4 e" G& x5 o. s [$ s
printf("\n大王是:");
0 l; J1 j* ^+ { for(i=1;i<=M;i++), j8 m1 O- e' C7 m O$ f% @! O
if(link[i].number)
! A: n3 w; k* a1 n% n) O, b- K printf("%3d\n",link[i].number);" E" d; J. b" d, u
# a7 q4 N' s" J' u
1 c+ }! H7 ]4 U8 Y" K
}
5 X- x7 F( s' `6 ]% p* e' d第三种是普通方法for循环
+ l' j. X7 _$ ^/ U# Y! ^#include<stdio.h> v/ Z' _: d( m! Q! M! X% u7 A
void main()0 F5 n2 e+ x! O3 v; X6 O+ [
{ int i,k,m,n,num[50],q,*p;
4 q2 F! @% d. Y6 G' F/ o clrscr();6 a5 T! z5 y& M4 {2 |4 V H
printf("input number of person: n=");1 K" a' }$ W4 h/ I
scanf("%d",&n);$ L- [7 d% c% H: R- ]6 b+ n
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
, N$ q) h. z2 G: Z( D1 ~0 u" a! i scanf("%d",&q);
! F% |# H! `$ s# y9 @ p=num;0 R' Z5 u, z: x: d
for(i=0;i<n;i++)
6 ~; A. e% d6 [1 x$ K ]; O *(p+i)=i+1;3 [" x `/ w8 G, ^
i=0;
% z6 a% X, A1 _9 V c k=0;
! s- @4 @7 Z- V. V m=0;
4 N$ M. Y/ u( a8 u while(m<n-1)3 X+ S8 y0 T) g( u4 e
{if(*(p+i)!=0) k++;
+ }* ?2 q; ~ ]) s if(k==q)
* I" X, O6 ?1 t. U { *(p+i)=0;
3 N. a- V8 A0 G M$ F" _3 u k=0;8 W. u' w( n% ~' Y8 j# t" D
m++;$ f1 T* B- U) G! M. L% G% t) C; o
}# ~- p, p9 ^ w, w, N5 z
i++;
4 e G3 [6 X$ e$ K A, ^ if(i==n)i=0;" F) X$ m6 Y) s9 e) ?) y: }
}( ` | r/ }) X+ H- {; M
while(*p==0)p++;
1 v9 o6 u) U" {; j" S0 w printf("The last one is NO:%d\n",*p);2 Z5 w0 S, _6 z
getch();1 d! {$ T- f' V
7 [; s% P6 G G4 U+ {} |
|