|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
, M3 [6 t; t9 g7 f这几天我在忙着编一个问题,我用了一种方法编出来!* s- g7 C$ ^2 b& J' S: G1 k, E
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!! `, ]* j7 M; }, \1 r# g
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
9 K' b9 \8 m; O/ v/ Y- y
6 ^& t7 |8 F% y3 Y
, Z* g. Q$ A+ y8 W& C9 ^8 R( s1 i 题目. d" _) {% d' _. E! a! `
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
; Q7 p5 o; o3 a0 A T* L& M第一种方法:利用循环链表
1 L' U% r7 M4 t9 ^% }#include<stdio.h>
% M5 ~# {: C P6 I9 G) d#include<malloc.h>
7 n- D- F) F$ S' X7 o; m#define M 8 //共有8只猴子& A/ K# V2 r. f2 F5 E
#define N 3 //数到3只时退出第三只
5 `( a; a& p% |1 v' J1 |typedef struct monkey- X; C8 [# r5 N9 Z+ X' |
{int number;
+ G Q8 U, G$ ~% c. ]( j Nint flag;& z9 Z8 x' r" h; t/ _9 J" e
struct monkey* next;2 c* X1 a2 f5 T' |/ g2 }! a
}MONKEY;; r5 B* W; \' \5 G* Z2 [
main()
& {8 V5 e+ i! ?8 ]: B" r{ MONKEY *head=NULL,*p,*s;
+ x3 Z% q3 d/ ?# H6 J5 R6 K$ z, D& k int i,sum=0,count=0;
# U7 U: e. Q9 R clrscr(); //清屏
L, e- L# U6 P0 D, @% |7 k$ a p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存3 I+ G" U* s) g
p->number=1;p->flag=1;* i$ M! k/ b! V1 B7 O
p->next=head;
4 d$ ]* q- H$ I3 X2 h2 p% n) T$ S head=p;% h" J* _" f5 X7 v
for(i=2;i<=M;i++); K6 y' J. g. u/ K7 A
{ s=(MONKEY *)malloc(sizeof(MONKEY));6 p$ Y% T) z4 S* B9 k c. s' Y
s->number=i;s->flag=1;
9 D' K) F. H) n s->next=head;
0 g1 f2 f, s- ?; E6 E/ d9 Y8 K2 U p->next=s;p=p->next;
8 M7 d( H& a% f2 j- ?0 S }
6 o/ x. G, s3 I$ v$ R- c, a7 x1 U" P p=head;
6 Y2 x& z. d4 d k! L7 S+ w for(;;)
* H4 A W' ~* S8 S( K {if(p->flag==1)
6 p: ^. ~' H9 ^- \ count++;
& Q3 |2 A4 y, f& @; ^; @ if(count==N)
6 s, D4 V' _9 G9 u' B {p->flag=0;/ f, g- J' l( E% t
count=0;1 i. P& G& d: p! D& L6 S3 U
sum++;}) v- M- [8 J% c9 \- t
if(sum==M-1)
+ X, m9 T4 x* B break;+ o! V! ]. v% d+ ?& ?" w U. h
p=p->next;
`, C$ ] z. s$ T, D) S0 B2 d }: ~( p* L: N& C$ J. l
p=& T7 d7 v; b5 y2 e N
head;
# j e. u/ l3 }: X: x S/ ~ for(i=1;i<=M;i++)2 J0 o e$ c' Y6 y
{ if(p->flag==1)
9 b: d0 g# E( p6 p2 b6 d: v2 x' G' a printf("\t%d",p->number);
( Z! d5 P% v9 }5 V. v, T p=p->next;" i. O' l* K' P& f( f
}
W* k% A) m' E3 Y' K4 |
. Z" V2 b" p, h. o2 r! r8 w. Y- U x4 ?+ h" r
9 y. D( R+ D) d' d# A: z: o
}
; `7 J! l/ }: o% F' F: N Z. P6 E* X第二种方法:数组% Q5 t/ u) o& h/ f: S+ P3 @
#include<stdio.h># G% s: t% g; l( j$ ?$ e
#define M 8% ?$ n' u# Q8 H2 N3 {% j7 F$ s
struct monkey6 S9 e- s3 H+ M) s
{int number;
4 d8 g1 w0 t. ~0 K" w4 G5 dint nextp;( u8 t4 v9 b$ v% [* b
}link[M+1];' f# ~% k* A0 ^4 D+ Y& ?
3 [$ C1 n7 i9 S! r8 {5 C5 Ivoid main()( ^7 O. H0 R1 v9 [
{int i,count,h;
% W) q/ ~: v: _# i! T! U) [0 gfor(i=1;i<=M;i++)7 v$ C; ?' G6 b$ D
{ if(i==M)
! X q( y6 |' D8 Q4 M; h9 G0 {: M link[i].nextp=1;
8 B: \. z6 e/ P' V else
1 w9 r+ e: ^6 c7 H link[i].nextp=i+1;
+ x7 l* R0 x. ~7 p7 c! y3 `3 ? link[i].number=i;
1 z+ ]9 E7 m( g! t}
. ?3 d# U% T' Q& N) \; }printf("\n");
7 K2 z4 x4 x! m6 s/ R. t$ ycount=0;9 Q8 C1 f2 @- }6 T3 i* I
h=M; ~) t' F( b6 l; T
printf("依次退出的猴子: \n");/ J( {" m. D3 |- C
while(count<M-1)
. n u6 Z+ F9 x c# O{i=0;. F! I& z4 S6 p+ {+ w+ H
while(i!=3)* N0 _& v. C9 Z5 V
{ h=link[h].nextp;
/ Z. I f) `0 U: k% S% W0 K if(link[h].number), Q& |+ w& U" z' B' S1 @
i++;}
& P* D& m! C5 m# k
+ W" b, b- v4 x7 f3 q+ v) Z3 yprintf("%4d",link[h].number);( Y/ [9 A4 \2 R
link[h].number=0; r$ R' s4 Z% X' \
count++;; V2 F* E0 Q [6 I, w
}
4 G6 H- m7 b G/ X/ ^2 S! t$ k
* |% v6 n# q2 l; e8 X1 q/ fprintf("\n大王是:");7 C9 G: [/ I0 T& V
for(i=1;i<=M;i++)
/ H5 v. E) O( m. P0 x8 g7 ~5 g if(link[i].number)3 }" U3 Z. B9 t' I! |
printf("%3d\n",link[i].number);
* | F `: w+ d5 V9 |
4 k2 m* D0 R% K7 y! O, Y3 a) e$ ?+ {* c+ N, I
}
( b! \$ N4 j- @& H' L$ C2 P& r' K第三种是普通方法for循环- ]5 X4 \3 F& v* u
#include<stdio.h>8 G7 r0 C, i" V$ }
void main()
7 T$ p+ d v% [# I: ]{ int i,k,m,n,num[50],q,*p;: p( b& u! l _* {
clrscr();* B7 o* f; v$ `+ W
printf("input number of person: n=");
6 p* E" A8 b- }4 m# K, P" L scanf("%d",&n);+ Y/ e3 A; O/ n( r2 c
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只4 b7 l- d2 z/ Z6 [; i) c
scanf("%d",&q);
# b+ g6 K w; }- Y$ r# b! W p=num;1 a4 c3 E& q! G2 k U1 @
for(i=0;i<n;i++)+ H: n5 [0 M( |6 \) @1 }' i e
*(p+i)=i+1;
8 {( h2 h* _3 P, e" Q& G i=0;
f1 I# |$ s+ O% n- V1 d k=0;& A- p T i8 Y: S: ? x* A
m=0;- g0 c' H5 j3 E0 M
while(m<n-1)
0 C$ h9 I* H8 m {if(*(p+i)!=0) k++;
, w# x3 X0 d: S M if(k==q)7 f/ b; R. t7 W) \- l
{ *(p+i)=0;
0 E, O: z5 M& z) d1 m8 d k=0;) S) d! V( _# X$ G$ I- z* t
m++;
3 E6 L6 r) l5 H" N, Z; G }
$ M: }# t9 [. G2 m& h i++;
+ G$ R4 t8 N+ M7 z if(i==n)i=0;
0 Z. ^4 {; Q% O, y1 U }
7 m8 ^2 t% ]/ m$ T& q! S while(*p==0)p++;
4 o* L# E) L8 P# m printf("The last one is NO:%d\n",*p);: {: I% k0 _; Q( m, a
getch();
/ p p6 |) c# |9 T F4 y" s- S# Y9 [2 P6 @, c# ]
} |
|