|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
; g% S7 U# V0 W) U+ s这几天我在忙着编一个问题,我用了一种方法编出来!% l" }& M, u" K5 W N2 M8 j
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
2 N# u. X$ n$ Q# U, L! P, [注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
# D# u. |8 ?( L. m6 p1 s/ P0 ]& j8 R; u: e- m
% c' c) N: V! [" e, f0 \ 题目
, v; C z6 ^0 R q- o$ _山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
# [& f$ P% L/ A2 Q第一种方法:利用循环链表
. u* M. h- Q( B( ~1 K/ M8 N#include<stdio.h>) I7 v- `# ~* D' ^8 ]! g( g
#include<malloc.h>
6 m& ]; c7 t8 {+ T6 U3 q, p#define M 8 //共有8只猴子% f' s* d/ }& W4 g+ n$ P
#define N 3 //数到3只时退出第三只3 O9 m' ~# Q' V5 j, S5 _
typedef struct monkey
! k& ]+ I( H7 e X0 ?$ e7 V3 b t/ `{int number;9 v) s' M% C3 e: ? c3 p' [
int flag;
. {' @5 C" Z5 X3 v8 x! n- Jstruct monkey* next; ^# X3 k$ l2 h
}MONKEY;
7 c- t, x$ H9 c# l3 U8 f; qmain()
# U8 l) T7 X& N3 B) O8 B4 {' s{ MONKEY *head=NULL,*p,*s;
6 i9 g: d! l" m: r& o1 B' { int i,sum=0,count=0;+ G4 m3 P: X* ?
clrscr(); //清屏
3 a) ]' P0 L7 T9 | p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
& t4 g, `+ h/ M- }3 z% ~ p->number=1;p->flag=1;
/ E& X7 B& d2 H6 Q* I0 n3 b2 v& ~ p->next=head;0 y* d) a4 J" E. s- Y
head=p;' s5 o8 k5 x6 O; Q, g
for(i=2;i<=M;i++)
* D5 n' R: R' E3 V- \ { s=(MONKEY *)malloc(sizeof(MONKEY));
( w4 ]5 A" n. j/ L0 F s->number=i;s->flag=1;1 U9 g7 G/ J0 o3 [1 p3 W* r: `
s->next=head;/ a9 z, i* \- [% W
p->next=s;p=p->next;5 y$ C# V0 k8 i1 ~7 d7 c% T2 X0 Q
}
9 `& ^, K! B/ [$ ^: }! { p=head;3 i, D8 a( `$ S/ b' p
for(;;)
* f3 Y$ O1 C$ G9 e0 ?$ K* H5 w {if(p->flag==1)
' t, ?- B3 A7 I' [' R count++;
5 P% m# \) T8 D. f! c: q+ p+ D0 U if(count==N)
, [6 y d5 s- Q; M {p->flag=0;
$ u- @# e: V4 H- x" z( }0 Y% L) b count=0;* H! m9 I/ V/ h
sum++;}4 S7 k# g8 @' ?# X4 {( ~, w1 Q
if(sum==M-1)/ B+ i* }4 m* Z, B$ ?
break;
# u4 G/ n" Q e8 `; `0 m p=p->next;. i$ ~0 M( {9 d" x( ]' W* x
}( e6 C9 i; z; p
p=, ]: o5 t! U) m; t
head;5 h4 g" C: Q3 {1 W$ G$ _
for(i=1;i<=M;i++)' T9 q+ p+ K/ z% V& l4 f
{ if(p->flag==1)
4 c& Z, a7 G! Q8 w printf("\t%d",p->number);' O: R8 \: ?& |& {* ~
p=p->next;8 w/ M+ r0 ~1 w
}
6 u& j! G, J& W+ q; y ~" `
* a/ `" x) F" m( B O
) j2 _% P- s- q* X7 l) g2 V
% V3 U5 E1 T) r! L' {) X' w}
. |: y0 j9 N, Z2 L7 |$ `8 G第二种方法:数组
9 O8 L' C# s) R( o1 W#include<stdio.h>
7 `; _3 M: e1 u#define M 8
& ^- o3 n& h* g5 I; qstruct monkey
4 i- V& ` o4 {* X4 a9 q{int number;; X2 n/ F, r3 b# L4 O9 t# z
int nextp;
- d( K, p. x+ y7 j) _/ X}link[M+1];
" E; Y6 s) f9 A7 y `8 q
- Z* g# M. G8 _void main()* a3 T' x; m0 x4 i! X, u; J2 U- \
{int i,count,h;4 {$ u' G, U# x$ G
for(i=1;i<=M;i++), X3 Z4 t$ J$ f" d1 J
{ if(i==M)- {9 A% y; G; m
link[i].nextp=1;' x t) v% [! J# V4 O" g* n* D
else
2 |- X# q! J+ S$ g2 k2 \ link[i].nextp=i+1;
9 K# L& W6 m% G) w! q4 m3 f$ T link[i].number=i;5 f j* u$ o8 x& f! E2 K- D, X; h
}1 o8 X% e0 V- x' B8 P& I4 B
printf("\n");
! S+ a% N# Z; C2 b/ Pcount=0;: G/ w7 @ t$ B1 t; `" ^3 A
h=M;0 Y' ?' g- x2 \9 f
printf("依次退出的猴子: \n");
- M( W( }6 s9 b6 L2 C4 hwhile(count<M-1)
. e; U3 I9 d' {# H% d6 V+ o{i=0;
6 u9 r' Q0 p8 h% p. `, S4 `# z( Hwhile(i!=3)# S* ], q! b# L) W$ Y
{ h=link[h].nextp;: J- F- T4 w- q' G
if(link[h].number)
1 N* [" V/ Y, @5 V& o8 p i++;}3 @* ` h4 b$ C7 o5 v5 N9 p/ Z7 ]
1 k8 b4 j( J& \" _, ~
printf("%4d",link[h].number);1 r6 @- k5 j) o$ D
link[h].number=0;
8 q, |, B6 E' ^6 m# @5 Ecount++;% l8 h. A: R ?( Q* [9 N8 Z8 Z$ S
} E0 f& a; T+ q$ u
/ q6 g S2 C3 u: B, n2 o! k
printf("\n大王是:");+ v* ?/ w4 [6 C: d
for(i=1;i<=M;i++)
! ^4 f4 y3 X& Q3 z if(link[i].number)
2 ?* x0 E/ u. {* X. J' q printf("%3d\n",link[i].number);
: Q# A8 R/ n5 T5 @8 m0 _% o% M3 g& f, x6 Q; H% d
* b6 K! E2 u% e/ e# p* Y: f- z$ ]} + ]! N& z, R' a$ A0 s
第三种是普通方法for循环! X5 g% S, A5 _ L
#include<stdio.h>3 J0 X" b8 J# c7 e+ @3 d% x
void main()" b. c& G; F1 w
{ int i,k,m,n,num[50],q,*p;
9 g" J. ]0 H2 r3 Y clrscr();
4 M& q4 }" O4 r2 k b. J- S printf("input number of person: n=");4 k/ t; z) l9 |& G9 ~# Q _# d0 S
scanf("%d",&n);! a, p: r+ X1 k$ b* P
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只4 m# \# a# Q; c: q
scanf("%d",&q);/ e3 `7 C0 k; t& K* y
p=num;
/ Z! j3 H$ K0 G" t for(i=0;i<n;i++)! g: ~: w: Y5 [
*(p+i)=i+1;7 p& ?# \) O5 }% |: @; G
i=0;3 q9 y' h8 E6 u- [
k=0;
5 j. v; X6 X8 L6 f5 y; ?+ Z4 R1 a m=0;
2 }6 [0 M, e% z+ @ while(m<n-1)
' ?8 {7 U, K" O* f% d* \ {if(*(p+i)!=0) k++;/ O. ~7 ~/ \; Q9 [! o; y
if(k==q)( A! Q d5 f1 l8 T1 ^
{ *(p+i)=0;
# X9 U+ O/ y/ j9 x k=0;# D7 E+ B, A; v$ ]' _0 ]/ {
m++;$ V9 y( N9 E. B- O9 W' y
}
3 L1 P; N; P. ~9 }) W- \9 X i++;. z c1 n- u$ b5 N
if(i==n)i=0;$ u* ?% r0 O5 t9 u; i
}; O: i% R: @5 i- Q" X; S
while(*p==0)p++;( b& M# e: y; X
printf("The last one is NO:%d\n",*p);4 l+ E" `- e. Q& \
getch();. W1 \; I# ~3 `8 D8 a3 j1 S7 U6 J
8 t( X& m( L' g( |; y
} |
|