|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!: N$ s$ m. q: |8 n6 m
这几天我在忙着编一个问题,我用了一种方法编出来!
k, `7 A. D$ h但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!9 s* M. }' ?+ q; F. i
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
1 H/ ~8 y" o) _" F: K7 o/ s% C* q0 {9 t! [* N2 g3 e
/ C$ l l/ q: ?, W K2 G
题目
6 |4 t2 C+ X; t: Y b3 P- {$ P山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
& R9 h4 F ^$ A* n. D/ V" R第一种方法:利用循环链表( k3 `( [, j/ G
#include<stdio.h>
5 I3 l1 `6 i; x @#include<malloc.h>) v/ ^' b' r' `! _! ~2 i: t+ b
#define M 8 //共有8只猴子4 z" i1 {; j2 Y- t; |
#define N 3 //数到3只时退出第三只# \3 M( O4 |" ]+ K3 _, U5 {
typedef struct monkey9 ~9 @# Z% V7 A l. R+ }' u8 F" y
{int number;( r2 u+ f g0 g0 o) h
int flag;
' x% L" s/ p8 J, O+ s- Bstruct monkey* next;4 E5 L' @* v- I' B
}MONKEY;
5 N" D( {/ ?# T* Y; B$ a5 hmain()9 c! o9 N5 j! K# o9 ?
{ MONKEY *head=NULL,*p,*s;0 |* u; }5 B% k$ {: Y
int i,sum=0,count=0;* J, y# w/ n2 ?# r) R
clrscr(); //清屏0 _$ J5 j3 v* T" E8 Y
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存) v* p" }$ i+ E; j9 o' s4 h
p->number=1;p->flag=1;( z; W4 a$ u3 ]+ j
p->next=head;& w! e3 p* ^' i: V. L
head=p;+ L4 t, [! |* c" [6 V; S8 k
for(i=2;i<=M;i++)9 w5 n" [1 C6 d2 ~/ @7 G/ J: F
{ s=(MONKEY *)malloc(sizeof(MONKEY));
6 ^# {. ^) i- v( f$ t s->number=i;s->flag=1;* B ^- D& _! P Z9 Q9 @1 D
s->next=head;
0 P9 v( h( p' P! k3 T p->next=s;p=p->next;
- k' n/ V4 w* \( A7 a/ x% B; z! z; O }
# n7 b8 F1 O7 G! ?) Y p=head;+ t$ b! [2 M, W# K7 W$ V, u5 ~* Z
for(;;)
; w' U7 T; t! M/ r W/ [. V {if(p->flag==1)
" ?+ J- i& K D! R8 ?- x# u* d/ [ count++;" L- V2 H' F% @2 Y' A( Y, j
if(count==N)4 @2 ]! r9 U) k6 Q' F# g
{p->flag=0;8 `) B5 G* Q1 S8 {/ t
count=0;
! Z) L" n, e' r2 D, h9 V sum++;}. K9 C- I; c D9 m" o
if(sum==M-1)
6 @! G j i/ B4 @# ?7 Q5 L2 L break;# f* ~8 b. o( \7 X- c
p=p->next;
6 w! W$ V8 i# X3 S9 N, {# Q) K }
. V: U0 U$ l4 h1 H* K' _& k" }% C# F p=
X+ c$ s2 k; | head;7 K1 k+ Q; @* K5 Y7 G* r! Y# \
for(i=1;i<=M;i++)
6 p4 [7 t) f+ R% c4 Z { if(p->flag==1)2 N$ X7 N& V, T b) A j
printf("\t%d",p->number);" Q0 m8 |( c+ x8 F- P0 m! R
p=p->next;
) f- m9 l# H" l P7 E8 ~ }
3 p; V6 t% R5 ]' C$ w& |! Q
5 L" b. Y3 ] m* N; t
5 o/ C p) ?/ p2 ?4 |2 j) _' N( S: l9 s' Y& ~/ z
} / B$ a; P+ f3 W6 e4 X1 q1 M& F
第二种方法:数组( U& s0 V" J' A3 t: s
#include<stdio.h>* W1 l5 k1 |6 X, @/ ~1 v; U3 D
#define M 8/ ^7 `, f% ?4 w; W4 u" ~4 p5 G6 D
struct monkey( k) g8 w' `6 T9 }' l: n
{int number;
3 b+ D/ W G9 \6 Sint nextp;! v$ k* H2 h/ V, `+ C6 w
}link[M+1];2 n% x, @/ V0 w, ~9 F8 s( f
8 j0 R' K$ x/ Z: u6 {
void main()# z* K7 s4 ?2 x. @; s
{int i,count,h;
: _$ Q; ^7 n4 Bfor(i=1;i<=M;i++)) q: c/ @9 U: z }
{ if(i==M)/ I3 S) ]# A) }( h: e( `8 U; W
link[i].nextp=1;( F) r. j2 J/ z0 H# i$ V ]
else8 c6 Y6 x1 O. @0 T& h6 l
link[i].nextp=i+1;. u. {# U, C, ?' ~
link[i].number=i;
$ }9 z4 D; k7 W+ L) D* C! D}
; A. D, C% V! g' L6 ]. Oprintf("\n");
0 Q& t# K5 w8 V' q3 z Jcount=0;5 A% L$ I+ k: R' H2 V0 b. ]$ O4 J
h=M;
" A. h& X: _9 m4 O, vprintf("依次退出的猴子: \n");9 o# M% s8 r& w" o
while(count<M-1)
2 f/ w3 {" U1 H- r5 q7 h{i=0;" v; {9 `! k- D6 D1 y A' ~; a( b% z
while(i!=3)/ @0 \1 S1 q' {0 w' d/ b
{ h=link[h].nextp;/ w$ |; ^5 d+ B
if(link[h].number)
9 n4 K6 F, Q* d( Q% e% b. l! U( v i++;}
% w. {5 b0 d4 n9 T- e8 o% _6 m% {4 N" C" }
printf("%4d",link[h].number);
# [- P" z8 ^) S) Olink[h].number=0;1 B6 I3 |+ Z- Z
count++;! k7 m7 I( _- X
}
4 q+ g9 a, @9 s5 u3 R) K& C& B$ v' a2 X, \
printf("\n大王是:");3 \. k' ]2 K3 d+ m
for(i=1;i<=M;i++)
7 o; }+ `4 d3 }" W# X; Q Y# F e if(link[i].number)
/ n6 U. o1 j% C' \2 W5 I printf("%3d\n",link[i].number);
$ J; w0 ~4 i# K- l
- P5 l- s2 w7 _7 `7 I/ x) J2 |: o- T, g
} : ?3 F! C5 Q0 S# [& j, H/ i
第三种是普通方法for循环
. _# D; Z+ O: w3 h5 f, ?8 \#include<stdio.h>& F! ]( Y4 F2 u& u. c( T" t8 V/ q
void main()
2 `* E% {( v' h' a7 k# T{ int i,k,m,n,num[50],q,*p;
& {1 r7 T4 n x1 W. X clrscr();" C' r% }4 E$ J, O" N4 O# }& F
printf("input number of person: n=");
# j! O# [- J7 ^- i scanf("%d",&n);* H9 h: b, l$ X2 {5 L% q
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
; ~9 |" @1 r7 S7 P9 j* p scanf("%d",&q);6 V9 P& q# q& X! e
p=num;
, o' G! v3 A; i% l+ |0 t for(i=0;i<n;i++)
8 N( ~0 d* P! [6 l *(p+i)=i+1;* C H. @1 J- Q
i=0;
4 i9 o) r9 {, n( V# }9 U4 t k=0;: C6 ], Z# S/ w, R; j
m=0;
( d" s- v7 D3 s1 A while(m<n-1)& e: ]; t0 G) v2 n
{if(*(p+i)!=0) k++;' n0 t* w4 Z7 Q! T9 a* a
if(k==q)
# c4 {+ H: V* \6 M/ {# r0 v+ a { *(p+i)=0;
% e. F$ [/ P8 Q. `6 l k=0;
- B. V& V0 A; q m++;# S1 l/ g; X8 l3 U* d" l
}
' R* L* ~) P& G$ w$ Q( O4 P i++;
E. m" f2 ^" A' u" u \7 V, g if(i==n)i=0;! `0 A3 Y1 f7 l5 W- \9 ]* N% A0 s$ t
}
s8 I( L' j1 G* Z9 u while(*p==0)p++;
. ^ n2 n+ W3 ?2 T+ N printf("The last one is NO:%d\n",*p);
3 ^1 D6 k2 h z; }9 | getch();
- ?! G& x7 ^2 r: I
$ f- n6 E, \7 m2 e, p} |
|