|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
+ Q: y$ f" X6 P$ G这几天我在忙着编一个问题,我用了一种方法编出来!- b' d. R+ r6 v5 n3 m3 Z
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
* O: [5 [$ J- c- X% y6 p) G注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
) z6 Y% c& ^1 z6 Z: p. k/ c8 ~! O% ?3 I* \8 T" G6 A8 a
Y7 z2 o& T% T2 B: I* n- W- j# u3 ^
题目
( d( M1 [' F, b4 [山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。# r+ E/ x0 _) r$ h; D" }
第一种方法:利用循环链表1 m, Z6 s% ?3 T2 D. ]
#include<stdio.h>( Q5 L+ a$ [7 M' F& ?
#include<malloc.h>4 m, U- s; B7 U- Z3 u( V/ A
#define M 8 //共有8只猴子# `9 a! Z1 Q3 E0 u o
#define N 3 //数到3只时退出第三只
7 r& o5 G" H1 O7 R' Ltypedef struct monkey
0 ^' t4 o8 w* k: m{int number;
& m W1 _; C! D% d; r! @1 Fint flag;* X( i: O H: {- K$ A4 ~9 d' z
struct monkey* next;# U3 G9 h% q: W3 E0 Y: e, _
}MONKEY;9 I3 w2 E3 A, m& l$ B
main()0 O; o; q5 ?/ @( O' a
{ MONKEY *head=NULL,*p,*s;5 B: C1 h3 I* F8 j; S9 p
int i,sum=0,count=0;
8 v0 R" U9 a1 d$ ~. S- t, M! D1 q clrscr(); //清屏* [" f% p: u" `9 I) M
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存9 X) U1 M0 @' Y$ o- s( q" j
p->number=1;p->flag=1;: d u" A3 e+ }
p->next=head;
8 d) v' k: D0 b4 _/ k- [ head=p;; h' L/ J6 e0 f6 @1 T1 b
for(i=2;i<=M;i++). q0 i! s B$ Q g: t* f
{ s=(MONKEY *)malloc(sizeof(MONKEY));% T) K0 y9 K4 O
s->number=i;s->flag=1;# T4 r- e: I) {
s->next=head;
7 Y. @ @5 L( P+ A; i( y" y- c$ n p->next=s;p=p->next;4 V, ~# a$ Z( b' s2 U
}
5 U. R' v. x6 m+ P' z p=head;
' D& u0 |1 n7 u+ |" G for(;;)
% |3 p) O6 p! Q# r {if(p->flag==1); _: s$ w4 X) [/ {
count++;
" y+ C+ {' j+ G9 M7 z if(count==N)7 B1 `+ i3 k/ J; P5 c
{p->flag=0;4 T" l2 x2 \8 x# ]. k: ~
count=0;
9 |# E" e6 V, W/ C( [. b/ Y sum++;}, M: c, w$ ?* ?9 S% w
if(sum==M-1)6 O" I' @9 T7 [/ v
break;$ `# j( ~; S- `) l
p=p->next;
! \4 |+ e! F. I x: m }& `8 k$ {6 n9 j* U; m) c7 \/ Q$ ]
p=1 ~5 r; y; b' g ~
head;( O$ Y- }* @% w( V0 s
for(i=1;i<=M;i++)' L: N1 y0 m4 [) O, U
{ if(p->flag==1)
) N& ^' k1 c8 }* c+ T- S printf("\t%d",p->number);
8 D& z# O3 t7 T7 }1 H7 u! @ p=p->next;& u" Z1 R% v8 q- N. t# _
}
- O* J6 p/ l, j Y$ o
4 n$ y' J w( g& O4 s
$ R) E. Y- }; q; \4 F$ f0 H& i/ v5 X" x* Q1 J) J
} , D6 [8 l. N2 k8 z t3 I& }1 i
第二种方法:数组0 ^) |% y3 b; Q/ u4 D9 }
#include<stdio.h>
" g/ o% L. L! T' c3 X8 j+ @, g#define M 82 q2 Z( {) o: m. Q; {4 C& D/ K: g
struct monkey2 L5 z. e* B+ y" p* ?3 G
{int number;
, Y& U; x: n8 {3 i5 N" G3 M) Cint nextp;
- b% w, ?. X9 f% W# ]}link[M+1];
2 N* ]3 N, K6 I7 o" `4 ?3 M- G1 T# |! c( X9 ?* ? u
void main()! S5 n4 ?8 g, o) F! S5 N% v
{int i,count,h;
' B5 g j/ j7 |( S/ f( \* Xfor(i=1;i<=M;i++)' P/ _+ G0 Y- n! O9 |' n# ]
{ if(i==M)
7 L E c' A6 t- A link[i].nextp=1;4 W% L& R! Y+ H E! j: o; j
else8 c% x2 I6 A7 y8 a
link[i].nextp=i+1;3 M8 J, ~( S# S6 A; U, K9 l- o
link[i].number=i;# j7 N( s# |/ W- u0 s( ~4 Z# a5 F
}
& x6 A+ |+ L, G/ @$ hprintf("\n");
$ T5 V* b2 Y3 H5 j$ gcount=0;
; R' g, {! `! N& a7 \0 z6 jh=M;; W N4 Q! w# q# X. D
printf("依次退出的猴子: \n");- f) y9 ]. L" Z8 N6 ]$ L t
while(count<M-1)
1 [/ v! F# j4 V# E6 k6 W) J{i=0;! V, O- l; z5 d4 c- S% f4 e" M
while(i!=3): E, f* \& Q( q g
{ h=link[h].nextp;
# K' w) ` J+ A9 F. V( {5 l2 ` if(link[h].number)
3 s6 R6 Y `9 a) T5 A i++;}+ M) U9 A* f- y; F
4 w; ~. X8 Y7 j% ?
printf("%4d",link[h].number);' L9 x; u0 D/ ?) `, J4 o
link[h].number=0;
' T/ N( t# [$ M6 M4 Z Pcount++;
$ t$ f" }; T( }" W1 R/ ]- Y4 }* B/ i}+ y) t% E& {! }' I" h4 \# e5 X
7 S/ b. Q6 k2 r* \- P+ H4 X8 xprintf("\n大王是:");
3 ~2 [8 E% L( Z- J- H for(i=1;i<=M;i++)4 |' Q \9 y7 V' f" D" U
if(link[i].number)
2 a% _/ r9 m( I) T t2 C printf("%3d\n",link[i].number);, ]' W# f$ K) x/ B0 }, h
+ G# k' U2 c8 q: h7 \5 K( x
% `3 `7 m- P) `: s3 }7 `}
) @3 n H2 E. t9 Q第三种是普通方法for循环
2 Y y9 [( B/ i4 R#include<stdio.h>
0 c: o7 x; T* V' v0 r% Vvoid main()
& ]9 Z6 b: v, B c! a{ int i,k,m,n,num[50],q,*p;
; @ V6 e7 [) {7 J* u* K2 c clrscr();4 Q9 W# e2 q, H' Y9 J3 a
printf("input number of person: n=");
3 V: g4 T/ l: z$ L1 y D scanf("%d",&n);
. k& F" l! m7 ^) a5 z1 qprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
4 F( v. g/ `" B- i- g scanf("%d",&q);
; a# B5 @4 U3 \, o p=num;9 U: a, S9 x4 O0 ?
for(i=0;i<n;i++)1 S( E- e. ^7 i9 x/ H
*(p+i)=i+1;! k/ r! O0 k; n! F8 ]3 ~' g) R
i=0;
1 T5 r/ ^ n4 A2 ^# q- R1 } k=0;
" Y; q v/ l& ]7 ^9 D m=0; W) l5 m! c" Z- i) O
while(m<n-1)3 H/ |; }/ G, U6 U
{if(*(p+i)!=0) k++;0 a# p9 _8 ]8 n: G6 |3 l" V I
if(k==q)
' p. q# N. D* V# i" a0 g6 c { *(p+i)=0;# C% t$ s$ R F/ Y' C# y( D7 e
k=0;& {' _9 I$ Z1 M. O! A
m++;
0 n/ o, Z- Q) {8 i }
4 q; L P: K$ N) z- C1 y i++;' H" z5 H# D: y" B6 y3 o
if(i==n)i=0;9 J# f- L) ] v& \6 p D
}9 Z1 E7 T/ H+ k2 G
while(*p==0)p++;
3 v' c7 ]+ j2 c7 l printf("The last one is NO:%d\n",*p);
! N1 |! ?1 _# K9 F) J getch();
5 e' y2 M% g, I" X+ z6 S& a+ L3 R$ |. R( ]) Q4 d
} |
|