|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!& q$ d/ J5 ]) ?" j" g
这几天我在忙着编一个问题,我用了一种方法编出来!. {' s ?" I2 q4 e4 ^& r6 s
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
* S8 C/ y* ` M" V/ v注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
3 {1 X* I+ Y1 ?6 Q2 E
$ R$ P( x& b7 _4 K
8 r) ?& O5 ]7 Z5 o E8 p2 J& } 题目
- k# T1 w6 r: \& z# r山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。0 |$ D+ U O1 l! ?. I# d
第一种方法:利用循环链表
" X! M2 z, J S1 j+ Z1 l( L+ h: y#include<stdio.h>
. R0 _% ?# ^( h4 o#include<malloc.h>( h" G1 b/ A+ Z7 J$ e
#define M 8 //共有8只猴子1 f0 `7 P3 l0 k$ N
#define N 3 //数到3只时退出第三只
5 W- U) u( `4 C2 [1 ttypedef struct monkey) N c: {* s- a4 }5 N
{int number;
1 Y# f1 ?* _ |( p! |int flag;# W$ f: C5 ?: q2 @4 v, H$ |
struct monkey* next;
6 F3 c) a! A) `}MONKEY;, c0 @ `& E3 G0 p8 N( |
main() Z) ]! C7 Z: n- q
{ MONKEY *head=NULL,*p,*s;
* B0 t! n1 ?; s( u int i,sum=0,count=0;1 {2 L8 s4 g/ q; r
clrscr(); //清屏
2 U9 j6 O" A% }+ P; l; o* k- ^ p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
4 c" D7 L S/ }! s5 g8 L p->number=1;p->flag=1;- J i5 y) y% c" G3 {1 E" D
p->next=head;! g/ J2 v8 y* t8 i3 a, U
head=p;1 x- i- C/ u/ W% G9 @; r$ E
for(i=2;i<=M;i++)" P- d) s Q5 t w) k
{ s=(MONKEY *)malloc(sizeof(MONKEY));
5 O* H: F6 [+ L: {5 W s->number=i;s->flag=1;
8 v$ b; u. N% E: y s->next=head;
g3 s' ^3 u! Q9 E ^9 z. ~1 ` p->next=s;p=p->next;- ~) `( W& m2 d) h" }: C
}
; i% ?4 q7 q3 U p=head;
$ |8 }7 C& @% E: C; P7 J for(;;); l" M; v6 a+ t
{if(p->flag==1)
7 I5 L+ Y8 Y; ^# H count++;7 u- y3 T: H5 b. k/ @
if(count==N)# I( O$ M* e1 c( M. e- S" s! F
{p->flag=0;
" L9 e, }4 `7 P count=0;
. B) r$ s; ]; E; b0 n sum++;}& `5 L" ^$ E" A3 C
if(sum==M-1)
& I' C# g4 b" f- r+ H$ \: [ break;% h/ {& x- M# [- V: ?4 d" U/ w
p=p->next;
# d6 _% A& H* X+ O0 i { Z% F }
A) V4 `0 `0 n* ^2 m# Y p=
6 G/ O: Y- r# k- z head;( E- F8 Z8 G# u4 H b% O
for(i=1;i<=M;i++)
4 N8 T0 b& w7 ^/ P J+ w { if(p->flag==1)" n- a6 M0 R! f: F* ~. G
printf("\t%d",p->number);" @# Z5 ?# D0 [) z* |# B
p=p->next;9 O* P2 g! @% R& ]
}
: d0 I0 H+ l3 ]; v1 Y- Z- }
1 _: ?; n) V2 J7 q8 |4 b
9 v: [. T. Y0 v3 A, T
4 n' \6 a. S2 z: m( j" j2 p8 r} & E; z# Y4 \: W+ A0 J" e$ l
第二种方法:数组
: b) J7 y" r$ J* x1 F#include<stdio.h>' e/ U' q0 R0 K B, ~
#define M 8, k; ]5 f6 p6 O7 T+ H% t
struct monkey
* f% e: I# {0 K: o! Q* [. o" f{int number;
; `% @; c$ ]9 x1 A# D hint nextp;
; g( h5 }3 b W6 M( q4 U& y}link[M+1];0 O [3 T4 {3 Q' U2 Y/ X" x
. H. y$ B& _3 G N/ D
void main()
: l& r! l% P. c2 C! r{int i,count,h;3 y0 D3 z5 x: A/ l9 {
for(i=1;i<=M;i++)3 [4 R3 e3 `% t5 Y( A: j9 h
{ if(i==M)' @8 \& C/ r# ^
link[i].nextp=1;
! P( b5 z( c) Q! n$ U6 a else
! q/ B) W0 Q! ~9 q& t: u link[i].nextp=i+1;
6 W7 \6 P" u; \4 s, M, u# Y* m link[i].number=i;/ {$ f# I; r \; a q2 `9 a3 w
}
$ L1 _, f- r2 g, u9 eprintf("\n");
; L: U9 L$ O- m3 m4 f6 ecount=0;$ b; D1 X6 a; m0 t4 d+ o
h=M;
# |! x" c( r% A1 e& r: z4 K _0 eprintf("依次退出的猴子: \n");3 [$ m% c9 W* h- E
while(count<M-1)
7 P W7 ~3 t0 c1 u1 G+ P& A{i=0;
; T$ ^4 Q# n- z @* q8 @8 Z% twhile(i!=3)' B) J' _. C* {3 K% j, J, w
{ h=link[h].nextp;7 ?- F( d. k$ a3 k5 X& \2 J) u
if(link[h].number)
4 [( ^( i( s5 n i++;}$ E! }! t ^ e9 D+ z5 s' \& m, l
" l8 L/ \! x1 F+ r" v3 X K8 pprintf("%4d",link[h].number);
9 D2 P( P3 e/ M. @* glink[h].number=0;+ D: I1 [ t0 I6 ~/ B
count++;
: \) v% c# z9 k8 r; `, n C0 R' d}
- m) D* {7 X" e( a& d: h3 @: Q0 S' M( V; j1 t
printf("\n大王是:");
y# [0 Q2 H* x& I' y5 K for(i=1;i<=M;i++)
7 g7 {" q* ^0 e# h! L- P! p if(link[i].number)/ z( b7 v1 z4 c. |
printf("%3d\n",link[i].number);
4 j( \- W7 V* o. w7 h9 ~9 ~8 H$ w F' K! u J, \+ G" C5 b, H4 [
, A' p& y+ M H& K* _
} - E3 M$ G1 q4 J
第三种是普通方法for循环2 s" L- a- C# S: F! ` _
#include<stdio.h>9 y+ Y7 \1 D( T- w3 K
void main()- q7 m1 V( K! E( ~" k( }* x" L* G+ g
{ int i,k,m,n,num[50],q,*p;- ?: a; u; e4 k% K9 J
clrscr();
+ p) L: P) E5 Z" U% |, L# z. z! {* v6 L printf("input number of person: n=");; T1 n! ^- I5 w3 R: ^2 i/ M
scanf("%d",&n);
. d; C+ d& Z2 N f8 ~printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
5 r/ X$ b' R2 Y; a3 W6 v scanf("%d",&q);8 B' |) j c6 U- u+ \' s7 r
p=num;3 L: ~2 e$ N- f$ F
for(i=0;i<n;i++)
. G% n$ Z& d: }2 f; S( G *(p+i)=i+1;
, E6 x# [1 N- {6 q& W i=0;
1 ~1 [* ~9 b6 Y' \3 K k=0;6 Y, x) t# X3 K5 d! ?' s
m=0;
/ {4 N6 P1 X' m8 X: I while(m<n-1). F/ @7 @ d6 R( T" C
{if(*(p+i)!=0) k++;. A0 o2 O! o1 C, D. ^
if(k==q)+ B5 c' g" W; Y( ~2 B
{ *(p+i)=0;
' ]7 b) o2 _% A F- ? k=0;+ y4 Y3 {1 w1 T+ L" P# O
m++;
[# x3 F9 u. P2 Z6 C2 f }9 p' g. R4 Q9 J5 k) [
i++;
; d3 \' A( i* y# D: Y9 c! P4 M: o if(i==n)i=0;1 n8 M1 R/ S; o
}
% c# K0 h! u' V while(*p==0)p++;/ s F7 C2 b/ b( v Y+ g8 t
printf("The last one is NO:%d\n",*p);
! a; C; ]( g- Z6 m6 V/ D; V getch();
% x, {0 K9 M7 E* l$ N4 Y: o. N4 X* U8 T
} |
|