|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!3 B7 Q! ?/ |" ^
这几天我在忙着编一个问题,我用了一种方法编出来!
- d/ C6 r4 t( Z5 d1 c但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!- d8 v$ P9 R( E
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
5 G4 f6 t2 H0 _& J$ X
0 L8 [) Z, r+ A- }7 ^2 a
9 |7 u8 V" w F0 a1 s 题目
3 H( q4 j: a; T2 K) D) C山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。" Z- }' Z3 S5 k/ G- d6 u3 i
第一种方法:利用循环链表/ J" D( l" Q8 a3 j) f
#include<stdio.h>: W3 l: j6 a2 Y
#include<malloc.h>( f6 j1 Y1 c6 g. a$ O, G' u
#define M 8 //共有8只猴子
0 C" L |0 {2 w1 k. U |#define N 3 //数到3只时退出第三只
8 [9 d* Y2 e. R0 S& M3 C* Ytypedef struct monkey7 k3 N4 y6 Z: A: [% Q. ^
{int number;
, p6 D! h/ c, W2 a" z- [5 |int flag;
( B2 [- O3 {' Hstruct monkey* next;1 J& }( d1 V8 T5 B D: |$ y
}MONKEY;1 T" i& g9 G5 B. k+ d) S2 q" h
main()
2 ?) D8 ]* h" B, C2 \{ MONKEY *head=NULL,*p,*s;" z/ r7 j1 H# o8 H7 S% e
int i,sum=0,count=0;
- R" L. \0 q) \) A8 y. c( z" M clrscr(); //清屏$ H8 V* r( w5 a6 F
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存0 c' i3 s, s" p$ I
p->number=1;p->flag=1;5 J2 F( Y, ]8 `& y
p->next=head;: l6 Z' ]* }+ i. k
head=p;; T: ]- n) f5 e# j- H% F
for(i=2;i<=M;i++)) I+ \4 A1 O# }. }) T8 ?
{ s=(MONKEY *)malloc(sizeof(MONKEY));2 {% z7 o9 a2 K. ?
s->number=i;s->flag=1;( m2 L% {( @. g3 p6 M O# c
s->next=head;
0 K2 P2 E/ Y0 `' A; u& m p->next=s;p=p->next;
\5 s9 S2 I. F; i5 K }
0 D: D( W( C* b2 K& J0 z0 q# D6 c w2 G p=head;- K& m- z! x9 u; h' S9 c( ?
for(;;)
9 S2 a" R5 p# i- t2 j' H0 u {if(p->flag==1)
: d$ E. T. d+ A! R, `" W7 B: f count++;
7 a* O2 [3 C$ ~$ _9 X if(count==N), s1 S* S# I* B
{p->flag=0;
6 M9 i) D) d- t% m2 K count=0;7 @6 \3 R; V- `' s R
sum++;}
$ @: y9 S: `6 j2 q if(sum==M-1): O# B: M1 P4 M9 @. W5 a: S
break;
( T6 O' n$ c+ E" M& K: A+ [ p=p->next;* s) t9 E. m6 E' O* M4 x R; m% k ]
}
- Y0 T5 Q0 A/ U8 x7 J p=" B2 P# G! H, l2 z. Z- z+ r. C/ ?
head;
. ]. `. @* Y: S" ?/ x k8 j for(i=1;i<=M;i++)
' W' A0 O- h( y& ?. c2 T { if(p->flag==1)/ y# e0 y: {/ g2 x: c3 C' d
printf("\t%d",p->number);4 d$ S3 @" U- y% ^$ e
p=p->next;) r" k$ {7 f2 j8 y8 `& R
}# o6 H' Q" \ x& \. B4 X) `
/ X$ ~) r; v( v3 ?" B
# \+ ]) B- p- x% q3 A1 k7 \
% F3 {! O/ E& h+ c+ ?
} v9 k5 z) \& P" t& D+ l" J
第二种方法:数组6 E8 C! N" _/ `+ e. n9 _1 m9 J
#include<stdio.h># a+ i3 W# J6 z( M
#define M 8! O5 C9 G( a8 L) s1 w% ]
struct monkey/ V$ G- `4 z8 S( b1 t
{int number;2 _ @* U8 h0 t( d, }$ d# a
int nextp;
7 q4 Y& H( { m* S" m. y/ D}link[M+1];
9 U. Y% ?/ n0 X
5 }, Y# h- s! x0 n9 r" O8 L" Vvoid main() p& S0 @2 E+ }
{int i,count,h;2 T! K. U4 ?& z9 R8 @2 {
for(i=1;i<=M;i++)2 X+ R3 q! H! r# D
{ if(i==M)
- Z1 [/ n; A, o; e) d link[i].nextp=1;+ Z5 h+ x @) n4 z5 E6 Q: s' B4 ?
else
+ P$ ^" W ]- N- c7 J link[i].nextp=i+1;$ q* S2 T. R. |( U: t0 E
link[i].number=i;% Q) |# u' B5 e' R+ K
}
5 G; f$ B; }* \' S, P. G4 Cprintf("\n");
3 Y( P& q, e. j: `count=0;
) f; p6 ]3 e* R% xh=M;$ V! z* c/ n( }- k7 Q2 \1 ~& F3 N |% V
printf("依次退出的猴子: \n");: r. m. j4 T+ \% w
while(count<M-1)
7 R: D- B8 H4 V& W% {" g7 s{i=0;: i0 T( i- h! A$ b$ D! E
while(i!=3)
3 V; a& c- }/ F. e{ h=link[h].nextp;0 N$ D: y8 c- @# ~1 O
if(link[h].number)! G, _+ Y j1 Y8 S$ Q7 }
i++;}
9 r' G B: q! o, }! U
, w1 T0 r+ U# d% h' X* O; D3 D0 ], V1 nprintf("%4d",link[h].number);
% c! v N- x2 O. c8 }. |$ V( slink[h].number=0;
( a& t6 C' o6 gcount++;" D0 t9 \6 ?4 g( d
}
# t8 I2 A5 G. f. Q0 m Y) J' Y( c# ]5 c
printf("\n大王是:");" J& g! M0 n9 B- z
for(i=1;i<=M;i++), B/ W5 r s4 t" ]
if(link[i].number)& C6 [6 u; ^) m) q- q$ z; |
printf("%3d\n",link[i].number);
W ]" L C/ r* \
2 f* e; z4 V2 X1 o2 e6 h3 A9 C
0 i: j% ?! x; s& m} 9 w! s# L1 J; s, l) O. ]' }1 B" R
第三种是普通方法for循环6 F( |, l1 h' J4 w9 A7 _. f
#include<stdio.h>
+ F% B/ |. D& j1 @) v0 p# B# J" Gvoid main()8 @# o* O2 T2 E7 H( @
{ int i,k,m,n,num[50],q,*p;
9 @& [( a! h4 }$ p* f$ w clrscr();
7 B5 J0 W* Y6 x) ] printf("input number of person: n=");( |, T% v" K8 c8 j V
scanf("%d",&n);
, x7 M+ c; W( N1 Q* Yprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只6 Q& `) p, }! V1 s( X% d
scanf("%d",&q);2 e, D- S' x# H3 \4 i
p=num;
/ O" y5 l1 T6 ^, _- ]; w+ l/ { for(i=0;i<n;i++)' R7 V) R' S, U2 O
*(p+i)=i+1;, e3 @: F9 K. f' q8 ]
i=0;! R4 V7 a7 X" T3 C4 Y+ c O: S5 a; z
k=0;
& @* T5 ^/ R" Q: T# ~. r9 p m=0;: D6 N5 B' c& q) F
while(m<n-1)
; a- y9 m! C' N: V1 n$ a {if(*(p+i)!=0) k++;
* d3 ^3 r6 N# N$ C if(k==q)# m# Q4 w; U" \, z6 w9 U
{ *(p+i)=0;2 G# [$ |7 A1 M. G& e, e8 b
k=0;
2 }1 W7 ?# x* z m++;
8 P' T# `7 Z% i9 Z. E* a" m }
. ^* ~0 e9 `. K; d F1 S- _+ n i++;9 M5 n2 W; ?2 G) F
if(i==n)i=0;7 s$ y2 S L5 T+ q `+ c
}5 j+ y+ \' G4 b+ M3 f# H
while(*p==0)p++;
8 y# G$ B t6 Z& z8 y9 w printf("The last one is NO:%d\n",*p);
- x' y: p) A2 f; O0 M2 h getch();
W* n/ P6 G+ A9 @ O2 }7 N$ B" c- C9 d6 J, r# W, a% G! F1 r
} |
|