|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
; y2 g- k$ {# Z9 d: `) F) \这几天我在忙着编一个问题,我用了一种方法编出来!
7 ?3 H! l+ Q: D2 s, K" R但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
$ w o% p# v' y/ ~- d注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 * \+ i6 _* _9 n0 G/ ~/ O
. x; f& D/ `. a
r# I7 p3 J ` B& }4 R1 v 题目- Q* w" R- ]# `3 j0 s: c+ p; V' ~
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。# ~: G7 i$ ^8 m% T3 p. h. a9 N
第一种方法:利用循环链表/ a8 R( n' H4 Q; V
#include<stdio.h>! N3 w) f; K z: r7 ~2 r m
#include<malloc.h>
( K# w: w9 {. u: |% A' W#define M 8 //共有8只猴子# l& {* A" i D4 k$ c0 k
#define N 3 //数到3只时退出第三只4 t' Y* o4 I( _3 j# d0 R
typedef struct monkey
2 ?: l2 s) q7 \. E# Q' `+ c, e{int number;$ N( [1 Y1 p; A+ w3 Z- w% X* b
int flag;% R% H% P9 `! e0 d: d: [( P4 [, x
struct monkey* next;
& J7 i( a: Q" p8 b/ ~) q1 W}MONKEY;
- V* K- y, B8 E4 \6 kmain()5 F s7 |" Q) a& I8 l1 H
{ MONKEY *head=NULL,*p,*s; a* S; `2 w5 R9 y) `
int i,sum=0,count=0;! e2 f- V( J! C- S
clrscr(); //清屏
3 x5 o4 P- |# E- W. l9 F0 V5 E& } p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
3 e4 F+ V- w8 L4 N9 q" d p->number=1;p->flag=1; H- U+ f, R! o# Q8 l
p->next=head;
. k+ p V, q0 ` }5 H head=p;7 D$ K5 c( p }# K
for(i=2;i<=M;i++)
2 d0 }$ P% X8 w6 a$ G0 K. c { s=(MONKEY *)malloc(sizeof(MONKEY));( W5 }; @ S3 ]) _' a! D: g
s->number=i;s->flag=1;; D5 K' J" Y( s. l$ y; e
s->next=head;
& M$ y: o" c" q0 m' A% N p->next=s;p=p->next;7 T, Q- Z/ }% m; H% G6 M9 m3 U
}) W" S3 g3 M: I" B
p=head;
/ p4 Z" E0 B3 w( m- g2 x/ n9 ] for(;;)
1 @9 {' ~- V9 [/ b7 {1 o {if(p->flag==1)
2 v( v U' r0 e+ v1 D count++;* }1 @: ?4 q$ a! O$ V/ z
if(count==N)! \1 \( t( x8 d* M/ x
{p->flag=0;
1 R3 v ~2 M0 k ~* j/ O3 u; d count=0;; G9 @$ A. T/ I, m0 }
sum++;}
2 o( D& g- T/ o& n, H if(sum==M-1)! A4 n k) s$ p2 M
break;
$ O. X: Y+ h1 r, U p=p->next; z' o2 [( g8 U& M2 s# A: w
}
6 _# ]( H, G( w) e; ~ p= ~4 Z6 j& G6 S; Q
head;$ H9 R0 b; C* g) |7 U/ j. e
for(i=1;i<=M;i++)
9 P; c1 k2 g0 H7 B) y% T0 ` { if(p->flag==1)
, M5 ?0 k$ s# B0 w2 _" X( F printf("\t%d",p->number);
$ L! F) n* C2 k* {3 z% L1 h* G( A p=p->next;0 \: b; ^1 X) E6 K
}1 K/ o- G' Y5 E; H9 {
Z; l6 S R. S# M5 `( \/ J. F# h d# t w" u$ q% ]
% K6 Y T! y' v( L( q6 D& }
} 0 o0 z# O: I5 V4 A7 M- p7 {$ o, n
第二种方法:数组
5 _4 y* k1 ]' P" D" \6 ~# R#include<stdio.h>
# y) x4 s( ]2 B$ }" {/ [#define M 81 ?" Y2 B1 i& T0 `, T- @3 T
struct monkey
9 ^8 O' Y" y& t) V{int number;* Y5 @; {' T+ F# L5 I
int nextp;! u8 f j1 E9 N8 E9 y8 n
}link[M+1];$ S1 i! k; j! N+ r- \3 _' c
+ t3 U* Q4 P) d. z) f
void main()
6 c& y$ T/ j! _: ]5 R! B) H{int i,count,h;
2 y, \$ T3 X \9 g4 t" G. ?! ?for(i=1;i<=M;i++)' w# M6 l' M3 H D& Z, f! d
{ if(i==M)/ r g' Y( R4 P( `2 Z5 C7 I! b0 L
link[i].nextp=1;
9 M1 |0 @' j3 p# ]- Y7 u0 v else1 g$ c7 z, o( |
link[i].nextp=i+1;
4 }; r$ W B) P3 c9 P& R link[i].number=i;6 x) u5 r+ n3 K+ h; p
}* j( K G3 R- H
printf("\n");8 g* R% s8 u9 _, X. n
count=0;$ }( R Q6 \9 t, Y
h=M;
1 {% W2 U& _6 L1 b/ Z# w& Iprintf("依次退出的猴子: \n");
5 [' B6 T+ N* c9 j7 Xwhile(count<M-1)( b4 W! {7 M, _4 I. P/ L
{i=0;0 V) U; H! m! _' Z2 g6 t7 Z
while(i!=3)( v4 u+ h% w) t
{ h=link[h].nextp;' B! F/ u8 ~$ L
if(link[h].number), {9 }' O; w C' { {) v
i++;}$ r5 i5 w9 M9 I/ \0 r4 N0 X$ ]
3 ]: s' N# G' |0 M
printf("%4d",link[h].number);
1 x; W5 l, z7 p2 c7 olink[h].number=0;
6 Y L* ~+ G- I5 |2 fcount++;1 @8 w- d$ y/ n* M" z
}8 {- }" @2 c3 N! l/ x
n" \# w) s; N8 s, U6 a
printf("\n大王是:");3 _7 S. K, J2 |7 k/ ~* g, H4 y
for(i=1;i<=M;i++)
4 C2 @8 H! j" a) U if(link[i].number)
9 B3 ~- i- k" e% S1 ~; e e+ v" V printf("%3d\n",link[i].number);( B2 f* k" `6 [. V
0 r c# r- u6 H, t% V
; F+ C4 v! w. u3 ^}
! v3 O% M. L/ n$ i4 e第三种是普通方法for循环
! j8 b, \* V# ~! m; v#include<stdio.h>' F! f$ T4 u) i
void main(), h9 u- n- u+ Y1 ]: ]
{ int i,k,m,n,num[50],q,*p;
$ v; X9 o! m! S% M( i* t# h clrscr();
; w5 `: @1 C) i printf("input number of person: n=");9 |: s2 b5 {1 P& g% ~9 w/ u* h3 A
scanf("%d",&n);0 ?. d5 F- y1 C6 \% H0 p1 t. m
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
2 H4 M( @ f' L! M3 [6 Q3 y( ^ scanf("%d",&q);' K6 Z5 s- q( _, n
p=num;
5 D! S$ V ^6 F/ T% B for(i=0;i<n;i++). P( A: i8 H8 i2 o( Q. l) ~. g/ ]# `, }
*(p+i)=i+1;
5 Z h& y2 Y8 r/ C. M$ n" h i=0;- R- t: }0 Z* T7 L1 X+ `% q
k=0;
' I9 e5 m8 P4 L+ R/ v4 v6 P m=0;- Z9 D; N$ ^) R
while(m<n-1)
: q1 c3 N1 y" @) b( X {if(*(p+i)!=0) k++;
" ` \- o$ `/ s, ? if(k==q)6 C6 o: k) K6 w
{ *(p+i)=0;$ ^5 j0 t- w% z
k=0;
/ M+ T, I6 x" X m++;
6 w2 \; E, i8 N/ P$ ^$ D* @8 { }( r3 I Y. {8 P5 p# ]) b& x8 \
i++;
5 o5 s3 W0 e8 n1 Z. |( {6 r3 H/ f if(i==n)i=0;# f8 k2 A. I. i0 d, e9 ^, A) Q
}
7 C+ t n" f5 B2 @! R: | while(*p==0)p++;
/ _7 r/ n7 C+ n6 h6 [ ` w" w7 r! z printf("The last one is NO:%d\n",*p);
* H3 u, T- ^9 {6 I4 E- H getch();
2 ~7 F; V! }5 t; w5 q L7 X
2 h2 y- E0 v) s' b' _* }" B} |
|