|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!# B/ `! r. S* ?7 P+ C. n8 ~5 g
这几天我在忙着编一个问题,我用了一种方法编出来!
" f8 i1 B- ] s! Z$ |" i1 e- x5 o但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!1 C" M8 `( D$ A0 D
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
+ C9 H" @+ t( } O C' M5 T0 w4 R
4 k; S/ k1 m& x4 G; `
/ I1 r. _2 t( u; O 题目
5 K) y V8 a: M$ O山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
* q: W! \$ g" N3 S6 k第一种方法:利用循环链表
/ b4 H3 F0 r7 g, c#include<stdio.h>
& a( V7 Y/ w! m$ B" i#include<malloc.h>
: J! T# B4 w, Z8 a5 C; [& N#define M 8 //共有8只猴子" M Q+ ]6 H4 K# b( j7 b
#define N 3 //数到3只时退出第三只
6 A' E4 q' ?9 f: }, btypedef struct monkey
9 U9 z( r( z0 ~0 X1 |+ c{int number;- E2 ^! C$ T# V8 `% I: O4 C
int flag;
) L4 V, b% a) s! C! \% Xstruct monkey* next;6 o: L4 l& j3 ]1 v5 I: G" I
}MONKEY;
) g% m9 V9 s- ]# Umain()1 W6 u/ u. J( ?" O+ l/ j
{ MONKEY *head=NULL,*p,*s;
( `' _; L2 B2 \$ N9 w) I @4 W& g( k int i,sum=0,count=0;6 C: a" f3 f: J: K/ h- {2 I
clrscr(); //清屏& D, B0 g7 {$ u& z+ ~4 ~
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
) R; C' d) V# |' ^3 T- x p->number=1;p->flag=1;) g) }/ N6 @/ }/ x* @
p->next=head;# ^& p, M: L9 ~) w# C$ F
head=p;
1 ^5 V. |" S6 Y for(i=2;i<=M;i++)
5 q: F# n7 c4 R! A7 w8 C7 z# _1 O { s=(MONKEY *)malloc(sizeof(MONKEY));9 O& o" {) E. z
s->number=i;s->flag=1;
3 ` K1 B. `1 U) y, q: z s->next=head;
: W( |' }2 l0 e8 N) ?# S. n p->next=s;p=p->next;
7 q- _% `5 l5 J+ l }
/ ]. Z2 H3 Y3 m' C0 E0 C; m p=head;
4 u- b( f, G& @: | o for(;;)9 q& h! g& V4 ^9 f& g3 n# |% X
{if(p->flag==1)
( j& P2 O5 N/ N3 d; y7 J6 C" k% m count++;( g) j! G, l7 A; c Q
if(count==N)
( q f- p7 R. Q1 d- \3 ^ {p->flag=0;% G5 {8 I. N5 b( F9 d* t3 X
count=0;
% @: G/ P& O; {2 O7 C sum++;}
6 e& W* e* \6 w. q if(sum==M-1)
5 C4 U( a* n' w" C3 g# D6 ] break;
% V2 ^1 ]; s7 j/ d p=p->next;- y$ l" D' P' R5 E
}
( B) b9 V, L- ~! W, H6 Z* Q* g% j p=
" G) q# O4 } x1 O) ? head;
^- v7 ?6 g: r- V8 u. o! R for(i=1;i<=M;i++); T2 r" e/ a* V" l0 F) J
{ if(p->flag==1)
7 Y. @ ^( @" C" H printf("\t%d",p->number);
$ [# q* ^1 Z8 B) X. F/ z3 Y9 p p=p->next;
% a8 p' D Z8 ^% y( w }3 ^% `) ]6 V" ~' w
( {3 o( N0 h8 ~0 ?
+ f2 }2 H O/ C8 b8 {2 N$ p
& J- T: F* L7 w A* _}
. c9 I Q# x( L$ Y" u第二种方法:数组: U% }: P: y$ B3 t+ g+ r! H
#include<stdio.h>0 p# l4 y" U' U* x% f
#define M 8
& h2 }( c4 b) A, l+ v6 g& N% Mstruct monkey
9 e7 N1 O2 U( X1 w' @2 c; T{int number;! }' j9 _3 e7 |+ U
int nextp;
+ R) a; ?- |6 I+ m8 A% z! b# j}link[M+1];* [' H+ E. B5 W
* l) G9 E! W0 t/ ^+ i7 ` M# v: l+ evoid main()
6 U9 n6 i4 D* a, \, |$ ]# X( C{int i,count,h;0 `. T* f4 A# m; v' l
for(i=1;i<=M;i++)8 m" t: m' p' |8 d, q' }
{ if(i==M)
' t6 n" S7 e: a+ x) ?8 _! _# ] link[i].nextp=1;8 C3 h( P8 @. h" H1 _, N. ?3 P* r
else; t3 a% S3 d- z% `' U2 i
link[i].nextp=i+1;3 B* D6 k' ~) y$ W' P4 Q
link[i].number=i;
+ g( J% k* v0 f}
+ O& q, [4 p7 a% u5 eprintf("\n");
: y. \3 u, \. Y3 s( rcount=0;2 @6 O8 p* e4 i* T' O) Z1 r$ a [7 s" b
h=M;: c$ n: K, d8 [& E( P
printf("依次退出的猴子: \n");
2 G b/ ]. I! z0 Z, s. ?while(count<M-1)
3 V3 B8 C9 P( q. i/ a+ r+ `8 }2 ?{i=0;
& R# r. X/ `& V# e& p& ewhile(i!=3)
; e# `. m: Z1 x6 |" D+ j) x1 u{ h=link[h].nextp;
6 S# B g1 O5 @. L3 X% w if(link[h].number)) E1 ?% j9 n( o
i++;}
$ m. y% B+ K/ c+ S" g
; ~" V: X" j/ J* l$ y9 I2 eprintf("%4d",link[h].number);9 D7 A* R: M$ J* ^7 n0 n
link[h].number=0;* r: J, H1 s) A; ]( T) g( @% W; I
count++;% ^9 f6 ?' j; F- V' l
}
5 U1 q/ m/ v3 Q0 N& s* g! F* E3 |3 |: k R- s8 }9 b0 k
printf("\n大王是:");
, |, F8 ?! m- V- l for(i=1;i<=M;i++)
: D* U- }* A) O! w2 m" l# i if(link[i].number)! ]0 x. W4 p1 v! X+ `
printf("%3d\n",link[i].number);
, s d6 s6 y! M) a( `% S+ H A u4 m; C6 b0 ^1 K
' [/ B- c9 \: N+ Q5 Q; Y/ X
} . v T) |& h2 G1 H9 w, L( W
第三种是普通方法for循环
* f6 O/ ~7 [7 h#include<stdio.h> M( u- X; y6 K0 L
void main()
4 ^/ G2 X2 M) |! L3 ?{ int i,k,m,n,num[50],q,*p;
) _- ^3 O3 n% H" `- G+ T8 r clrscr();
2 K2 I. j$ l% b6 C E+ E printf("input number of person: n=");2 C: g# t8 Y2 w3 A
scanf("%d",&n);2 ?) ~2 O7 ?* _ s" c4 s2 v |
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
2 k: r8 ]. d& H scanf("%d",&q);% a+ a9 k" k; K
p=num;2 i. j) x2 d+ C$ M+ e5 |
for(i=0;i<n;i++)
3 Q& j6 z3 f0 `) L* z' D *(p+i)=i+1;
+ n8 o9 s9 A- W2 P i=0;3 W% N, ]; i9 i
k=0;
& I1 L* t- \ F% T; _! B" B m=0;
5 K2 b- L+ D6 I, ` while(m<n-1)
* W* E7 u& g- c6 A {if(*(p+i)!=0) k++;
9 `8 `. n5 {$ p/ t5 r, p7 j( \( p if(k==q)0 C$ V# _! v7 Y' D/ F+ k
{ *(p+i)=0;9 h* p- d' N( K3 T% g0 j8 r7 A0 u
k=0;: u9 K% y9 {( O) X1 `$ j/ y
m++;: C9 C) C0 e9 K, u! p- f! _' \
}! o" z3 X& V/ q/ n( W- j
i++;
1 w2 W2 F+ r: E4 H2 C3 B if(i==n)i=0;
, o7 w1 x8 O6 o7 X9 E7 Z }
/ {; \- m3 x5 ~# V/ k4 s9 G9 U while(*p==0)p++;
, K$ k7 g5 @9 m% a5 ?( X printf("The last one is NO:%d\n",*p);8 g+ X5 N6 F, u5 p
getch();
V+ j& {/ U( q- F$ E+ Q- Z. j6 ]% R) B# m+ T+ U- ]/ p, C* E
} |
|