|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
8 b& F' j, E4 g5 m( g" \8 T7 @% q这几天我在忙着编一个问题,我用了一种方法编出来!
# W" W* {# `. ?/ X9 n; ?' l) S. G但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!" I% t! F: r) p/ @1 s R/ b
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 , e1 l( y% j. W. M2 ?; | h" S
& n' z. E- r3 |( i4 G4 ~
5 F! l! Q% @0 q
题目4 k- o; V( j. a1 i
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
9 H& L; ^; V s1 B( { o3 a第一种方法:利用循环链表
" p3 s" L+ Z5 Q4 N#include<stdio.h>3 C0 E0 K; a/ d
#include<malloc.h>
* H0 r6 ]2 z" {' `#define M 8 //共有8只猴子
" ]* ]) l- D6 t) f2 T3 I$ \#define N 3 //数到3只时退出第三只
) N5 O1 @2 U) O; c* Itypedef struct monkey Z. V% e! B+ Z
{int number;
: ^* i; e8 q2 @6 jint flag;4 J7 _. ?5 T8 S, ~9 A
struct monkey* next;
7 `% M4 d5 s/ a$ ]& z}MONKEY;
) D& @ E) [ n; lmain()5 x2 I6 a6 q' I1 x& y3 |" H1 }
{ MONKEY *head=NULL,*p,*s;4 S6 \' h8 Q8 P4 F
int i,sum=0,count=0;0 a- C9 g0 e4 J& X* u' t9 j9 A7 }/ B1 W+ u
clrscr(); //清屏
; _" l$ j4 {+ {- P! a9 F3 A, h% H9 L* X p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
% @+ j- O: C% \: L p->number=1;p->flag=1;4 E) V) @9 O8 ]) K6 m8 M1 x& {
p->next=head;. D4 J: J& f) ?: d; U; V$ a& W
head=p;
$ D8 R5 K1 Y. ]+ ~$ h" x% f: m for(i=2;i<=M;i++)( z7 F P1 J4 C9 @$ t
{ s=(MONKEY *)malloc(sizeof(MONKEY));
1 u+ R S b/ g1 q s->number=i;s->flag=1;6 A J* r) `) Y1 }6 o4 a
s->next=head;' q! a& I% a: R( F- D
p->next=s;p=p->next;
/ g. h) F! c- P: m I }; G6 i0 }, _* r& w$ M; n5 M x: y) g
p=head;# K0 J% Y+ ^) y% P, _& Z' a/ p
for(;;)
) ]; {7 A, B; T0 t0 Z {if(p->flag==1)
# u8 J. @. A% ^% ]( v3 k1 \+ L& L count++;
% J* F# `$ L4 u3 Z1 O% r4 A/ l if(count==N)4 a' b T6 m: A6 K$ `: V
{p->flag=0;
! u3 f. o! ]7 n' f6 ?. | e count=0;2 f. P O! {/ W& G W! j* R# f! B/ ]6 }
sum++;}
8 S# \& E. f3 C, C/ X t; S, v% e if(sum==M-1)
$ {( W$ e. w( i2 g1 h break;' C: G J9 m; [" q8 i5 c8 ~
p=p->next;5 i4 k. { @+ a. p1 O
}
* P7 I; O6 W' H& m5 m* u p=# L$ V* n2 N! B s S
head;
2 v& e( ~8 R' y0 S! G for(i=1;i<=M;i++)* A( d$ F! A+ q0 w8 P d1 D: J
{ if(p->flag==1)2 N0 M: c4 q( R( r+ t# P
printf("\t%d",p->number);
1 D" @8 O- |. V* ]! Y+ f p=p->next;* Y2 W! S8 @6 k! E. L# y! ^
}5 L F9 |3 ^+ e" _. D
5 R- a1 w$ |# R
% _5 ?- @* E e1 d& q" b2 P( L: l
- `2 e0 ~6 I8 i* z
}
6 v2 v1 J" z) T$ k, T! Z- z. b第二种方法:数组
5 [, Z$ U3 s- {' @, c+ P. X#include<stdio.h>
3 U$ a t0 B% [' S9 W: V#define M 8
8 \: m1 G; e, {. U! Mstruct monkey! t7 C0 x$ B: D0 Q) {
{int number;$ b$ ?, `. n5 _: p
int nextp;1 C) m* y" `1 G+ C
}link[M+1];
+ A* s5 s- I3 l# p0 B; \* s4 L. }2 P+ M, G6 M" @) x
void main()
! o3 o' |; _1 x" |. z{int i,count,h;
! Y( S' g/ c( Gfor(i=1;i<=M;i++)
3 y( L7 k$ E$ A: s2 d" k{ if(i==M): `: t" m. k$ u9 `& d2 c) K- d
link[i].nextp=1;
# v; |( X3 e+ N, _' g( o' u) v else% u1 X: r5 f' W4 \) i! \
link[i].nextp=i+1;- X. H6 B9 X4 P0 h# X ?
link[i].number=i;2 d P% H* f' j+ _. `4 O5 ^
}
- M# u/ |- t& S2 |/ A1 ^- u, ?printf("\n"); p% E( D* I1 o% \. W
count=0;3 V5 J9 o. @5 S- w. ]1 N
h=M;
, p; Z' X( P& g% N+ \printf("依次退出的猴子: \n");9 ]+ y7 T# K+ v% Z1 l3 d$ m
while(count<M-1); `9 n+ n4 G& w; H0 G. Q# a' n
{i=0;
! Y0 V4 |' \- H3 j" Dwhile(i!=3)
, V) X/ ~9 I4 h1 A% k4 G% Q{ h=link[h].nextp;$ g* s/ g. {3 w5 k2 S& s
if(link[h].number)$ k; C# D! B W/ L
i++;}
$ a( p4 |& Y. K6 E( ]% m M6 c# v7 p$ R2 h
printf("%4d",link[h].number);
4 s2 K c, _ z; V, G5 S" G. qlink[h].number=0;
) c7 T4 M d+ g& f* S6 ~+ ?* jcount++;
" ]+ R- {" N5 A6 A4 U& w( j! z}7 ^! l. ?# X" y
0 r! u$ Y; l1 V" N- {4 sprintf("\n大王是:");& h/ z. d( w6 c( p' M
for(i=1;i<=M;i++)7 J0 y/ V) I/ Y) u" A0 H1 ^2 X
if(link[i].number)5 m2 P+ Z# a5 L! V8 F. i0 c1 ^6 f1 s3 |
printf("%3d\n",link[i].number);
$ ]7 G% _1 I' x: V8 A6 J% n( x' i% _* \; C
0 G3 ]+ U: ?" B! _6 b}
% s4 z8 L; v: r) i& Z6 C第三种是普通方法for循环
* i/ u( n% b& G" P& w#include<stdio.h>; W( e* |$ K% Q% w
void main()- P* M& z" K0 ]
{ int i,k,m,n,num[50],q,*p;
5 _) t/ R' A7 D4 _- E8 m clrscr();
/ t( W2 W a* p+ g9 X printf("input number of person: n=");& g# X6 |0 {: N! z2 a" O ^7 A
scanf("%d",&n);" z. b: z Z9 W6 }. u$ H
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只3 H& s" Z" Y$ Z. s5 f
scanf("%d",&q);, ?3 R- ^& Z6 x0 G# a, d% Z' ?
p=num;
3 Y) x' j; b, F e: @- H" ~ for(i=0;i<n;i++)
/ t; G* K' N$ E$ s *(p+i)=i+1;
" P% t9 |* n. I* K6 M. T! j! p7 r& M$ v i=0;
# ]6 a y0 x& E5 g# d4 `9 U4 b& Y k=0;
5 ~& M! v8 W& l( @' i H% P9 p5 V m=0;% @8 d7 s( W% u. m3 h- d
while(m<n-1)+ _. f& u0 t2 D, c0 `
{if(*(p+i)!=0) k++;
/ H& H& H6 Q; e6 j' P9 C$ A if(k==q)
/ i" h% q! V! X8 M! o2 O. O/ G% K { *(p+i)=0;, I6 f* ?7 O3 ]0 F4 p
k=0;
* f, C3 C+ c/ K& p: C) S m++;
$ _/ X+ d6 q: S/ _ }8 q. `, i7 v! t% R& D8 t2 z3 w
i++;
: K, V( l) x- G0 W4 j, s/ A( G2 l" z if(i==n)i=0;
& w' p( W( K9 ?5 S8 U/ t1 M; Q }
+ l# ]! L: U! \! J, k while(*p==0)p++;
- c* j6 n+ ? n' C- i4 i, f printf("The last one is NO:%d\n",*p);
2 ]3 k: j* t2 a- V) M3 I) i' x getch();
5 V" ^) N7 r/ j1 i& _. N6 V. Y+ x) C- `- L& l
} |
|