|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!- {0 c+ g4 G- ?7 @. p4 |6 U, u0 T
这几天我在忙着编一个问题,我用了一种方法编出来!; }6 a, L8 l( V1 V/ |
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
: E% Q4 K6 E. G2 @% J注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 9 _% q0 G, s0 l+ q
; U, D' G% ]! Q. j$ d& U$ {* ]1 j
& k7 U j. R& k' U! `$ N; N 题目/ j6 u; H7 Z, r$ P" m
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。! R, E* O8 s) ~- p7 T! y
第一种方法:利用循环链表) D" S' m1 D; h7 R7 a& c
#include<stdio.h>) v' `& U8 D' m l" y4 ^4 r
#include<malloc.h>
; t) c1 P% ?7 x7 o. |% ^#define M 8 //共有8只猴子
5 @8 q: d$ m$ [- c7 J#define N 3 //数到3只时退出第三只8 D# J! d- M$ ?0 {) O2 \ g$ [2 Z& B8 S
typedef struct monkey" z+ \" T3 r' g: ]3 j/ b
{int number;/ t) R2 L9 ]- a8 z6 w
int flag;& U! J6 a5 A, \' N' A: S7 q
struct monkey* next;
' k- Y: z7 D. w1 v( v}MONKEY;
4 p& ]7 z1 C& c) H+ Y- }3 ?% z j( @main()
' b9 \3 [. o8 d{ MONKEY *head=NULL,*p,*s;
- h. [4 q& F# o% m3 R2 p2 ~" Y int i,sum=0,count=0;
8 B" T5 B8 f8 F S6 o4 b3 c clrscr(); //清屏
) `, I0 _ F# ` p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存( v- n- T) V0 A& ~
p->number=1;p->flag=1;
. B7 |5 x L0 O1 v$ T p->next=head;
' A- j' {) p7 K# f% W h' f head=p;
+ a& y. u3 o+ D" I* ] for(i=2;i<=M;i++)* h1 u) s0 D/ Q! J5 I; Q6 C" T
{ s=(MONKEY *)malloc(sizeof(MONKEY));! J, u( R7 Y8 i+ Q {. a9 b
s->number=i;s->flag=1;
& F* x# Q7 K2 [3 d1 R s->next=head;) y; d/ h! G; i- |7 U( y1 I
p->next=s;p=p->next;1 ~5 s! ^( Z. C' @
}
( p/ l/ J6 k1 t4 R% X, o7 A1 H p=head;
9 h" T" l( e3 t) U for(;;)
1 Z& v+ _# r) |3 W2 Z6 o3 r" z {if(p->flag==1)
0 `) ?+ r9 b- { d D count++;! n+ I9 Z6 _4 ]* j# L/ H
if(count==N); v. _5 I, {2 T/ Z! v$ g* r
{p->flag=0;
, Y6 C) Y( Q S6 x: F; a! ] count=0;6 _1 P2 \# F& e! A2 J l
sum++;}
) C7 L+ g/ |4 U/ I if(sum==M-1)" N0 R. o: m0 Y9 n( n
break;* d t4 j0 u( K5 S' D
p=p->next;3 l4 L; G$ W+ B# g* ?
}) s7 ^. b% L7 h+ |, ~! H% {
p=& i8 Z4 m8 B! f3 Y4 d; F8 S
head;" f1 p' E r* r5 K& z7 A
for(i=1;i<=M;i++)
. C D2 q( h( `3 S/ _7 c/ M. N { if(p->flag==1)
: {# T3 u' n6 k! p# ~# w/ b+ @! C3 \ printf("\t%d",p->number);
( j: e0 p4 ]: C7 O; o4 L$ X5 W p=p->next;0 A/ X2 ~5 [9 ]# T6 C( z9 Q9 z: G, {
}5 G/ B7 H- z3 A9 }8 A. G5 ?5 x: o
! U$ [2 q3 w x% R5 p$ O
$ F$ V+ T3 W4 {# }7 x1 m9 A( u! E2 T) x( k( `& `* P
} 2 B y/ f2 `- `% y8 k3 D$ D
第二种方法:数组6 }; w& }( c5 p/ C' [ |
#include<stdio.h>
5 G; r' D* g g- F0 f& d& z+ l9 D1 ~#define M 8, l1 q/ j' J* Y4 N; V9 f# {
struct monkey3 @+ u1 _9 _4 E w. k7 h+ g( A" o
{int number;
0 t. {- c2 d+ \5 O, o! Wint nextp;
) ?6 F! b. ^/ s}link[M+1];- X! _9 W. V2 N2 [
, c% I8 q1 n6 s+ v9 Jvoid main()
3 H& k+ \. d+ j2 e3 {& Z{int i,count,h;
: c5 t' h" o, B' q3 P: i' K0 jfor(i=1;i<=M;i++)
! }$ V( s1 W8 k{ if(i==M)
! j9 u2 b& G2 w- U; \ ` link[i].nextp=1;
4 P n. }& K( K, S else
! u: J9 R) ?" D# W; q link[i].nextp=i+1;6 ?) f _6 V1 k9 N' C( L
link[i].number=i;
# r+ C& n5 F& @4 v}/ [( U+ y+ r6 G' }% }7 u
printf("\n");
X- ~! Z- T. c& lcount=0;
/ x- \# s. A8 a# O' c3 L Vh=M;
6 b+ \% m8 e, N3 V- V* {printf("依次退出的猴子: \n");! C( _) z L+ G$ l
while(count<M-1)+ C% a$ @0 f# g+ x6 ]! I
{i=0;
. q0 }1 h9 b. k5 X1 e7 Vwhile(i!=3)# E. b; g, ~* I5 A0 H( J
{ h=link[h].nextp;9 [" D% Z3 e$ q3 H! t' V8 g
if(link[h].number)# X ?9 c6 ]' I
i++;}3 Y( d0 {- x* Q9 B9 X
- l/ A* v! v1 }0 {# R/ Lprintf("%4d",link[h].number);& t9 \* @# [4 z( |, k; r" r0 z
link[h].number=0;+ v8 G& Q# }6 F7 x
count++;) W1 @) F; s; d7 b( l0 a
}
5 `- N8 O- ^7 t% T0 h( p
1 H6 L1 n# q4 E! {; Y( Nprintf("\n大王是:");9 S$ A- Y& n8 e( p& j, H$ l+ A
for(i=1;i<=M;i++)
$ e& ~' k- i9 l/ q7 ]5 [ if(link[i].number)
; E& q9 z0 [( [# u' e4 | printf("%3d\n",link[i].number);! X* k1 p. P# u" @
: K( O7 E) h" u
. N' u7 X I+ w: M* B; H8 n} ( z) i2 X; G6 r+ t: r
第三种是普通方法for循环# x! h1 j# G9 @2 `1 D9 z
#include<stdio.h>
0 d( p* U% f" m3 O2 R4 [6 svoid main()
* u7 p+ S4 }, W{ int i,k,m,n,num[50],q,*p;
- X# l0 m& l" c' P# g: B7 G3 u clrscr();
- L8 b% C4 ?- E5 O8 I6 M% d& y printf("input number of person: n=");
" e# K( k7 o5 R, J H, ?3 E/ m! b scanf("%d",&n);* v# C0 \. F% W
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
4 m3 k6 b4 t Y2 o# Z scanf("%d",&q);! M, `' d# m- i1 B& F/ T R
p=num;
" m R" p5 {1 n; u4 { for(i=0;i<n;i++)9 _, Q) f9 c: m. I' g: w: _. B" H
*(p+i)=i+1;3 Y. u1 n5 r9 z, f) L% r1 r: H
i=0;2 q1 J0 E% |5 A4 N; ^5 @* y' o
k=0;! h, Q; s; R/ k3 O4 |
m=0;
, `% \ V2 m0 | g% N; X* ] while(m<n-1)
3 @' m4 N i- F$ I {if(*(p+i)!=0) k++;! b. ^4 p& k! \( x/ n& b
if(k==q)
o; j9 k ?* \: w/ N3 u+ n { *(p+i)=0;
, @' Y4 ]5 O! U: y) o k=0;
7 j/ ^/ E: l0 c# \3 o m++;
( F) I0 @9 \3 {2 ` }
& e" x6 V' w; o! \2 V i++;
) c) L. B& L$ O7 j" N if(i==n)i=0;- D- \! d: l0 p- I" c% Y& J1 K
}
: ] N1 u- l. J. e- B" j while(*p==0)p++;
- n2 |, V5 q0 T- D/ H3 X5 z printf("The last one is NO:%d\n",*p);
9 t* ~$ c {+ A4 r5 T! Y( A4 G; [ getch();
/ S! D) O% y2 s9 F/ _7 }) Z: Q, ]. P8 G# v
} |
|