|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!+ z5 [; X- G* s/ |
这几天我在忙着编一个问题,我用了一种方法编出来!1 S) m4 |4 L3 F! |: m+ M8 T S
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!+ S+ t- l8 K- W( e; i
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 0 i6 \7 w$ I/ ~' R* U
% r) Z4 _; f9 b4 i* ]8 ]! u
, B: |* V. \% Q7 Q6 P 题目
: k. N# P# X. V2 E/ @, ^/ O$ r6 v山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。1 h! t1 K& P, M, G( y4 w
第一种方法:利用循环链表
9 w/ R8 Q7 ]6 T0 h#include<stdio.h>; @$ k- b; J3 e: ^
#include<malloc.h>( @: Y. ~/ T4 M5 v) \
#define M 8 //共有8只猴子
; P5 X6 z: k( c6 M) i( c" O0 o) S2 k#define N 3 //数到3只时退出第三只
) n: q; [( E3 w1 g- s A' Ktypedef struct monkey6 x% Q6 R1 [' Q/ g. t
{int number;2 f+ D& @) T% X) E- c3 x8 a
int flag;2 Z8 w; F- V, o* N2 Q2 z% J
struct monkey* next;& e, g. o4 k H8 T; w: T
}MONKEY;% e2 C5 Q" b) k. X8 m4 N
main()) K! k8 B( k+ U, b# h9 N) A' O
{ MONKEY *head=NULL,*p,*s;- E$ B7 x$ {4 K; {8 P1 S) U
int i,sum=0,count=0;
& P6 C2 b! u6 x1 J5 x clrscr(); //清屏7 A0 k5 G/ y; H8 i1 X2 n( k
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
$ N$ T$ ?; _8 x+ d7 N3 \6 _ p->number=1;p->flag=1;
3 g4 Y- p7 I' Q p->next=head;! R4 T% n, z3 s- e1 i1 o
head=p;. _$ J# [- q7 _+ K8 m% k0 l4 w% X
for(i=2;i<=M;i++)
! s0 o; Q: Q" w: S/ U) I { s=(MONKEY *)malloc(sizeof(MONKEY));
. q# n" t0 i7 ^) I2 i s->number=i;s->flag=1;4 y v) e$ ~' t2 V1 x
s->next=head;6 H' H9 R1 G3 ~( N* r4 V, w9 h
p->next=s;p=p->next;+ F* k6 h0 F6 n6 F! E
}5 T% Q# `0 @; Z2 q* @8 |8 y
p=head;* l3 E! c6 ^) ^, x- W9 l, k, S
for(;;), b8 H. f2 D, Q- b. H( h
{if(p->flag==1)
2 E+ x5 z3 K7 K) ~5 ^7 D count++;5 P) ?% C& a6 v- p( m
if(count==N)
, T r5 c9 p( h$ E {p->flag=0;
. B3 h3 A0 T! ~- I j count=0;1 s% f0 [% S% l( B5 i3 \* w
sum++;}
?% }; k) t. ~4 I+ f if(sum==M-1)4 X7 P8 Z0 e# N! T2 s- Y- d. a
break;. O1 [ D7 H, v. @% c) }
p=p->next;/ X# C$ \$ _0 Y& c0 @
}
2 X) l; k8 p' s, Z5 C p=
8 H# Q% |9 Q4 x0 J head;
- ~) E* X* m0 K for(i=1;i<=M;i++)
4 G+ J# Y8 ]: [ { if(p->flag==1)
% r6 @; H7 E( L1 ? printf("\t%d",p->number);
) t5 I. N, k; b' s p=p->next;
- r1 N0 S% j5 @$ b. J( S _ }$ S0 ^, y: g, g1 {2 x0 V
: e( f" _7 `" y/ o5 Z$ p7 F0 c" R# x# x
% C/ }" h7 N5 N; r$ N9 g7 s( M
} l' }1 N r9 ^0 z2 ^& n
第二种方法:数组
0 Z2 P6 \9 F, o; Y#include<stdio.h>
. ^" U6 a. e6 {, Y1 t' R4 c#define M 8
1 t% _" Y3 O# t2 n9 Rstruct monkey7 N" [7 S. I8 f" e. C
{int number;
W6 S" e, Z+ Y3 F3 |int nextp;. N$ v- B& y$ b
}link[M+1];
$ e; I& F! `! F1 O3 k8 c/ c& Z* d# ~/ u$ @, j( L& |/ I' ?
void main() @- _! g; O" D- V8 D
{int i,count,h;' h' b4 Z! p/ \+ @
for(i=1;i<=M;i++)
/ S, v2 N- c" ~6 p{ if(i==M)$ t) p) \7 C9 V. o& s: @
link[i].nextp=1;4 Z4 X; \5 C) n7 f! A. _
else
3 D* A! S/ k7 w$ J, @ link[i].nextp=i+1;9 U- O2 K2 |1 w5 ]9 b
link[i].number=i;+ }1 g7 Y& V2 n0 z+ u, ^
}
! _6 [, o3 z7 o' Eprintf("\n");
6 [" ~" k+ r5 B7 M x! I3 ]count=0;" p0 {3 D6 J( _. z& u/ Z3 h8 |2 T
h=M;
: K2 Y5 M; R" r8 l4 c kprintf("依次退出的猴子: \n");7 L0 E% P! @" b. U" j
while(count<M-1)
' x8 f3 T+ }' o- l+ t2 `4 P4 W{i=0;
1 N% W j d- G0 [0 ]# B. }# Vwhile(i!=3)
( x" \4 O5 n) @3 }1 r/ i7 x8 ?{ h=link[h].nextp; x7 Q; N3 y W
if(link[h].number)& x" H, u2 J% q. p
i++;}7 W& Z* U( M8 f' `1 I
4 y/ V) n5 `: W0 g" i1 V" F1 S
printf("%4d",link[h].number);
! K1 w9 I7 d4 Clink[h].number=0;7 F+ F' q: d7 q0 w& {
count++;
6 P3 {4 Z( c* \' | Q7 k* i}
' m1 D6 [, H) A# n( r3 S7 E6 ~( \' V
printf("\n大王是:");3 b. f" ?/ w }) O( @# c; n
for(i=1;i<=M;i++)
9 e* t6 v) L- F* G3 ?% p' A if(link[i].number)+ V! y O7 a; `( P# U' S
printf("%3d\n",link[i].number);+ Q: s, @. V* j! j
1 }1 R# H* |, G6 a9 d! w3 f, X, T" J+ W. c, L# H
}
- q [0 O- u5 @; y& D5 @( z8 B5 w" g第三种是普通方法for循环
, k, y6 N [& T#include<stdio.h>
; l. H1 Q3 J/ p) L; b9 Ivoid main(): w; b( j2 Y7 c; L& W/ Q8 W
{ int i,k,m,n,num[50],q,*p;
r% F0 a+ L. z1 |) ^4 w clrscr();
! A& K- h. J/ e1 t! q printf("input number of person: n=");1 g. j5 E+ o: k; f, q4 s
scanf("%d",&n);! _& S2 X/ n8 h
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
' N4 b' J# P$ z. R& l scanf("%d",&q);
: a9 \) X0 b5 Y& j& o! S' x r p=num;
* v( i* w: O! Y5 _9 f% d: Y for(i=0;i<n;i++)
- o8 o$ j+ ~8 {, P/ t *(p+i)=i+1;7 n& t$ ]7 }9 `; p; x
i=0;9 k# @0 P$ G3 G+ j+ q; R2 L! O
k=0;
) t' v0 I! ~' K m=0;7 Q/ @/ q R1 H' _* O
while(m<n-1)
: R" T+ ^' u9 g* ?0 N5 H, g4 r {if(*(p+i)!=0) k++;& r- Z; ~& ?, V3 _; y9 V' l% Q
if(k==q); J& V' i6 _7 d$ g
{ *(p+i)=0;
" ]6 k) u/ |+ |6 ^) L: C3 R J k=0;
% y, l. T5 w: O( }/ u, W: |6 E- h m++; v( B j& `+ z1 e, X
}
, F& _! i2 H9 O i++;( L0 b! K* m$ ^" n* \) ^
if(i==n)i=0;3 f* l: p/ S, k: X: R! X2 e0 }
}# m( R$ S2 Q0 ?
while(*p==0)p++;/ M) M4 I7 `; R, c; S
printf("The last one is NO:%d\n",*p);" D' a% @# G( j5 \5 x* w! q7 s
getch();
1 ?5 E1 c/ i4 b8 G( Z* b! g1 {& g7 `. \! R) e: @! J( j( r
} |
|