|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
×
大家好!3 b' k2 O5 S; D
这几天我在忙着编一个问题,我用了一种方法编出来!6 J) o& y# h. G
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
! V9 V4 T% n, r$ y2 M" B注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
$ e* J' J) T& l T
: r* Y$ o! m( [& d7 j1 ]) O; K- @$ k7 I, L7 s
题目
' s1 i0 m( U2 r4 Z5 ~山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
7 W. Q) z# b3 `; } d$ O第一种方法:利用循环链表" e1 I6 o7 s/ b0 ]
#include<stdio.h>- L& k) D& R; E9 h
#include<malloc.h>
" g7 I/ }* k1 Y$ P4 j+ r#define M 8 //共有8只猴子3 c. w. R; W2 p$ ^# t# s7 G
#define N 3 //数到3只时退出第三只
( g1 ]8 L! l" Y" r" Ctypedef struct monkey
$ A \2 b% |$ \{int number;3 u r1 A- @; F9 t6 d
int flag;
& l' _4 |) J0 e* r/ m& qstruct monkey* next;( r3 G- x4 @+ h4 |3 `
}MONKEY;
2 E# P' d8 [3 F L, t' xmain(); c! X, u; p x
{ MONKEY *head=NULL,*p,*s;
0 I. [$ N) ~- h7 w6 r1 I int i,sum=0,count=0;
( p2 Y* @" K: ?& N8 W. y clrscr(); //清屏
/ Z+ j# Z, M/ t3 |+ A p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存3 R( s; u% d6 w) l
p->number=1;p->flag=1;
, R+ z" V% q+ ^) A p->next=head;
, z0 F0 {' z+ E: W M/ ]6 A head=p;
. ]; G) ^$ C6 m& Z* B: [1 j3 b for(i=2;i<=M;i++)
1 |% T, w& x. ]. k# t* D { s=(MONKEY *)malloc(sizeof(MONKEY));$ W% _2 i4 b2 |. }
s->number=i;s->flag=1;
1 a+ P8 s9 ?% w$ |" k7 a3 H s->next=head;
( t6 V8 m; o# s, D p->next=s;p=p->next;$ k7 g6 z+ p! G/ f! \* e
}
, W8 N7 I- i2 Q2 p$ s3 H p=head;
- Z4 K. J: t) K) C7 ^ for(;;)
' f7 |7 F3 A( A6 n; f5 J- ] {if(p->flag==1)
+ h4 z7 }! t" b" b count++;: J. h/ D2 `3 {% S. G
if(count==N)1 s, W+ R- Z+ L) s8 ~8 w& ]6 m( Y
{p->flag=0;1 H" G q4 W0 e5 W# J4 E
count=0;
$ V7 f6 L' a) e sum++;}9 O8 \8 Y/ F0 r+ z I0 h% `, n( l
if(sum==M-1)$ U: v5 i. i: w. i# |: C, l
break;
: w. M; m$ i6 p" ]$ ~8 c! i+ ? p=p->next;
5 N# M+ A. H+ @1 B' n/ _ }# Z/ D3 H7 y$ R) w# t3 m, [3 Q
p=
8 l$ a: J- O3 f head;
: U3 o+ t$ v; h. Q& M+ X: t for(i=1;i<=M;i++)
1 `& Q5 D$ i: v2 }1 J( t; w { if(p->flag==1)
4 W8 M4 H* R0 m v9 C" ^ printf("\t%d",p->number);: G/ S0 u) E0 Z/ Z( I5 C
p=p->next;7 C' \1 ]8 k# [# G. E* ^
} `. m# M j- o$ s8 Q
- Q7 I. J: f* ` K# k
( i; C7 R. W) V" _; C" t& v3 D2 q
) G& y3 `# J- e1 E ?3 X}
% |) ^. `5 N6 R% A$ Q5 ?第二种方法:数组
0 x. [- R$ ~0 I% i0 S* D3 y#include<stdio.h>
: Z) @1 }7 u( P! K. E" R#define M 8( W8 {& \9 `4 Y% H: ^; E
struct monkey
6 n$ ]/ n" a# q{int number;4 q9 C; m+ k+ m4 M& @" H5 q' o
int nextp;
# r( S* Y6 P P}link[M+1];# ~1 s) h" r& y: p: O
* B. ~. b7 z3 X5 K
void main(): r8 `0 d+ f$ `
{int i,count,h;
' N- _4 h: y. ]5 ?( h. \6 b6 L) G+ Dfor(i=1;i<=M;i++)! K" a" Z- d8 H* ]
{ if(i==M)) Y) t0 ~) h& h; ~# I) G6 I! J6 ^
link.nextp=1;
# H9 b t6 c9 `% J1 g else
8 X3 g& Y$ u( T4 f link.nextp=i+1;
- Z7 p) W3 y d: P link.number=i;+ t8 o5 M6 k$ n& J) K7 ]0 U
}
1 K$ J: n8 k+ M) ?0 X. Q1 g3 H/ _; Oprintf("\n");4 C% E( I" F, ?, L2 W* ^
count=0;1 Y) a+ K, g s9 \
h=M;. ~7 E, R! I% \, c& P7 n
printf("依次退出的猴子: \n");. s5 Y# L& \& M2 B: h f: O0 r
while(count<M-1)
4 u5 c7 `/ H. X3 o9 K{i=0;
2 ~/ e0 s& z, P+ O: i* G0 Qwhile(i!=3)
$ e- s! @: \7 a- n5 ^% D' h{ h=link[h].nextp;
4 s5 s1 f5 d% X; C* I% v) e ~ if(link[h].number)
j$ x' z2 j3 c D/ ^" U/ Y i++;}
+ `7 u. k ^" X* w
+ J4 `5 o6 p f3 J! Iprintf("%4d",link[h].number);2 j9 J4 m5 G+ ~& J4 b) {# s
link[h].number=0;
; \; k. D: `3 t7 l1 Z7 ^& I xcount++;
/ v7 O3 e" @: e- v, t& b2 s}
' H6 q. Z& ]1 \: v0 Z
/ `& s6 Z: r: R9 e0 B( fprintf("\n大王是:");
8 V/ ?* O/ [: D% U6 a for(i=1;i<=M;i++)/ d& y" J" y! j# \0 r0 H- [/ B
if(link.number)- P4 A1 ?$ @* K' b/ R0 m R! \
printf("%3d\n",link.number);
! o; `7 g- l; R }& \5 v
) \- \: ]: }- d! X9 e4 u, ?
9 _& n! T, Q4 g5 Q5 C) H% `} 1 X/ `: W" M! P) P7 c8 `/ m
第三种是普通方法for循环
' F, z8 c& e9 c, S' k: U#include<stdio.h>
# ^# B3 ?4 f2 x- J" j5 I8 q! Q) svoid main()
4 ~2 G% i9 a3 h* L. S; y{ int i,k,m,n,num[50],q,*p;
9 {# C9 X3 z4 j2 V6 s8 w/ [ clrscr();+ @$ d8 v* c1 E6 T
printf("input number of person: n=");& z7 Y) W6 V2 `- }+ _
scanf("%d",&n);9 M, N- V8 t" J
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只 @" B! K9 ~. i" ?
scanf("%d",&q);
8 j& g* g. C& P% d$ o p=num;
- V V0 E# K6 D2 q& s* W( V for(i=0;i<n;i++)* m1 f) d. y3 c, J* f
*(p+i)=i+1;3 b7 K% W& ^ U4 y0 l- S4 n" }$ z" E
i=0;
; M* B# _6 J' q6 N) K1 H* j k=0;+ R" X' z% A$ z. J+ f
m=0;
% [, J2 Z0 ?: Q; z$ E9 J while(m<n-1)+ _/ v/ H* z, s8 v2 }1 |3 {
{if(*(p+i)!=0) k++;% v, D: ~" m* r; `6 v$ a2 n7 C6 E# x
if(k==q)
/ `3 Q: }. p. c3 J! ` { *(p+i)=0;
8 }5 a9 B4 u3 a1 w3 c k=0;
1 u" `/ v8 P+ v. v; E m++;! n5 {$ A z/ X" B( J& Y
}# A5 {- b- b9 Z4 T$ Z# k3 C
i++; O; c8 O% ]6 f( Y9 F9 G
if(i==n)i=0;- S, Y; x' b- _$ b2 }1 D
}
# P: I v& I$ V5 Q# E4 d while(*p==0)p++;0 ~7 A( J( ~& e1 `
printf("The last one is NO:%d\n",*p);
4 p) a$ M2 E4 v/ I' ^* g getch();8 Y, d" E: h2 l+ D ?& A
6 }! ^6 J' p# {! z: X% k} |
|