|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
3 C% w+ y# z" Z; C8 p这几天我在忙着编一个问题,我用了一种方法编出来!: J: I* Z H6 A5 m7 U; ]
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
% n& _ m/ C/ ^8 D注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 % [* \- G$ c$ Z1 I4 T( B0 C
3 @ ^ x/ v# p! S7 G
) v& g" q: \; [; Y9 _8 u 题目
" ?1 }! o: Y) b8 u山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。$ t. n# d0 H2 ~$ m
第一种方法:利用循环链表6 P- U1 ?" U) Z8 R
#include<stdio.h>% h9 A7 J' x8 M. n
#include<malloc.h>
( ~$ w- u' Q/ D- j0 K#define M 8 //共有8只猴子# j! @4 d$ |; p, `9 j
#define N 3 //数到3只时退出第三只
4 R; E. X) z6 K- b& d# \) ]6 wtypedef struct monkey
+ k2 I& V& p2 N; ?* z{int number;
; F2 ~3 v. Z+ m3 }0 Aint flag;
6 Q. X# G3 h) m3 g3 {- Ostruct monkey* next;
4 ^2 e, {$ t0 X# w- m4 L$ ]- C}MONKEY;
8 U) Y* l1 ~, w: V% @5 Rmain()" M: q5 E, g+ I9 n4 @. N; `' V
{ MONKEY *head=NULL,*p,*s;
0 y) a2 M1 Z# k, h& S int i,sum=0,count=0;6 g0 f$ T& L& w# B" l; x
clrscr(); //清屏* `/ F* T/ l( G: r2 w
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
, F6 o$ @2 P3 ~* Q p->number=1;p->flag=1;
9 t, M- K* E N5 n) @5 k p->next=head;
2 z9 |; V- H+ B head=p;
' C# Z/ J/ A4 d/ d) n for(i=2;i<=M;i++)
: M& o5 x" U4 Q& R; ?' L { s=(MONKEY *)malloc(sizeof(MONKEY));% p4 I6 a, ^! g( B+ v& R3 v
s->number=i;s->flag=1;( p+ @; c3 e- d! j
s->next=head;
" v* i/ \9 K- H0 K" _6 E: f2 T p->next=s;p=p->next;
; X8 m3 A* @% L" V6 x. Y' S }4 Z; |0 E; Q' ^5 X( P
p=head;
1 ]7 K( J' f) E) [ for(;;)( s# w, y2 a$ ]9 m( l
{if(p->flag==1)% }7 r5 c$ O6 R) n$ |- D$ e, s( ?: }
count++;
# i) y5 C5 w2 } if(count==N)
! D6 }0 Y: S7 t4 m1 H0 Q! t9 O+ W {p->flag=0;
) O0 l w1 |$ d- @. A- T1 { e: g count=0;! i% R' Z+ H1 _# y. i- {' C; Z% F9 p w1 Z
sum++;}
" _/ |/ q+ ]! a) b/ i6 ? if(sum==M-1)
; F; R8 l9 P8 c4 J break;
- s0 H2 ~8 v. Y4 {9 J p=p->next;
* z; T% k& F! S9 |. p& @ }
% U+ R! c6 \. a& h p=9 o2 S, q) }& x9 G: J% A- k0 D
head;! F* C& P: [8 P9 @! x
for(i=1;i<=M;i++)
5 G' t, A- ^9 j# M! d { if(p->flag==1)/ v7 R0 v7 ~2 S0 f* ^& Y* K, q
printf("\t%d",p->number);
6 _( u: p5 O& P9 s p=p->next; ~) m' H1 P8 K- K. r+ I
}* a" d |% u' {* |( Z% F
" H: h$ a- ~) } a2 M5 G. g d: M5 k8 v; i
3 R0 l: ~/ Z" c; Z' f# \
}
. k- H$ a) A- ]/ X: b# q( a; V第二种方法:数组
- C8 z3 a' U) E#include<stdio.h>. N+ b* W( X7 W/ @
#define M 8
D1 I9 b8 b1 o) L7 W7 [( mstruct monkey( r- P+ t$ q$ B/ U
{int number;
! L; n' v# `, B$ ]' hint nextp;6 c% b& K1 b5 y, ^
}link[M+1];
1 ]8 z, y; i" h$ q- X: s$ F. F, [0 E' S$ M& u# l
void main()
! Y2 Z; `3 I9 |$ U2 R{int i,count,h;. y! t$ G! ]3 i& {7 }0 V
for(i=1;i<=M;i++)
, c" z2 b3 G& Q% k. R6 a{ if(i==M)$ o+ B$ n+ j1 d, ]
link[i].nextp=1;
* g* x8 `+ ~- s+ t) U- ~- c0 w else% A9 S8 @. Z& O
link[i].nextp=i+1;
( \3 i7 E7 ], M% w" c3 B link[i].number=i;
6 x" D0 [$ u' t- l" F2 r1 ^$ C}9 }- ~& ` }( X
printf("\n");
& M* `0 R1 R& X% @; S+ }9 I; gcount=0;
. @7 r! ^4 `" a- |* _h=M;
6 k, A" m2 H* O2 d& ]printf("依次退出的猴子: \n");: E0 g& K, f4 L0 v! ~ O
while(count<M-1)
# j: _; R' }# h! _; `& G# B{i=0;
; a/ H8 ~9 g: T' ]) m" Wwhile(i!=3)+ j8 @0 m3 Z1 c/ V& ^& ]
{ h=link[h].nextp;
' f8 u4 u4 j0 x5 K& v: e if(link[h].number), l F3 U# R( O# j
i++;}
" H ~: z3 w+ W+ i7 ^: D0 Z4 g* Y& G% k
printf("%4d",link[h].number);
8 A( b* Q9 s" C) d3 ?! E- z7 Tlink[h].number=0;
* H3 n J+ S N r: n1 g8 Fcount++;
6 o( |7 H; N3 [/ S' U& O; p}
% c$ g* U. [, q4 U- F) y
# y( K# ?5 z9 \printf("\n大王是:");
3 K. f1 c7 G) e* b6 e+ \ for(i=1;i<=M;i++)" U8 ?; d9 s( I( Y6 ^8 L
if(link[i].number)
$ d& g7 A) n' F1 |+ ?7 J( `3 d7 T printf("%3d\n",link[i].number);
" q4 _ P3 z9 f7 D' J- S
; x F, ?' ^0 m |' B6 [0 j0 s: \7 d
}
, j4 ?5 q" k* I% q7 c! P第三种是普通方法for循环5 b u8 n* T, p' }2 u
#include<stdio.h>: G2 P) @- e" n" I
void main()( `( d! P9 S% Z/ c% z; W
{ int i,k,m,n,num[50],q,*p;2 \9 v5 \5 ]' H. i
clrscr();
/ ], A8 R0 h5 q( n( ^+ I8 n printf("input number of person: n=");
" a$ L; b, t7 Q3 U. Z9 c scanf("%d",&n);4 V7 V! G6 A3 Q0 r6 c
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
0 {, E8 v6 p2 |( y) t6 W, @ scanf("%d",&q);
; y( ] J- N6 S p=num;
6 Q, P( Q: s. V9 i9 G! G: v for(i=0;i<n;i++)1 i* `2 ]0 b1 L. q, e4 r
*(p+i)=i+1;
& i) [( f* d: G; o( {0 o0 \ i=0;, D; `8 Y @" C! R$ f
k=0;0 F8 j, I8 |0 L- F1 v/ J
m=0;
3 k' H' W# j3 X+ w7 C: ] while(m<n-1)
% H1 w% j) U. a {if(*(p+i)!=0) k++;" Y& F; \- ~1 ? O3 v
if(k==q)
# s0 C0 f7 S& u( b( r2 @; A { *(p+i)=0;$ V# h3 C! g8 z/ w7 Q0 H
k=0;
. _& ?# V! _2 z& f O$ ]( { m++;+ O/ \1 ?; K9 B: t0 V
}
8 @; n( ^ ~: m8 j7 f. P4 ^ i++;- H- Q9 o- y5 t% f$ r$ Z6 e
if(i==n)i=0;
$ b% N" f. j0 |) b }7 d; N+ R/ o+ J G$ t
while(*p==0)p++;
8 J& m* o _" [5 h printf("The last one is NO:%d\n",*p);
" P% H. N d- b getch();
" `/ m: F- F( `7 H5 p' b6 h7 }* e" B5 i4 k9 J3 U
} |
|