|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
6 _$ F* a* `+ T# j这几天我在忙着编一个问题,我用了一种方法编出来!
: E1 r2 {: w$ u( _1 G( {9 j4 R+ S但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
) U- \1 u& J1 F1 Z9 E注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
2 l. D" o, A- F& C5 X/ q3 o. c- O: N0 G& [4 e
' ~' P3 {, S0 [# W9 a P
题目: b# ]- m/ w, L
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
r) j# C7 v. ^! V& X2 u第一种方法:利用循环链表
3 g/ \2 W4 ^% t! Q/ N#include<stdio.h>
/ p @- _0 m9 @$ `3 c#include<malloc.h>
1 H: }, \3 D& r1 m1 g% ]1 {#define M 8 //共有8只猴子7 F( N/ V6 o& _5 K7 R W. B
#define N 3 //数到3只时退出第三只' A+ h* C# W" S `
typedef struct monkey5 h5 w& O, h+ a O( k+ S
{int number;
. b! S5 q1 G+ _3 U- iint flag;1 ^- }5 h1 \* K
struct monkey* next;; ]* c" p" Q @; Z' _: \
}MONKEY;
) ?. P* U( i( t5 `# `8 Vmain()4 x+ D+ W% n9 p# W0 p3 ?. u, f# T) ?* B) z% P
{ MONKEY *head=NULL,*p,*s;; U# H9 T5 M( c* ?! m
int i,sum=0,count=0;5 G3 Q' f# w3 {& ~
clrscr(); //清屏
4 {* V- M1 d4 g- V) p: _! j8 d, @+ X; [ p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存) P9 V6 v" g* C q; A% q
p->number=1;p->flag=1;1 h6 C3 e8 I/ j H* L- X* t; O# L: f
p->next=head;! O9 e) }" J" U
head=p;8 z& F, T; S8 Z. `0 H1 V; _6 O
for(i=2;i<=M;i++)' x- G, Y1 ~* Z: d; ^+ G/ t+ _
{ s=(MONKEY *)malloc(sizeof(MONKEY));
- F- ~4 [# K, p2 M2 @! F s->number=i;s->flag=1;! O) O' P4 i; Y7 Q
s->next=head;
# _9 v/ `& e- H5 h! J X p->next=s;p=p->next;$ \4 I7 T- L, g7 j, _5 w$ `. |
}
: p [. \4 A1 V8 D2 W" f4 U p=head;! w4 v; F! F% w6 V
for(;;)
! K2 F" `1 a- i/ L, c {if(p->flag==1); F2 y6 k! z: q
count++;
( Z3 Z X4 _; C! l- |* c9 B if(count==N)
% s% o! C9 Z/ ?. c {p->flag=0;
) Q& o m: a! b0 c, H( S q count=0;: N5 h& E$ e3 x
sum++;}
" V1 ^. I4 T0 | if(sum==M-1)
6 v' j6 p; P1 w7 v# G+ J break;
5 i" E8 X( s+ ~! h! A4 w/ Y p=p->next;
9 o- O6 e6 \( j3 R+ r! O& a }! H- ?* U' x2 p: f; E
p=" p# [, a! K$ k ]' D+ p
head;
* D) |6 G K- g3 n* a; z* J for(i=1;i<=M;i++)
R3 q: h0 L# `( ], h% T1 e { if(p->flag==1), X9 r$ C* f" p) K
printf("\t%d",p->number);
) V: M" I+ W, w p=p->next;
& ^8 C) Y4 |& h( J# E, q! ~7 ` }
. Y/ k! h- q: U+ M1 [, M3 ^2 O; p/ e
( u( g- t. p# i; O, U, X" L/ U8 J* N( @4 y
} # s7 o' n9 c% q$ g8 z/ N8 B: H& l1 K
第二种方法:数组# o9 \" N" Z* K# B L- E1 W, j- J
#include<stdio.h>
7 G& J9 `) M# T5 j#define M 8
8 _2 u* w% {: B) D( ]9 ?struct monkey
7 v% ~/ b* t; k& K7 ^2 D{int number;
; h' p9 z8 {! l9 m0 q+ ~; [int nextp;
* N- y5 D, d) U) h}link[M+1];5 X! v6 R' t- j4 d: d5 C' Y
6 S+ w& @5 x* G5 \
void main()
7 |% t" L/ M# p7 {{int i,count,h;
) U+ Q+ m3 R! Z; y' ~$ @: Ofor(i=1;i<=M;i++)
5 \. ?' f+ s s. N+ c{ if(i==M)9 h. F( J8 \9 _4 Q
link[i].nextp=1;* g; Q0 g$ a- Y9 h3 `: l+ f
else
$ b* N3 I N' E( K# _# }) p+ c link[i].nextp=i+1;' O3 Q8 }+ Q* V5 Z& E! O* d
link[i].number=i;, R0 c$ K. a+ Y4 H# |7 s& z% Z8 \1 E
}
& k8 I3 j$ D: b; }printf("\n");) Z2 Q! }8 B8 k6 t
count=0;
- X( d* H5 e1 D' a: ?% G# c' t! Wh=M;- D9 z4 e7 q! F, e/ H
printf("依次退出的猴子: \n");. O9 R" O: o( ?2 p6 S0 a/ C
while(count<M-1)- H! ^# L. X8 D1 k/ |" e& Q
{i=0;
( {2 g. @# A0 ]; ewhile(i!=3)# e7 x, s% o* Y* P) s0 A
{ h=link[h].nextp;0 l( H8 E' Z0 M, s, ^9 n* w
if(link[h].number)
' | G; @/ q5 Z$ L i++;} ^8 u) H H y$ {0 Q8 \ V% Y' R) ~# o
% \% h& K! [8 ]/ p1 b
printf("%4d",link[h].number);0 m; _8 f- m) ]
link[h].number=0;$ ~. V( T3 W* h1 }2 O! U
count++;7 Y( U8 [5 b0 j4 Q+ W/ o
}
( s+ U2 L2 u/ b! j7 u* F, h* `
+ @# n2 Z: W0 W# F0 L8 aprintf("\n大王是:");* Q5 O8 f$ a! _4 K1 x# n
for(i=1;i<=M;i++)
3 a! d6 N; D3 r0 k; a% N if(link[i].number); Z* X+ \+ j+ O$ A" G
printf("%3d\n",link[i].number);& F) q3 |% o: ~! ?$ G
) b1 r! m1 l* @- ?" m+ a8 R t* Q; n5 q4 A8 t% w5 ?, m
}
; ~8 a& o+ f, G5 L" F3 E* C' l) q7 E第三种是普通方法for循环
" L0 O2 Y- Z3 v' N2 z. v#include<stdio.h>
3 h, w4 G3 u+ ], e$ Fvoid main()
, E5 A4 b/ t( X$ J! L{ int i,k,m,n,num[50],q,*p;
7 Z) N) ^! p) u8 d clrscr();5 n' E% x) u8 m; ^# W( I
printf("input number of person: n=");
0 u4 r+ R' x" i scanf("%d",&n);9 e; e M2 I) d `
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只+ w* ]9 G8 k+ I0 c8 X
scanf("%d",&q);4 E( h) \1 Y$ B: c) E) f
p=num;- {0 ]2 p. r: _
for(i=0;i<n;i++)
; P; Y) p f, S *(p+i)=i+1;" P# G3 V* y1 A* [ E+ |
i=0;
$ Z% C: X; k: K' @2 H k=0;: r- y/ _* b+ h! l: U
m=0;
. I% ]8 y# f2 h! u% P$ | while(m<n-1)
7 y6 A' p* O$ h' P j- t {if(*(p+i)!=0) k++;$ b) C% I Z+ Y
if(k==q)
r# Q2 h+ I1 a% ^# H: { { *(p+i)=0;0 @: t% G- O9 l# c) k% l' I" X
k=0;
9 O& M, p, n/ O% m* L5 x' l m++;4 W. {3 u" x% W" \5 v
}+ E6 j& F. v) ]3 D9 k
i++;
+ D) K8 Z) a0 } if(i==n)i=0;
$ R1 d: m8 Z2 H/ u0 x# |9 B" [! R }2 M2 H* p- O: m/ j5 ^3 h3 V
while(*p==0)p++;- V* Z; U8 B n
printf("The last one is NO:%d\n",*p);
9 I V- u; ?8 H% a1 @' z {0 ] V getch();
( _- f8 K0 C( e, ^. ?( r9 G v: _, g% |( p/ c3 A- p
} |
|