|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!* f+ h/ S& M7 A& q9 `( Q, R0 }
这几天我在忙着编一个问题,我用了一种方法编出来!- [- L% z& x( F. z
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!6 c4 L+ p4 o( ~1 C7 l3 r. }
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
! p) U) G5 o9 w6 x- m( j
: R4 D: f4 [* {7 l% H5 n @7 S4 Z0 b2 o5 c0 }2 z% |
题目) A" C# c% V. M
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
' F9 j/ V5 M( }/ z第一种方法:利用循环链表0 |/ u, y; M9 B5 P3 T+ }
#include<stdio.h>
4 D- u/ g* s6 ~* U. n! k% ]#include<malloc.h>4 B; O) J8 J1 \: [3 V0 u6 K5 p' m
#define M 8 //共有8只猴子
" h6 D% _: z+ i6 J0 F8 ^; S3 _* T#define N 3 //数到3只时退出第三只3 h7 q' y9 ]4 \% Y$ u2 q) A* D2 K
typedef struct monkey
Y. e' K. R4 W T4 q- I/ Y{int number;
: G4 _+ X4 h& Y. D# o, \: N R! Eint flag;
* d' [' v! I! c3 B' Tstruct monkey* next;
, S% `+ j% R5 h0 O. U9 G}MONKEY;
- t- K2 P& O. ]& ]* F9 kmain()5 Q* X% Y4 _) X8 s% Q
{ MONKEY *head=NULL,*p,*s;/ Y8 S0 G7 o$ L. f9 m6 A9 |* y
int i,sum=0,count=0;
! N& y. `- a6 y clrscr(); //清屏" v8 f. Y; a9 {
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存! i( _( d) j/ G* x
p->number=1;p->flag=1;6 F# H9 g% T4 x+ O/ B# Z
p->next=head;# I# q. A. |6 D: z1 l
head=p;
& v. `" N7 P; | for(i=2;i<=M;i++)1 H. t, D5 t- v* x9 X% e
{ s=(MONKEY *)malloc(sizeof(MONKEY));' b5 v* n- Z3 e, m, A1 w: j, j6 F
s->number=i;s->flag=1;
9 w2 s" l7 D5 H8 N. S s->next=head;% z" Q1 I: r0 d$ R( d
p->next=s;p=p->next;
9 W& U( w7 r( H7 ?, p' W }, O1 k b- y0 a$ `+ u
p=head;- V, ?5 {4 @4 F: _% J3 I
for(;;)
6 \9 |/ U, J+ k$ A/ w {if(p->flag==1)
* o( ^* x+ J6 a, E count++;
0 n* z4 C+ e, W0 Y" R2 u4 g! p if(count==N)% k) ^+ H$ A! C: r2 o
{p->flag=0;
& m% v9 v* G$ f# |( r' ? count=0;
$ M+ m: O$ k" X \' A% L# c; N0 u sum++;} g+ ^5 |. E6 |4 h, d! A
if(sum==M-1)
' q" f. @" E0 m( H) y& I7 k$ c break;/ [9 [: A: ~3 R% h8 N8 f5 \
p=p->next;4 G4 m7 M+ `' U. C
}
3 u1 p/ u: V9 \/ g% R3 E p=
4 w+ F1 Z8 ?) O head;0 n) o9 o0 H2 B7 B9 M
for(i=1;i<=M;i++)
3 O8 M, J8 @) q7 D% `4 r. K { if(p->flag==1)0 E! X" D$ e0 i. Y2 v
printf("\t%d",p->number);/ h @% h& l& r0 J+ u
p=p->next;
; T, ^% S6 }; c& @0 E }4 M* u5 [4 H- M
- h4 p7 h- U$ y: D4 Q
* l7 {$ p3 e t1 X4 a8 u) E7 `( x) I8 M q+ k
}
' ^) d- a0 v( M- O0 y4 I第二种方法:数组. J* l, z P+ M/ s2 K, P+ E
#include<stdio.h>, V" n) _7 h2 Y
#define M 86 j( O9 W7 f. ]8 g$ G
struct monkey8 y0 ~4 b2 [# w( Q$ ]. t1 @0 l
{int number; a0 _2 X; y; c& e' V8 f
int nextp;2 U9 d! S4 x l1 ?! X" H1 s" |
}link[M+1];
7 z2 Y! J3 ~& D9 z/ x; }. a) g0 H8 O* P" j: P% v9 D
void main()
1 Y% q8 e5 o4 x" W6 \) N! ]8 ~{int i,count,h;2 y u, h2 Z' U' _+ }. R& T
for(i=1;i<=M;i++)6 R6 m; b1 n: ?, H
{ if(i==M)
6 ]* V& a3 }, E) d: R7 ] link[i].nextp=1;
1 Y9 y0 d% A; D4 w3 z+ A5 j) Y else
9 n. b) _+ t6 n/ W0 E link[i].nextp=i+1;
# H1 H; |. ^4 n* ]' k$ h2 K! X link[i].number=i;
5 w( Z1 }8 U# G/ D! ?}
. V; G' V \! N5 \* }( U7 @printf("\n");2 Z0 t& h$ S% P0 f
count=0;
& e9 e D2 i: c/ b4 w# sh=M;
/ Y! O: p! y7 `printf("依次退出的猴子: \n");
* U9 b3 B: D! j) X# C1 X/ ewhile(count<M-1)' u2 d) D |- I
{i=0;
' E ]1 j9 p3 x5 h9 Rwhile(i!=3)
. p O5 \! t- }5 l9 ]6 i& Q' p{ h=link[h].nextp;/ D5 b' w8 y2 L8 t
if(link[h].number)
% l' @6 T* ]" `' W# T, V3 F i++;}
# s) u: T* @* B' b. K/ t) M' R
7 f! R/ z# d& iprintf("%4d",link[h].number); H0 H: H8 `% [/ X7 T y
link[h].number=0;5 L+ A# H: F0 v$ w3 I5 G
count++;
% q9 n; G, D; z2 c}9 K' e |* u0 A
, c, d( ]9 _9 U8 Q" `8 P1 j1 mprintf("\n大王是:");6 D! L! P( t4 `
for(i=1;i<=M;i++)( b% y, q$ w( E- C: e' Q
if(link[i].number)
V1 h; [6 ~. E( _# ]( |2 l printf("%3d\n",link[i].number);! v2 V8 _7 q( e
. E2 c, p/ a! C% b) ]
" @( {, I5 K5 ]9 i6 d+ K
} 8 Z4 g3 z, }/ x* V* V# Q
第三种是普通方法for循环, |4 `$ s& m1 ^, X. }! b" n1 C* P
#include<stdio.h>
2 `8 r2 X/ Q8 Q! M( B& Ovoid main()/ J+ O( t6 M% \: L2 F
{ int i,k,m,n,num[50],q,*p;
- Y" @) t# |0 Z! [6 P) V; U clrscr();8 t/ U/ E3 k9 k- N* A h) x
printf("input number of person: n=");
; I8 K* m3 a& q1 b$ k scanf("%d",&n);& D+ t. f6 K$ t; y1 ~! Y4 O
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只/ k4 @! G& T5 v- d
scanf("%d",&q);
7 \5 }) N( I( w4 r3 [ p=num;9 i0 ?, T# [8 N7 t- n7 N& W
for(i=0;i<n;i++)+ L/ G$ h' c, v9 a
*(p+i)=i+1;
- W# U0 M B2 ? i=0;
# U* X% n7 p8 a3 `2 W k=0;
- j3 i5 X$ N6 h m=0;
8 o: w. G V) K6 j+ Z while(m<n-1)
% j/ M* M5 p8 F( X X {if(*(p+i)!=0) k++;' S4 R+ l+ c5 }* V0 [2 R
if(k==q)! o5 c8 k0 a/ p! A- {
{ *(p+i)=0;6 B- ~3 p0 X& }
k=0;
7 r" a3 N2 d' g7 C4 C* ^ m++;
! l: W; S+ _4 B( R/ w. P5 W }
) m8 r. h% q: T" F8 _ i++;9 Z2 Z" y$ F* U
if(i==n)i=0;
$ J+ h/ n2 P1 X5 y$ A9 _ [ }+ ?, }& g3 U2 N
while(*p==0)p++;
1 L/ P. `& m2 H" } printf("The last one is NO:%d\n",*p);- a1 K9 M. a4 C8 V( H
getch();
2 i2 s0 T$ z: v# b, w% }
( O4 @& \4 w! L0 d0 \! L5 G} |
|