|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!; W, f+ E& @, v" u F5 p5 w
这几天我在忙着编一个问题,我用了一种方法编出来!
! P* L; w- ]2 p6 x但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
" \% M. k( O1 G4 t0 ]注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 - D$ ? Y. g' N h% P$ c T
( E5 \9 I9 g2 w7 W& Y6 m
$ e# E0 A& h: _- _. B8 I 题目
7 V$ F: j; P( U% x6 m5 J3 F& u& b山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
9 H# s. {- f* X+ n第一种方法:利用循环链表! j8 y7 W0 E8 x# ]2 Q
#include<stdio.h>+ M6 N9 n$ @3 Q1 w
#include<malloc.h>- |! b/ \( s6 b' q/ f
#define M 8 //共有8只猴子0 Y5 g' Q, Y' a; V: }
#define N 3 //数到3只时退出第三只: ?# l- f( q3 n. C7 [+ }# n
typedef struct monkey8 F5 A) v1 G+ V1 g
{int number;# I- N( p" i5 v8 y
int flag;6 Q! Y1 Z' j8 b- A# m/ i" {+ p
struct monkey* next;
. N: a2 g" v" C$ f" F* ^}MONKEY;0 Z7 H, g2 \/ U& h1 W
main()# B0 c+ r. w( g2 ]1 `" E3 q% _2 u
{ MONKEY *head=NULL,*p,*s;" ^/ k3 M9 v8 c0 M7 b
int i,sum=0,count=0;, c$ g; U& {: ^" ]& O9 d* t0 A0 p
clrscr(); //清屏
% C* Z9 ^- c. D# O p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
0 |5 N- H2 V% a" w% J0 o p->number=1;p->flag=1;
* a! \% `! k9 f+ u. V0 D p->next=head;
8 f0 u( L- V l( r/ ` head=p; f( d' p: G, P4 A* M
for(i=2;i<=M;i++)
2 ~# [# k( U5 d' J* y% K' i. w p' h! d { s=(MONKEY *)malloc(sizeof(MONKEY));
4 y. G* T+ ~3 J# _ s->number=i;s->flag=1;& D- N2 Z. e$ w9 M
s->next=head;
/ k( V/ K# }2 U5 Q- y0 S p->next=s;p=p->next;/ I8 R& U0 I- g7 G: |$ W1 O6 t
}6 i4 v3 ^4 j" _- A) y, z, N- \: b
p=head;% Z% o o4 w' J' n a4 k
for(;;)1 m- B: N7 T& t( n j4 a5 U
{if(p->flag==1)8 }! V1 z$ Y1 W! F0 k3 O# _" J
count++;5 I. f: I* i7 D
if(count==N)
4 _' o8 d6 D% X% x' Y5 J- N3 j {p->flag=0;
6 `6 q6 n; D' v+ X' x' n) v count=0;
3 W0 O) C% e5 y5 A+ J2 X% E sum++;}. C- E0 u& E6 L, d. d
if(sum==M-1)& n8 O) {- H; Y/ L& q2 ^$ e( x& N
break;
$ Q' N( l h1 X3 Y p=p->next;( R, w( _& s K" j( K9 S4 Y
}
! \' m a' z2 P8 N! | p=/ H, | s8 v* O1 f/ @
head;- k% y; t. ]* t1 T
for(i=1;i<=M;i++)
+ d7 g2 [2 b, V) g. F) D { if(p->flag==1)4 @( t% ], a! p; o
printf("\t%d",p->number);1 M4 }; q7 }( N8 O9 D2 V" N7 f
p=p->next;
( Y$ u# F6 p( l* j' N }
2 U; N5 g# p6 c- I$ `
9 p9 m, T$ ~/ o2 A, n
* X* ?) ?4 `5 F' C1 x* I/ \1 u8 y# p" c: U+ s1 I. L8 e( Q3 @
}
* g4 d+ p' }% A# j6 M第二种方法:数组9 v' b% o/ @) Y; u
#include<stdio.h>% ?) O6 |% _: _3 M' A9 D
#define M 8/ c: Y9 Q, \! @4 r
struct monkey7 z) Q8 n* J l- H0 ~9 O# J! r' q
{int number;
6 z, D2 t2 M3 I( ?& N7 P5 cint nextp;
' j3 A0 p, f3 R8 i) C% s8 u}link[M+1];$ A# h8 p5 T3 g2 l8 g, ]
) t6 \0 l( h6 |, e: e6 C; cvoid main()
$ W- d9 v* K6 C& I) o$ r{int i,count,h;) r/ _: F Z& g; P# y" f. w
for(i=1;i<=M;i++)* n" Z `4 o6 X) D
{ if(i==M)
, j8 m, ^# T. I5 m0 H" K" q link[i].nextp=1;
5 `0 G# s6 x' l4 v$ Z else
$ M7 S# ?! H! g. Z, I+ j+ \ link[i].nextp=i+1;
8 f2 ?$ O2 g f N8 c link[i].number=i;
3 i1 b: U0 ^5 W- K* L9 x}9 |9 ?( u( D; ]9 J8 f3 l- s
printf("\n");
1 Q5 e9 l" K: c# [count=0;1 a! _( {# b' T9 z* f8 ?- {
h=M;8 q9 W" {& }" U& I
printf("依次退出的猴子: \n"); r. R- ?% { [, q# t' A8 o
while(count<M-1)
f" N+ w! \ L* M{i=0;
* ^9 g# G& W# owhile(i!=3)
$ a# t- Q5 [$ l6 J{ h=link[h].nextp;
+ e7 s" p6 H8 i" m" E" x if(link[h].number)% g* |$ C& c" ?# j
i++;}" i* R. i* Y3 |' A
' h0 m+ O" V& D' h4 C: _5 m) q! d
printf("%4d",link[h].number);
$ z4 M i5 h k; v& y1 y: Ylink[h].number=0;
6 |( G5 V3 q. f1 [6 F( U5 lcount++;
+ Z) C3 k8 D4 J5 ~4 ^: F}
2 x+ d8 C/ i6 l! F F
) H6 b) p8 T% sprintf("\n大王是:");
5 K K. b. w. ]: X/ k6 Y for(i=1;i<=M;i++)
: y2 N- u, Z( o( C, U" v if(link[i].number)+ F+ T' N7 b4 J4 b/ Z
printf("%3d\n",link[i].number);0 i# D9 ~6 N; o5 j/ o5 |
% K9 s$ Y& N4 x, Z0 I% T. I' G! T, S/ ? Y9 z+ c9 q; v
} + u5 L! Y- k6 C1 ~! a
第三种是普通方法for循环7 \: L* ^! J5 B1 z4 {
#include<stdio.h>
' j9 \; u* C4 z: Q ?void main()
+ J! Y) R, z2 r) y! ~. W{ int i,k,m,n,num[50],q,*p;6 p1 c) R" k+ |5 h9 V
clrscr();3 M! Q% ^5 v. Z& c+ P; ]$ T# Y
printf("input number of person: n=");9 A+ w) Z% U& T- C
scanf("%d",&n);
( W1 I/ W& m) ^0 K; _. g7 Qprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
0 s: C* R, }- r% Z! H9 _! `6 t scanf("%d",&q);
& e9 R( f; `" u9 d' W/ o3 |* X p=num;
" U7 z; @! V' ?# Z" y, n6 r for(i=0;i<n;i++)
% I& e! a- k2 h1 y( d: n: Q/ N% R *(p+i)=i+1;
`6 j) u$ o! Q- f i=0;* Z# Q! U- {3 N0 y( n7 W) r' W0 w
k=0;) Y! k9 n7 x' R# p
m=0;
- u% r0 b, H, r3 O0 X0 @ while(m<n-1)
( d9 H, c' G+ B* B- e {if(*(p+i)!=0) k++;6 B/ R( Y; x" T
if(k==q)4 R" j0 n+ u, m( C. t$ [4 f! K
{ *(p+i)=0;; ~) d/ Z7 d+ R; M2 m0 T6 h" s
k=0;9 _- t* C6 P, |& Z
m++;0 W% c( d' ]4 M9 |' `
}, ~- W- k$ E& L. B
i++;
* L# K$ W6 N! g! J6 I if(i==n)i=0;3 r3 _* t5 g4 S1 J7 V7 B) f
}
$ o( }! Z9 |* ]% i/ ^; \1 { while(*p==0)p++;
+ R+ C- ]6 w# q( o$ a3 J printf("The last one is NO:%d\n",*p);* ]) j4 o8 u" |- Z0 m2 ~1 [4 r
getch();7 _! _) z( w |7 c. ?0 H
1 C" e& n+ G4 R8 M0 {* L} |
|