|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!3 h# B9 v1 L( e; ?" h
这几天我在忙着编一个问题,我用了一种方法编出来!
3 w P# z9 M! D; q; r- h0 O, a' C但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!1 n9 o1 G2 B1 _& A8 F/ R7 n
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ; L2 _$ l$ `. |( O) o
- V9 i. t6 H5 _& x/ a3 V
5 a/ [2 @/ B9 k( B' F; b 题目* T. \$ x# `) C
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
+ }7 o) ?+ O* N/ K" \# |7 Z第一种方法:利用循环链表5 x( [0 u; E- R Y! a% \
#include<stdio.h>
* B, L$ E3 \, h( V#include<malloc.h>
4 G9 n4 d: p2 o z#define M 8 //共有8只猴子4 Y* c6 M+ Q s& \$ Z9 `
#define N 3 //数到3只时退出第三只
- F& ~9 C6 m. K; M u4 `3 Htypedef struct monkey
. N# x J% C4 p+ K _( ^7 x' I: E{int number;1 o" M& a* o1 J
int flag;/ H7 P% q5 b- `7 @ p! V
struct monkey* next;. B5 t4 @; {1 h: r" G/ D
}MONKEY;
! w7 j1 i9 q z6 t+ U1 {3 A& S( S" `main()
0 @: S8 k' |+ G* T5 {: h- ^{ MONKEY *head=NULL,*p,*s;1 ]' q, q% G% _% X
int i,sum=0,count=0;
2 G$ Y8 m( @( z7 i clrscr(); //清屏
2 [( r, x* e; { p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
U3 {# T$ A2 |% `# H' [* q p->number=1;p->flag=1; J' v9 }: C$ p2 K
p->next=head;2 H- @3 f) b9 q3 K
head=p;
# d! p- H' x4 M1 h for(i=2;i<=M;i++)# f% l( w; R9 c' i) V8 @ [; S4 {
{ s=(MONKEY *)malloc(sizeof(MONKEY));0 R# M5 d( {( q1 ^, _+ P) {7 I" Z. f
s->number=i;s->flag=1;
C' n! [( R; `% U6 p5 e s->next=head;
6 n4 P6 s- D0 v& e* V2 V p->next=s;p=p->next;8 ?$ |# J3 ]# t
}
; i* v! b7 J b! V p=head;0 k7 w1 P8 O) Y* V# d, e6 L
for(;;)
$ e c( }# ]. \5 c% Q. Y$ W {if(p->flag==1)4 v5 B5 S/ I: D
count++;6 y0 f; L$ I, r
if(count==N)9 m/ T+ b! C6 n. Q( d7 Q
{p->flag=0;$ l& k+ V0 Z. T1 S7 w
count=0;8 P2 L: a1 h. o8 ^, \/ `
sum++;}( W4 d6 V$ B# a& h: N+ a1 x
if(sum==M-1), N" d" V# O9 l* ?: S. f) t
break;
5 ?: _9 u1 F5 ?. a9 Q p=p->next;+ t: b3 r" q+ [
}6 S$ ]. o7 V% [! f
p=$ m# S/ P5 C" U, p! E3 F
head;; Z/ O p$ V; c, C9 b4 K2 K" z) G
for(i=1;i<=M;i++)5 A5 \7 W: S0 X& l; H2 C
{ if(p->flag==1)9 H3 v( m8 q$ D6 L. n2 _
printf("\t%d",p->number);
( y- A: W3 p% d& m p=p->next;
1 k1 h" W: I2 T, c! g1 T( P }
9 Y( v# I2 E3 \& V; f% W7 d! h. G
; ^7 W4 P6 M* m' P3 U6 D) m$ m' v8 z, e Z! P/ L4 H( S" ?7 C0 n6 \
5 o/ G6 {, d& ^' S( A% h
}
/ J; p7 K d- y, T5 d& n第二种方法:数组
3 p$ D& Z7 n( l2 p#include<stdio.h>
8 C! i; t J' x& t8 A) [#define M 8+ ~: h) @$ V& w# [
struct monkey
/ r3 O8 e/ ^; {* [8 l6 ?{int number;
& X( K- N0 V0 B U6 {# g, u2 @3 H" Oint nextp;% u& e9 f$ B9 x0 E: A$ G r
}link[M+1];
3 [+ r+ }2 J# z7 c# O
- w1 k+ N5 G1 [% x4 n3 d. l! n* \void main()& u& J1 b" h* k: S. \" A" K
{int i,count,h;
+ P: |7 f+ j ^" k1 ufor(i=1;i<=M;i++)
/ R$ x; ]3 J. t' x3 H1 m' O+ H! f, F7 l{ if(i==M)9 e. f9 ]. ~; a
link[i].nextp=1;
: X2 N+ }( Y0 }5 m; } else
8 R( Z* d4 C7 @: d* y$ c! B link[i].nextp=i+1;
9 X" V; P2 A/ R7 n) F! b1 n1 P: e link[i].number=i;- e( q8 }& Y" @8 L2 \! i
}
6 {5 |+ b6 U7 s; Sprintf("\n");
# Q; k* h# g3 J9 K" g( }count=0;) R6 X8 C, _: {: e
h=M;- c0 v' t5 {8 q# ^* n9 q& y
printf("依次退出的猴子: \n");
; n# }* y1 e+ N6 d( s. u. @2 }; Swhile(count<M-1)+ A% _! }* n% A: d$ w4 C
{i=0;
( p2 s, Y1 i* s6 R% \; ?while(i!=3)
1 I4 L# x* v6 W, [' A6 b1 y{ h=link[h].nextp;" G$ G+ n& e5 {! c1 o
if(link[h].number)
( s- v8 S- ]+ ^0 T. p1 u A i++;}
) e& z: u7 m9 y3 J9 c9 {! x2 X" ~/ m, e8 U
printf("%4d",link[h].number);
$ f) s8 F* ]9 |1 f+ Y- w5 G) ^link[h].number=0;! L; c: |' P, p; U; v( H% Z
count++;2 y0 i* q' d% R* m
}8 e0 Q6 B% g9 v
% E2 N7 k) t9 A/ s" ]. g2 R4 z
printf("\n大王是:");
. v6 ], j' m3 v0 ?; b) J/ C for(i=1;i<=M;i++); H# F+ k* ?' p+ S
if(link[i].number)
; ~7 W* Q. c# m4 @ printf("%3d\n",link[i].number);
2 W2 S$ U& P1 S. t+ P ]: ^& Q% P9 Z. b, |7 t0 G! L) G3 _
9 T" r2 G5 b" f. v5 Z} % S6 ~ n2 J- z, ~, n# q
第三种是普通方法for循环8 n( j( X" Y+ l: h; s* a
#include<stdio.h>/ L) i9 V/ I2 r
void main(), Q1 C+ F& q. |( S( L. j6 Y
{ int i,k,m,n,num[50],q,*p;) p$ y! H( T: J
clrscr();/ [0 D; l& o' S" L. X
printf("input number of person: n=");# j! r- l0 K- d/ C" F) v6 x
scanf("%d",&n);
8 _$ s# U# M6 s4 S1 i5 Aprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只" A# ]5 p9 F# Q0 h1 k3 T4 o
scanf("%d",&q);
% S0 i" n. o' [3 I p=num;1 O! Q; b$ e! a; w
for(i=0;i<n;i++)7 }! r, o9 F' [
*(p+i)=i+1;# f# n' e- B" y- a7 w J9 g
i=0;4 T; |; w; c- \& i" |
k=0;% P# E; g, t4 w6 w8 h1 \
m=0;0 B, g8 t1 k1 k: s ^3 \, Q
while(m<n-1)
) [( `/ e) T: ]3 B* } L% m {if(*(p+i)!=0) k++;# g$ c. Q& a [7 @
if(k==q)
1 |/ b1 _# n4 m; t- z! T$ i { *(p+i)=0; C f! d0 `$ \2 M
k=0;: Y1 W3 a. B$ b" z! c* J
m++;
5 a$ ]( E- o" f5 c! u }
# \7 M/ `: M; z& l i++;
6 X. ~4 j& b9 h3 L) V if(i==n)i=0;
4 [$ V7 ^8 C5 M4 ~% y) N2 } }
6 E9 r! ~+ `2 B; k: Q- d2 F while(*p==0)p++;
/ ]4 I0 b$ r% j/ x. }3 q# n+ c$ w printf("The last one is NO:%d\n",*p);+ \/ J$ n# |5 V) K
getch();3 E: U- i4 d) S; H* k' C
6 _7 \6 Q% @( e& L, A# {} |
|