|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
: A8 C9 B1 ?3 {( w, ^' K$ Y这几天我在忙着编一个问题,我用了一种方法编出来!
' J: ~+ ?9 Q" E) H但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!& P9 U/ v7 E' g
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
8 t2 o0 |' y7 O* N* F/ g- v3 m$ _, L* @: U& p ?6 j7 w
+ ^9 X. i9 M4 m+ {2 T9 }( m
题目
T$ @( t8 O4 `, A6 [山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。$ | L% I8 e$ t0 \) g& ~
第一种方法:利用循环链表% x5 |- r& r) j! |+ B5 o9 R0 A
#include<stdio.h>/ a e' e8 D# y) l0 a$ M
#include<malloc.h># G0 d9 E4 G# m; v; Z
#define M 8 //共有8只猴子
( ]6 n( b0 H8 c& f4 a#define N 3 //数到3只时退出第三只
# Y y, U3 o+ l. D/ Ctypedef struct monkey
" h) x1 p* J1 w: U& G8 |5 T{int number;- m; \* z" z1 S7 S- f
int flag;
) W$ x0 ^; U! A2 mstruct monkey* next;& ~* s: w0 I# `/ d$ V
}MONKEY;3 f* n* g$ E* K5 l# R; U
main()1 |2 M. z# Q' j" o2 X0 X4 [
{ MONKEY *head=NULL,*p,*s;
7 @, \" h0 `0 B, z3 r% K" C int i,sum=0,count=0;8 N- S; y5 [! w& b
clrscr(); //清屏0 X( d8 ]0 Q* |7 h. [
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
3 ^) `+ A( i9 Z2 h6 } p->number=1;p->flag=1;
0 F# q# z; t& g. b% ?$ Y p->next=head;* x' n8 c2 ~8 ~) p, w
head=p;) J+ l: m! U' Q; w; @5 B+ a+ v- D
for(i=2;i<=M;i++)" G9 n- f# Z: Q9 H$ [" Z1 X8 f
{ s=(MONKEY *)malloc(sizeof(MONKEY)); R' m# n. Y, \
s->number=i;s->flag=1;* I f& G, m- J' Y( ?7 C
s->next=head; {! d# _4 i5 i: G% R% C
p->next=s;p=p->next;' H5 Q" N* W& s; N5 i1 k1 j7 x9 [
}1 G2 R" m7 O$ r2 y
p=head;
& @8 \3 o3 J$ k- C! }$ c0 E for(;;)
; ]# Q7 s, {1 K- q# B9 f. I) | {if(p->flag==1). \/ g9 K& l/ ]# I5 G& a/ v( E. y
count++;- w7 z: ^% `- \# q$ ]) @
if(count==N)- `1 a; c8 F1 @
{p->flag=0;
# E/ H0 u1 H% O E8 f1 ` count=0;/ j- m" c( t9 h1 M I0 e+ e! v
sum++;}( A9 K: w9 [0 I( F+ J% v, }1 L
if(sum==M-1)
) f5 r* E4 v9 K! L: z9 x X break;6 A( ]& L$ j6 Y* c4 f# t4 o
p=p->next;# I0 G/ }+ \/ y, E
}
8 l X3 u, H9 n9 t" r5 k! t p=# Q1 C) c& c( A+ Q+ p( j4 C
head;
6 |) e( j4 g( q5 [/ v for(i=1;i<=M;i++)
1 t- b1 E, j' x3 a* l% W; ^ { if(p->flag==1)
, l* c* `* B6 h' z1 V- l9 k! ` printf("\t%d",p->number);& W. @9 D0 S+ k: K* b
p=p->next;
3 D" i$ e% D( o5 D# F# b) M# P* I8 L }1 X* w3 j; h9 y& X$ |1 y
) f J6 v% c5 e5 j
6 S! o' Y4 [9 l% Q$ L V. C8 u7 N7 V. Z# y) e
} / z4 C( m% Q% I
第二种方法:数组3 e2 Z9 X9 D4 o. R9 E. ^
#include<stdio.h>
" c* l% l% M. Q1 A& a' t#define M 8
' c, a6 ~8 q) dstruct monkey1 ^1 @$ s( m& Y% D4 J# s
{int number;( n5 N. r: r& |; e6 [8 C
int nextp;1 e5 y, |: B l
}link[M+1];
3 U5 s7 o+ G8 f) U( [ \& a0 q; K7 r! H( Q0 ]6 ^- Z
void main()
( i& D6 g4 r% L' v3 n3 W1 N{int i,count,h;
: j) H+ m, h. O* a8 B; u5 sfor(i=1;i<=M;i++). q1 f% Y& f2 q5 @* p( m3 t) |
{ if(i==M)0 C+ f8 Q/ Z8 o
link[i].nextp=1;+ q( ]1 M* ?0 u4 j3 s
else
- {! w; q. ]3 g t( ~ link[i].nextp=i+1;
, g) s0 {8 r! y3 \: {! Q2 V$ r link[i].number=i;+ u6 P; y; D: c5 ^
}
. A1 P$ h6 P# W% M" O" H. @8 Fprintf("\n");/ n* f9 _3 \7 W8 a/ J( N/ s
count=0;
6 Y" ^6 p2 ]( \. ^9 L; \' fh=M;
6 G e+ l: V1 r$ g! hprintf("依次退出的猴子: \n");- Q9 F) S9 x, E
while(count<M-1)8 D! g& N- S8 o
{i=0;2 Z* ]7 |# M" j. q9 L
while(i!=3)
6 t, V, \1 r4 s+ i5 K* I{ h=link[h].nextp;
$ w1 z( Q% w7 G% s k if(link[h].number)7 `+ @% d- G A1 h$ G6 S1 z5 N
i++;}, ]3 Z: v) ]5 Y
9 e y3 F: ^0 u; ?. `$ W
printf("%4d",link[h].number);
9 G0 L% Z5 \. w% l3 vlink[h].number=0;: D3 `3 |: L& [1 D# f* _
count++;; j2 ?; x, F! U, n/ _, Y2 K
}
5 @. `( |7 K% j! z! Q
5 a! }1 J# O" I' Gprintf("\n大王是:");
' V7 e* q# M9 H3 q for(i=1;i<=M;i++), J9 e+ m2 R4 {9 a: w; [+ P
if(link[i].number)2 T5 B- J; W4 d- W) V; y
printf("%3d\n",link[i].number);" }9 C$ j: K, C9 q& _4 I# n* _
& s0 S2 ~! B9 T7 x) ~
: Y1 |- p! A* g7 S} ; j- Q' `! z: M, H8 D
第三种是普通方法for循环- ~$ ~4 J/ d. ^, {
#include<stdio.h>
7 U1 v" L: c' x, H6 T* H5 j# bvoid main()
: O6 `6 Q" r) U: \{ int i,k,m,n,num[50],q,*p;1 k s4 Y4 U) W4 n* B
clrscr();
$ {8 t: b+ D) v, U. n printf("input number of person: n=");
4 p% e" E1 W4 k& }3 w7 ^ scanf("%d",&n);
5 E1 w. L: M) x5 v5 ?; `5 l' ]8 a9 oprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
4 U" h7 a" B1 t2 _& }/ X0 s scanf("%d",&q);
3 Y7 B; o! B; s2 e2 w p=num;; G6 a0 t% M$ V; F; t& r
for(i=0;i<n;i++)
9 u$ i( e8 h: c1 }3 r4 L *(p+i)=i+1;" W0 J) \; H6 J$ ]4 |2 P- }
i=0;4 v& U, w- B1 m
k=0;
* k+ C; U# m" V% O6 t; H1 c m=0;
: L, A: D& [* B while(m<n-1)
$ R* s, U; n3 v7 R t- s% f {if(*(p+i)!=0) k++;0 \' l+ C: r% O& u% w: f2 Z0 @
if(k==q)
" l; Q4 M: n, N7 Q { *(p+i)=0;5 n) @) C) h- b( O
k=0;+ Y9 s5 t+ j& u* O
m++;
$ Z8 |8 d7 c3 N* y9 @. |! L2 \ }
6 r5 I3 C' x6 i. {" k i++;/ i5 G9 ^& D, w5 k+ G4 f: x+ n
if(i==n)i=0;: V8 @& M, y7 H! s
}
" L5 V0 @( D- `* Y, L while(*p==0)p++;' D4 H: ^1 ~4 P0 `, P6 g
printf("The last one is NO:%d\n",*p); ?8 E2 u5 p' \ s$ {
getch();: c' i5 W8 i/ A$ w3 R# ~' [
' }: ^1 o6 F M
} |
|