|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!, R; |' j1 c- y
这几天我在忙着编一个问题,我用了一种方法编出来!
) Z, r/ ^3 S7 o但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!- S) d2 o8 J4 C, W' i7 f: b4 R& h$ {
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
/ k: P n1 T- W* S' M
6 y3 j; s0 X8 u5 ^" H& y( d, s0 g2 I$ j5 [1 n+ ]! M8 D Q
题目+ c9 x+ w: V; Z$ u4 A, _: K& h
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
$ n4 F% x; h0 g3 e8 j% A; ~* A第一种方法:利用循环链表
! U# A Y0 t7 D; v. y; i#include<stdio.h>
I* R- ^# J6 @#include<malloc.h> T6 e& g. j1 C0 C+ r' B8 T+ ^
#define M 8 //共有8只猴子. h+ Z# p! ~5 }9 g* g0 D2 u
#define N 3 //数到3只时退出第三只
' x/ F* |; _. H% m- ]/ `typedef struct monkey
+ L% g/ T6 ]& u: S2 g# `{int number;
4 y0 x# b) S5 r+ Rint flag;
2 x, ]9 ~5 W. Z+ J; @- kstruct monkey* next;
0 P& @" O) }$ ~& a" R* T5 C- H}MONKEY;
2 w1 }# q7 p s4 B0 w# Omain()0 m; Q! { S; i& b8 a
{ MONKEY *head=NULL,*p,*s;/ h6 r( G5 ^1 G& r; V* R
int i,sum=0,count=0;& `, U8 u4 _# v v- z2 z
clrscr(); //清屏
, @! @% ^: @5 r9 G; C2 b! V6 U p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存* |% @+ [) _2 Z0 Q
p->number=1;p->flag=1;0 E" j: q4 d; k0 u% F
p->next=head;
6 o; q# S, C- K3 _: k head=p;9 A4 S% M m9 a+ K6 Y
for(i=2;i<=M;i++)
1 w2 q4 B' p/ }/ D' w$ X { s=(MONKEY *)malloc(sizeof(MONKEY));7 ]" v. k- @! Y
s->number=i;s->flag=1;' z2 z. J% }% D. T% w
s->next=head;
O( t7 }: W. ?3 S8 ]! ~. A. a$ L2 T p->next=s;p=p->next;
4 s( I6 q5 i" v( j }! o2 p9 _4 R+ g
p=head;) ^1 j' b$ n9 Y5 [) O, B' Y2 t* L
for(;;)% x* n+ E o* X: f9 K9 q8 G/ B' V2 V
{if(p->flag==1)0 f1 O+ L3 m& ?8 S. u4 \$ ?
count++;/ z( y5 U. E' E& {" F$ G, F
if(count==N)! m; j3 x5 `3 N
{p->flag=0;2 t1 D/ b) ^ _# o- O
count=0;
$ I' R- J: @: f& Q" Z/ z sum++;}) x' z1 g: K, v, K1 O- k% `
if(sum==M-1)- w2 ?) C X+ L' R. C' [8 ~9 e0 a
break;
% u& W5 X8 n6 X; W" z p=p->next;
) G$ l- L& x3 g. ^' q }
3 x5 ~7 Q* e5 m6 T8 d p=
) y( N; t0 i1 @/ v5 K head;1 S# `. l9 V) G3 s5 V' t/ c. \/ @
for(i=1;i<=M;i++)" |* O# Y4 [% _, M! [2 e7 ?
{ if(p->flag==1)
' t; k1 R: J4 ?9 y- @8 C; p printf("\t%d",p->number);: j5 @. [1 S* I3 i
p=p->next;
% X; u7 w. b# [1 N8 L- x5 G( ] }
$ X$ l' J/ C5 @% ?8 [+ F# {7 B9 v( c& ]/ z0 @
9 {. l% N; H ?) C$ y3 V$ x, m+ z" \$ y
}
3 \. N( C/ Y5 N7 e6 R3 t第二种方法:数组
2 n# \8 @: l/ Y* P; X# y% A#include<stdio.h>
( m( {4 K, S) u, J8 Q+ B4 b. @#define M 8) f! ?9 f( q& ~0 R K5 y% U! m
struct monkey m- Y( V% J& k. m1 F% _; R3 ~
{int number;
. E) [+ a* F7 x) w S# M% P# Jint nextp;# e+ b, c2 |1 S: {3 t; [
}link[M+1];& B6 T+ x) l+ G" s/ b& t
, T$ }: L* Y, Q/ t3 s+ Ivoid main()
3 p' x- U) E& H; p* t" o, V{int i,count,h;8 h) t" [# B5 }) e6 X
for(i=1;i<=M;i++)- ]1 Y9 h" [! P& |
{ if(i==M)
B& z' ?+ `8 ? link[i].nextp=1;8 ^" h3 `/ @4 W! I7 i. K' w
else
0 I$ x( y: s5 s link[i].nextp=i+1;
4 U4 ~4 w, ~0 J1 k( \0 y+ M link[i].number=i;
# { a$ c/ M4 F1 i7 h0 ^}
' @6 p2 a+ R& }' g) K) g7 W% ]2 U6 vprintf("\n");
( }- l! o, {0 s& V7 @/ z& i jcount=0;+ _% X6 |, M3 z2 D
h=M;( X; M. C4 ^; ?! H& e5 N
printf("依次退出的猴子: \n");
/ u$ ~8 M2 k" t0 G0 ewhile(count<M-1)7 N6 Q5 j9 _9 Y
{i=0;
5 U! {, w; b* v6 K' i0 F5 Ewhile(i!=3)
$ E3 U1 U6 C, I6 \! G( [( p5 C{ h=link[h].nextp;
4 [* D( z! [/ F: { if(link[h].number)
% q7 M- h5 F T. N* G8 ? i++;}
' ]2 I' |* H' e8 z7 v
+ ]; D+ N5 W/ T+ h( K6 t& Hprintf("%4d",link[h].number);0 Y* _( ?3 F5 K! n& x$ u
link[h].number=0;
. |" S5 \) P, i; L$ X1 Gcount++;$ r2 B3 U3 }. ~; W' Z
}) q: M% B9 x+ R' W9 |+ r( n4 r
5 b9 m& Z! e. F( Q* p5 v Wprintf("\n大王是:");
0 ~' n( [+ z* Z" o for(i=1;i<=M;i++)/ E$ E1 M. l$ s, u
if(link[i].number)
# W2 Q! ?$ U( C1 q; u. l/ M$ | printf("%3d\n",link[i].number);9 }- b/ K0 O4 \, X5 f8 {$ M- G. z
1 } L7 e3 }' A- i% C1 M, t3 D6 D0 N6 N7 Q; r7 A- a
}
% C. O& b$ x& w$ S4 c第三种是普通方法for循环
4 a; q/ ^( y, B8 v+ @. F#include<stdio.h>4 r" f5 O9 g$ w) @9 P
void main()8 p0 M- P4 k3 K8 G1 T; E, s
{ int i,k,m,n,num[50],q,*p;$ K9 k- Z! z* T: `% O5 y ~; a
clrscr();
6 j% a n+ e' K M0 s7 x printf("input number of person: n=");8 }/ K0 g& ]/ |; l
scanf("%d",&n);
/ i, c* n g+ X o2 A$ p& n# cprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
$ l+ p- A! X3 f. @7 e8 c& A scanf("%d",&q);2 ^: M' _+ J: e0 J1 T; t: @+ t$ n
p=num;
! J* N2 V# N: T for(i=0;i<n;i++)
& [' P! L* G( [ *(p+i)=i+1;
9 u& d" I) h9 @: F4 C i=0;( N( r2 j/ ~: j2 o/ n2 [
k=0;5 S( W, D) N% g3 D. L! ?2 ?/ ~
m=0;
6 w% l0 r' B+ b" j7 j while(m<n-1)8 l. P# ~! M: R2 H( e" W+ k
{if(*(p+i)!=0) k++;+ E0 m! a- `1 x* \8 d
if(k==q)
& e3 V3 I, |4 b' A2 S0 B2 S/ U% Q { *(p+i)=0;% H) q T o8 I6 z5 v/ N" D5 U) r
k=0;
. t+ m# f5 P& w9 k) i/ k m++;
* E$ k; t4 T, H/ e2 c8 T }
4 w( _3 c. f; M f1 b i++;
. Y" Y g3 g. }) ^+ T8 x5 O if(i==n)i=0;
9 b* a% k+ ]8 a' |6 P. ~6 ]6 m4 L }
& c ?( I, X) f! q& U! M while(*p==0)p++;- j. R2 g! Y3 w+ p
printf("The last one is NO:%d\n",*p);
! M4 H/ E0 T" n* A! ? getch(); Y9 i. v/ T$ r9 F. L# b
2 ]4 N$ Y, E! R' m1 `/ f} |
|