|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
* x4 k5 m: y2 n4 ~! x2 q这几天我在忙着编一个问题,我用了一种方法编出来!9 Z& q" G; Y- O% N
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
" J# U8 K. X, M# n7 [! u+ b注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 - l2 q0 B) [4 m' G& ^+ W0 |; ^
, n9 R+ ~; ^: S5 r m; N7 G2 P" R% c" a. j' {3 f/ Y) z
题目! z; p( Z& A D
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。, p1 A) n0 M! S3 ]# H" {% e2 s# x
第一种方法:利用循环链表" Z" z/ d x4 p* E; y5 O
#include<stdio.h>) L- j8 ~% q$ g: h9 X" D
#include<malloc.h>
/ H1 L9 t. s% Z; d+ E" C9 ]" l#define M 8 //共有8只猴子
7 r/ f2 g0 q Y( T' B8 V6 p#define N 3 //数到3只时退出第三只
* u7 V0 a" R, d! d2 [typedef struct monkey
1 E1 B* }% q }# Q* p6 \- c8 D{int number;0 R0 R# m- u' `" e* b
int flag;
. ~6 d$ F5 E8 r1 s% f$ `% }struct monkey* next;6 o. p( r' p1 E2 l0 c6 q! U
}MONKEY;' x2 ^; Q8 B7 I Z6 y7 T' ]( K6 |
main()' o4 ?5 D1 G, d1 l
{ MONKEY *head=NULL,*p,*s;
; H7 p% m+ L* D: q int i,sum=0,count=0;
0 Z2 Y6 p% k" T( ~8 z clrscr(); //清屏) l; L- p1 T( V. B' M: r
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存7 I8 Z5 n% |# n& m8 q' [0 r w
p->number=1;p->flag=1;
& `5 ]8 r9 M0 |# y& ]6 D p->next=head;; m4 K/ D9 M2 P, T k) Q
head=p;" U6 t3 L/ ?% u
for(i=2;i<=M;i++)- v$ i) m# v+ w1 A+ w+ O
{ s=(MONKEY *)malloc(sizeof(MONKEY));& s- K5 X) J: Y' x
s->number=i;s->flag=1;
# s" ]3 Z4 P, g. e* A0 X6 r( a s->next=head;! M- X! w! P' D
p->next=s;p=p->next;
8 Y4 j" l# P- E, k, d5 [- V( _' O }8 z5 y' A! C6 d' K* Y% m$ F
p=head;7 m, ?% E2 X n2 Q9 j
for(;;)
$ m6 s4 U! V6 L) n: h {if(p->flag==1)' T* e# E8 F6 a( b! r+ B
count++;
8 ?; ]% s7 s* t$ S9 R M' w if(count==N)- _$ g- d& l2 b0 d8 f7 o
{p->flag=0;
1 |) s0 G+ c: x- A ? count=0;: e$ ?4 P! l, K; ?$ H$ e& U
sum++;}
: G& H* {9 F. H2 y3 h: L if(sum==M-1)* D0 o, y$ `4 o! ~3 f
break;
( g0 C4 \; f* S4 r0 M& ~+ H; d" a p=p->next;
6 e& m( N# r. K4 { }4 R+ }) i& G+ T% q
p=
- o& k* C0 h2 l, [! p head;& X+ o) ~/ w' ]! {, ]
for(i=1;i<=M;i++)
5 _4 A D8 P! }! b2 C { if(p->flag==1)
+ W6 z& s9 p: h* F printf("\t%d",p->number);
" w& |' y- W/ F/ y5 h p=p->next;
$ N9 ^0 y) Z+ T4 d; R" [ }4 Q Q Y2 x$ f$ F5 w c
) J( r1 P. B8 T' |' k7 _9 h1 U
8 K5 k* N4 z5 l( F! x
3 S6 l, o+ r# q% J2 c: |. Y% U- u}
4 J6 I/ C& s; g$ K s第二种方法:数组
2 s, r3 {& w K% O" s/ X/ r#include<stdio.h>6 d$ L$ p5 G+ A/ W
#define M 8" ]( J' w7 K! K$ ]& Y
struct monkey
1 p. F {7 S6 Y' A K8 F{int number;, I0 n6 e# Q4 ^$ W! S
int nextp;
, T2 f& ^- c0 g}link[M+1];
( k4 W5 ~9 W- _7 m1 d1 n' O" s' A# G
void main() Q1 n/ g1 U! d* X9 c" o, J; Y
{int i,count,h;+ ]6 x8 ?6 r8 U: }2 k D
for(i=1;i<=M;i++). U. f3 R. {1 }
{ if(i==M)
3 ?: ~" w1 N9 r _& \" ~ link[i].nextp=1;6 s" a5 } `- w# j7 B
else
1 C$ C2 ? P7 Q7 { link[i].nextp=i+1;
9 }* O7 s) N8 ^ x* v link[i].number=i;0 e: j* S: Y/ H: y% b
}& W6 m) P# z0 R% ]
printf("\n");9 t3 k1 d$ G4 v s$ i* V7 z, h. r' ?
count=0;# r5 K3 _% L8 `! `; A; G
h=M;
G+ J( V- L3 J8 T( Q$ M' y9 R) ?printf("依次退出的猴子: \n");- G8 U8 u5 @: R& p4 W! L
while(count<M-1)
5 G8 ~! ~ p" K! B3 {{i=0;8 @; S& a: N6 H+ E. q
while(i!=3)
& c6 ]/ C7 T7 A/ z$ p; i9 I{ h=link[h].nextp;* `* Z) t( C, e3 j$ }( X( N
if(link[h].number)
; m5 Z1 m5 C) x/ i0 V i++;}: I0 l: J8 F# N( G: M& S4 Y
4 T z. L9 R4 X+ m; d) S/ R
printf("%4d",link[h].number);6 Z; b9 b4 c5 l
link[h].number=0;
/ ^4 Y1 @. a0 acount++;
' ^# r$ o. d% y* v, c% q}
8 Q' m ~6 U, Y6 b) v9 o% Q- R8 q. x/ z0 h- B5 {5 s* f, V
printf("\n大王是:");5 V' A2 n- O/ `$ r/ Z! l
for(i=1;i<=M;i++)+ p" X+ `$ L; E" E$ F5 ~6 I
if(link[i].number)0 g8 N4 t) m7 F; n; f) G* L! n
printf("%3d\n",link[i].number);/ H) d! q( F4 }, x. u! f! I
3 Y1 i3 n) \$ G" I g5 k' r
/ \% c: X1 g$ c5 v}
# j8 D# Y% }( C d- z& B第三种是普通方法for循环8 u3 G8 ?' N$ F/ X5 S0 _
#include<stdio.h>* ^9 e9 M) c* a3 k
void main()
7 t( ?% w5 F1 s! {# W) ~% V+ }{ int i,k,m,n,num[50],q,*p;
( ~/ A+ y1 a$ z- U clrscr();- d/ \8 a2 Y9 j8 h i5 n" ^3 T
printf("input number of person: n=");2 b: k/ R8 ?! p# i: k. K
scanf("%d",&n);" W& G8 v. X0 U4 F3 X; ^
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只4 q$ ~, Z1 s. n
scanf("%d",&q);% F6 Q! p- W0 H6 P& [. {
p=num;
. Y9 w2 z0 l7 R for(i=0;i<n;i++)6 c+ j8 z% n4 f: H- j
*(p+i)=i+1;, |5 h: k- |* G! j& T e
i=0;
& q1 J; c3 f E- B k=0;8 R- a4 X6 I2 W! p
m=0;# a1 s/ G. v$ X; T7 o" j
while(m<n-1)
* t* e) m% k3 c1 g: r E {if(*(p+i)!=0) k++;
- U! H0 ^7 U3 H if(k==q)
% d# [7 }! K, d { *(p+i)=0;( d Y) N# C. B! w t! T: D
k=0;6 g2 t+ b. w% B9 W
m++;
% T+ N5 Z( x0 j+ y$ ^* ? }1 v( N- G* W. ]
i++;8 O! ^- _0 q2 K: b) b5 s" S" n
if(i==n)i=0;# ~) k2 D6 U! O$ n+ T8 P
}
" G1 H `) c* [! V4 U while(*p==0)p++;
% d3 M7 R. Q5 `5 Y printf("The last one is NO:%d\n",*p);! m: \! k' p, A/ ]+ M g4 p
getch();
2 @0 h" k3 i, i! d! s) G! o
0 h1 H) T: _' {$ @, s% f6 F} |
|