|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
) y4 T+ U0 W7 u& v" F; b这几天我在忙着编一个问题,我用了一种方法编出来!
- H3 ?8 c) [' g! P但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
* y: t1 b3 @/ }( Q注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
- ]- {4 c! q1 z7 I- z$ Q* m4 Z" E( ?& G* b5 \. Q: ], f& k9 T9 R
$ R0 I8 t) c9 G$ u) D3 Q 题目
% `# i# }3 i5 R, q$ l# U' t山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
7 M6 Y$ n- \2 f/ C% E- y* U第一种方法:利用循环链表
5 f7 r) X7 E; j#include<stdio.h>
* N5 S" g W. ]#include<malloc.h>8 g. E# [% E% g) J: y3 B
#define M 8 //共有8只猴子
! F9 z2 X3 S g5 V" B9 U$ d#define N 3 //数到3只时退出第三只
! X O4 _9 h! V: ^9 ]+ Gtypedef struct monkey
+ V5 m: c& c9 L3 R9 c$ a{int number;
0 m5 r7 z; b; L+ R1 d( S7 {int flag;5 o6 l1 n! b6 F- |' e* O3 L t
struct monkey* next;
9 \( E8 Q' |4 g1 W: N% I}MONKEY;
# u9 Q; O/ I5 T+ Fmain() @0 |4 s# Z- h- t/ u
{ MONKEY *head=NULL,*p,*s;
8 c5 Z9 J/ D- x# k4 E int i,sum=0,count=0;! _8 W+ P/ E7 J
clrscr(); //清屏* Z1 }, ^! K$ |$ T' S
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
/ `( I" Q! c$ B7 b4 c p->number=1;p->flag=1;: j! S! ~- _& L/ _ x
p->next=head;
5 B4 i. O0 p9 w4 V1 Q' q head=p;8 Q, N+ }& n5 Q4 V# o( O
for(i=2;i<=M;i++)" O. v g7 |2 ~2 @
{ s=(MONKEY *)malloc(sizeof(MONKEY));
0 F' m- h4 z( o5 J, W s->number=i;s->flag=1;' W; S0 l4 D* P1 c% l( p
s->next=head;
; f0 [6 B, h+ v p->next=s;p=p->next;
2 P: }/ \5 G" U* f6 p }
/ `3 h1 |! h: A p=head;9 [4 [8 o9 V0 a; |. [
for(;;)
) N! }2 L; m- }9 B7 v. p" } {if(p->flag==1)
' Q: X9 i# \; Y' b" t count++;
( k; l- b+ i& h if(count==N)" p3 @; ?8 @$ f+ H) u9 q
{p->flag=0;
, |9 K5 R. C- N* ^) m& ~% w' u1 } count=0;
/ c) D: B. b* o) V1 S sum++;}
. J, S' d0 u! W+ S) _" n9 d# O; |8 U, \ if(sum==M-1): b5 i+ e" i" {2 z
break;
7 f/ c: b6 t: C$ U4 Z) o3 R/ y p=p->next;
% ~6 g/ c" V, o9 G: C2 R }
7 U/ n1 [+ s& C P6 _6 r p=; e6 W- p/ v5 Q# @) }
head;3 `5 D. ]7 z$ ~) g2 b' E" W3 a
for(i=1;i<=M;i++)
" [) W) J3 B3 i { if(p->flag==1)0 F7 T9 v: j" _6 ]: m, u$ ~1 F
printf("\t%d",p->number);' @% b/ V8 ] @! ]3 \/ C! n
p=p->next;1 J+ [/ x, F! j# m- o. U
}# j5 [5 ] | g0 x& W0 l1 y4 }
3 o) N8 u, l; }& ^* t% }; {& `7 I, }$ T* L3 ]: m! O$ U. N5 g
3 L% I- G& [! N3 p5 G5 e
}
8 F, @1 m5 ~2 l' W2 i第二种方法:数组0 z2 ` t; `3 s L8 S2 V3 Y' r5 U2 o# F
#include<stdio.h>8 u0 S& t1 X2 U5 C& }, r
#define M 8
9 P6 t6 m- W! t) X! d; xstruct monkey& W5 f) P; l1 j( O
{int number;
+ h& x; c5 x4 Y7 O5 M; V9 Z, u5 ~int nextp;& S( C3 P, n g
}link[M+1];
8 b8 F: u% S* @+ Z
+ L# J8 ?8 H8 qvoid main()
( D# l, o- t( j+ x8 [/ i1 W{int i,count,h;8 v4 R. I. C0 W s5 h
for(i=1;i<=M;i++)
0 N! \7 p0 H/ Q{ if(i==M); p+ c& L3 d) |( F4 _3 s& x
link[i].nextp=1;! d: C, v) p4 A- ^& f7 U7 p# r4 ?0 c
else
4 Q& v8 P9 `- D5 i link[i].nextp=i+1;
7 Q7 t2 p) R9 f9 j6 O) a link[i].number=i;
h% O! u% B* ^3 s}
+ ]7 h1 S' j* L# D9 g! g6 H! eprintf("\n");
, Y3 {4 `9 a' P+ y, y" Acount=0;" V6 `8 p3 V' s; _
h=M;
1 n3 a6 {* Z& E9 Y- ^' pprintf("依次退出的猴子: \n");0 p" g H+ @' ^7 [5 H9 u
while(count<M-1): \/ i4 Z8 i; w9 U$ u* O: B+ b
{i=0;% z' ]% d5 l: v ]
while(i!=3). P) R3 j8 q" o3 D$ _& f ?
{ h=link[h].nextp;/ ?8 P* Z7 L) e, ? _
if(link[h].number)* O" A$ c! ?1 Z( ^# I
i++;}
1 R( F) c9 N5 T+ K' w3 u; [
" B" ?1 }# H2 b1 Z5 wprintf("%4d",link[h].number);- K/ H; H$ d s. N
link[h].number=0;
0 o8 H+ T! m0 e7 }0 W/ ^+ rcount++;4 H* y$ o _0 [- [# z' w% N# d
}
9 n& J. M1 J9 H7 h, [* a
# ]& [! q- {. bprintf("\n大王是:");
' v" P0 k2 }5 _+ J& N) ^8 g% Z& n for(i=1;i<=M;i++)
5 e4 g% p2 p6 o. B6 Z5 T if(link[i].number)( t% M+ ^8 {0 ?' g6 b1 j
printf("%3d\n",link[i].number);
A4 x' O) M; f9 x( j1 ~; k
6 W. o& H- r5 V& B' F1 @5 F9 Z# @- a8 {
}
% w( `) j6 k+ f第三种是普通方法for循环# m/ f/ J" |* [( d- n
#include<stdio.h>/ S/ O4 O8 W% o K& `5 e+ w
void main()
" Z% q3 P4 w$ ~, s6 h{ int i,k,m,n,num[50],q,*p;
& m2 P. s8 G' v- ]# X5 n0 Q clrscr();
9 z. n6 Z3 L+ z printf("input number of person: n=");) [# i, d. \. u, ?) z$ O
scanf("%d",&n);
$ Z7 x6 ]7 o; y. N9 s8 [; Hprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
% M9 F2 t8 V, D N0 S scanf("%d",&q);: J1 d8 D6 t# C4 k$ b2 Z( j6 j* x
p=num;
0 ~, a' ^% g, Z/ ^ for(i=0;i<n;i++)
8 }! E2 c9 e0 p *(p+i)=i+1;$ w0 ?/ q7 ~* Z$ T: V
i=0;8 p, X2 F3 H' ~9 E2 w
k=0;
; b6 L) M2 o6 f8 ~ m=0;- P* a. X- H, Q5 k# X4 V6 D0 b
while(m<n-1) Y- j5 x6 g+ {- H
{if(*(p+i)!=0) k++;' C" c# y( y7 j. K+ U6 `; U5 ^5 e2 @
if(k==q)
1 u5 g1 Y7 k7 P6 m, z: H { *(p+i)=0;% F! ^$ Y6 @* p9 j$ t/ O3 {# |
k=0;1 u* ^+ ~0 z$ f- ?3 J8 W
m++;
$ ~) q5 V1 o! d) e: h+ v; X }" U, M! _2 n% B$ G$ x. m6 @
i++;
6 C0 i& w3 `9 c4 t ?! h) Y if(i==n)i=0;# L" j9 ^( V6 c6 i
}
! ~8 A; u3 n3 N- o' t while(*p==0)p++;
& @/ S3 y5 @6 v; ?% L& F8 J printf("The last one is NO:%d\n",*p);
6 l8 [) v! T: m2 f% |+ V' p6 g- I5 j getch();) d! E/ C% {' L, z2 ]" f6 _+ P# V$ S
$ j! b3 w1 B. g, `; N' }+ {
} |
|