|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
* z$ `6 [: n, n1 d/ [ N这几天我在忙着编一个问题,我用了一种方法编出来!
# D- w( v1 P7 a M! z- q$ P- H但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!7 C% ^: h0 k- @& G0 t
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 & o2 r" }- W9 `6 j! a
9 R! x* G; x& Y" R+ m
/ Y8 w" r2 [8 T1 T) I
题目
, q/ o& J5 d& K' E5 B3 U5 I山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。5 T7 ?! W% `& I. A/ l
第一种方法:利用循环链表
/ M8 J, e6 z+ }# V#include<stdio.h>
6 `8 O3 u0 D5 D4 Q% B& c#include<malloc.h>. p. Z! s# `2 s. I, A# y
#define M 8 //共有8只猴子 r9 N" s- `1 u& v* [+ x
#define N 3 //数到3只时退出第三只1 R. j8 E( ?' l3 f0 n
typedef struct monkey' Z, n3 ]/ a$ h0 o( c
{int number;
' U. J* Q B/ H g8 U1 v, h. Hint flag;" J, s; e" Y+ |4 s3 h! o' \! F$ _
struct monkey* next;
$ l8 _& }1 J' j}MONKEY;# u7 W0 D3 W, j t, E* `3 U7 a
main() j$ `0 p8 o, t4 c( k8 l( D+ E0 P! m
{ MONKEY *head=NULL,*p,*s;* j7 v( ~; @0 l: h- d7 k; z( ^+ _
int i,sum=0,count=0;
0 r$ A* g2 I* e. U/ F clrscr(); //清屏+ [: S; p) X6 u! {
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
9 b' n7 ^. p0 O& }% ~" p$ s' y p->number=1;p->flag=1;
' x$ C' \" f0 X- q& x; E! u p->next=head;
% l! o& F; \4 Q* C2 `9 b* k' M head=p;
, j( W1 G- b: m: q! z$ b% Q$ k" y for(i=2;i<=M;i++)$ v% q& V) E/ [( Y
{ s=(MONKEY *)malloc(sizeof(MONKEY));
) Y! u/ ?3 D' a s->number=i;s->flag=1;7 F$ P, N1 c3 t4 U
s->next=head;
2 S1 N8 d- D; i3 } p->next=s;p=p->next;
% n7 M: ~0 q6 q4 @& v }! [0 V1 j, M& [5 P% w0 b
p=head;
) ?. n0 t6 C% ~; v, G for(;;)
' @% Y) p+ @: K+ e {if(p->flag==1)8 V* H7 N7 Q* z; E
count++;% l! V1 a# I* L' M+ c, R
if(count==N)
2 f* c; m! d0 c0 G1 O+ y {p->flag=0;/ b7 }/ N/ |- u* k9 V, H! x
count=0;
- V, c* V' g+ P* |4 z sum++;}1 e4 v) |& J) G. o+ p2 R% x
if(sum==M-1)* P2 f! `. `0 s' [( m
break;: G' m/ {3 s+ s2 y8 B# x
p=p->next;) m9 I8 O) V9 C6 x' J
}
8 W* u+ @4 c( |; y& \3 F p=+ q* Z4 ]6 L$ j5 G3 \
head;% X! F9 {) Z, H/ X# ?0 C
for(i=1;i<=M;i++)
' t. o0 x$ S4 `# [, L { if(p->flag==1), k# b0 S, z2 ~, i, @7 ~! J v
printf("\t%d",p->number);
' r3 c8 k9 y) C) n: i% C p=p->next;
: {) C4 I& m, n. b% K }, I. E6 k( V6 d7 K5 j. [
2 ?5 `' I: k- x& N( C8 z
6 y. ]* o, P$ e) X; o& ^2 r' N2 p1 U" i; j
}
$ K) _" _# U- \# b第二种方法:数组
2 `" Z8 T3 p# D" T2 M#include<stdio.h>
+ t) W* V1 Y5 u \# k#define M 8 c& ~9 J( N: ]6 ^( P& r
struct monkey' y- N1 j5 {9 ]# e" y
{int number;1 x) ]$ y# Z' ^7 t
int nextp;. s O% K5 @8 K) L. S+ c) f
}link[M+1];9 T& z! @+ T ^; |4 U
' N' Y8 n: q! \9 v( {8 evoid main()
7 f& B9 n3 C1 P& D+ R{int i,count,h;
$ T! h* R. n/ o* u. cfor(i=1;i<=M;i++)
8 @* L: @, {7 J" i) S4 }{ if(i==M)
: _8 Z: u( X; N! ^9 B link[i].nextp=1;( d) Y y3 s" Z8 T! T
else+ w0 t8 V, U: t9 x E" @ p" I0 Z
link[i].nextp=i+1;, R' A) n# M# n2 t: S& i2 _
link[i].number=i;
( s; [( ]& u4 Z6 u7 I( X" z}# V |5 y g: |0 S0 X# h" _9 G* ^
printf("\n");+ t3 I& P) T4 t) D) B
count=0;$ c) d/ X- X! `/ E
h=M;1 J5 e' v$ f2 y$ w. M$ x5 T7 G
printf("依次退出的猴子: \n");% M6 o- o/ O0 e$ U" r+ `
while(count<M-1)2 }2 s1 S E. v8 G8 g2 o4 _+ E% v7 e/ R
{i=0;
2 u" d$ A/ W1 L/ Y5 Kwhile(i!=3)- t. Z: O) l' N8 b* V, l' t9 q
{ h=link[h].nextp;
) V) C# {( M) \, K3 K- x: d if(link[h].number) ~2 n; W' q4 q% O0 S
i++;}: Y" u5 [% i! _+ V7 U% H/ G0 [ o$ c9 T
' p* a7 k1 y& G1 Kprintf("%4d",link[h].number);3 W2 p9 l6 z) x! l5 E/ H3 v, Z7 I
link[h].number=0;
5 {0 o. k, N" k$ t/ q: {7 lcount++;
& K D! x5 D+ h0 T}" x' M9 i/ X+ a3 s# G
7 x C) L0 F+ \# ]7 K: o
printf("\n大王是:");$ F7 |2 @" Y( A0 L$ T/ L
for(i=1;i<=M;i++)
2 `4 {: ]# g0 _5 f4 K. W7 ^/ Q if(link[i].number)( d7 O) x. r, s' f+ Q( m
printf("%3d\n",link[i].number);
9 K7 Y1 \" _+ Z9 B* L) Q8 E) `& W' b! |
5 _' {. A/ l3 P5 {& c# O0 g} / S6 \" d6 u$ R$ W1 v
第三种是普通方法for循环
6 h, Z& a' E7 W# C X! z#include<stdio.h>/ D/ A# p p+ B- o
void main()
4 T2 W5 d9 d4 N2 B{ int i,k,m,n,num[50],q,*p;
' q8 d: k. x% b( m clrscr();) \. Y5 @; J, X- T5 g) j& K, |
printf("input number of person: n=");5 D6 O# P( }( u" T( E! h. `$ t
scanf("%d",&n);
. x$ O0 i# N1 r5 ~' K5 n: Yprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
% L! O5 S) s# ]- |4 u l: V" L x+ a scanf("%d",&q);+ a9 A! ^; w- p1 x8 Z7 P
p=num;+ K9 N7 d1 }0 d# p+ H7 J, j
for(i=0;i<n;i++)
; g7 u M/ a- ]6 N- B *(p+i)=i+1;7 G; G; K `: Z. _' l8 E
i=0;
; K c( X0 K1 o6 ~ k=0;
& K4 t* U0 ]1 V" Y& M& K m=0;' I7 W7 z/ P/ y7 W. h1 [5 ]
while(m<n-1)
/ _/ o- c' I; {+ {8 z {if(*(p+i)!=0) k++;
" ?5 l; e {/ T; ?4 L if(k==q): J7 g3 z F. R7 g
{ *(p+i)=0;! W5 x, j7 l$ x+ j: K
k=0;
1 @& N. X# Y- q. I/ r m++;# a: z# x8 R2 M8 u" b/ U- g# p ^6 d# h/ v
}- v& L; Y# Q: r# c9 ?7 Y. n# k
i++;+ ?! R* u p/ W5 v4 A' S
if(i==n)i=0;
8 \8 ?0 p' r8 }+ f0 P }, G0 j2 I& }; H1 S- r$ a
while(*p==0)p++;
# y2 i5 {+ c' B# t" K/ K printf("The last one is NO:%d\n",*p);
( k: X) B) N. D6 N/ Q* }/ B getch();
) j9 C, I8 u( Y, k5 P1 }5 b7 w( `% ?: O6 a/ c, V# g
} |
|