|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
" N2 _% L t5 a+ A) x& `这几天我在忙着编一个问题,我用了一种方法编出来!
2 ]$ n( ?. C! v% w但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!$ B& `+ r3 B% V
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
, P; s, o4 N9 ]' X P5 t* [8 s5 h. z6 C! l6 R9 l/ p1 [7 O4 }: a
$ T* `/ X+ o& p
题目
" o, R" Q; Z* t3 P山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
2 a& f" `1 s8 K# x第一种方法:利用循环链表
5 `9 F# E5 A: Y& g$ H& u#include<stdio.h> s+ P+ E r, _
#include<malloc.h>
, J# D8 u. u6 ]1 @, e0 O1 T#define M 8 //共有8只猴子
8 H. D) \ S1 t2 M/ l8 T#define N 3 //数到3只时退出第三只
# ?0 d- O; N; F$ o# [+ {$ Rtypedef struct monkey, f& w' W( H4 i4 u2 _
{int number;
3 _; C* ]! `" B. x! H, |$ eint flag;
1 F& C7 _: a% K$ u( h0 x* Ostruct monkey* next;: v! i" ^7 j I0 r' m* g
}MONKEY;' t: I l# d( }; @! w1 y
main()
; m; D x+ l, ^% p6 h{ MONKEY *head=NULL,*p,*s;
9 s; l! P- @! ~8 ]8 Z: Z3 z int i,sum=0,count=0;
2 A3 d) j- g7 B' _ clrscr(); //清屏
$ z# O h5 n% j0 g+ z* O p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
L/ o5 }. _, v$ q3 \- P p->number=1;p->flag=1;5 O' W$ I; @7 h
p->next=head;% g8 w" O4 I: t! z5 B- C% Q
head=p;
" q6 ~& l! T+ N5 Q% k' z/ x for(i=2;i<=M;i++)
) K) ?3 Y4 K: D0 B, T6 B- N5 k { s=(MONKEY *)malloc(sizeof(MONKEY));
8 F# z* ?4 v: q! W1 O s->number=i;s->flag=1;
0 D. O3 `% _. I# v& z- {3 J, T, T! j s->next=head;7 b$ |( [( t/ }, E0 L
p->next=s;p=p->next;) j9 t3 L5 H' V
}
0 W: d) I8 H. I( t0 q p=head;, X4 Z' T+ ~" d: I9 s R2 L$ Q
for(;;)
+ e2 M* t6 K% W' _! \1 |1 @) O3 E' u {if(p->flag==1)
5 z/ t$ S: t) Q9 h1 ] count++;
2 b# \; `. Z2 i, i if(count==N)" k9 y1 s/ l: v) } O
{p->flag=0;
4 {: ~$ u& ~+ U9 |: k- { count=0;
1 a9 g) h3 d2 L/ L9 f sum++;}+ S/ i5 B4 g$ @' T9 i& I8 _/ h: ^
if(sum==M-1)5 k4 V3 Z: j3 b9 p D5 Q( H
break;+ H- N7 n1 ^4 M' g* r
p=p->next;& y5 o5 B, t2 A' R
}
' b8 D, ?5 t g3 E2 f- ]9 K, ^+ @ p=; u) b% K/ }0 J/ u1 @) r2 J3 x+ V4 L
head;, I+ b5 G6 x4 I- j3 ?* }9 V
for(i=1;i<=M;i++)9 h8 z/ A. y/ c5 ?9 y
{ if(p->flag==1)/ ^$ z& L6 @' T9 Q' t- E
printf("\t%d",p->number);
$ j. k9 w2 y) O p=p->next;
# Z0 d4 m& m. I1 I }
% i9 C1 S3 V2 O- T6 B! K2 [. I' Q w6 x" v
9 }+ W3 M" X, L' ]$ A9 c
4 a6 x7 X" y3 M% [( D6 \}
. T& T. K/ b+ {# g, i, j第二种方法:数组/ v* `0 t9 _3 X! I9 I( C
#include<stdio.h>
* H* {2 w( R/ A3 B* g#define M 8
' U6 i( l/ j, K6 h3 M! fstruct monkey
: G# o2 b% D* G8 W2 i% h- [! r3 I{int number;7 o" Q2 c5 J# l& {+ t
int nextp;
) \9 }& E8 S+ x) E' H}link[M+1];
9 N9 H# b( Q' o/ x4 H( d# c u0 g( X
0 f0 L4 q; E7 g! n9 @void main()
' `, v% l U x0 ?{int i,count,h;1 \, p5 p4 a- K
for(i=1;i<=M;i++)( t' ~! p. Y2 Q! r
{ if(i==M)
' c- A% I. D1 r4 V link[i].nextp=1;
' E: L" [2 k. n6 _ else+ V# ?) i# Y i/ A+ t
link[i].nextp=i+1;
' _2 l2 A) C6 f3 H( B5 m5 J- y. s link[i].number=i;
% F* Z: S3 K1 A8 f6 V& r7 @5 @4 p}
1 @6 z+ {! z4 K; s$ hprintf("\n");
$ _; V2 _1 A3 Z4 q( acount=0;- A4 y% n8 i$ i8 z& a
h=M;
2 A+ t% j, b4 [printf("依次退出的猴子: \n");
! m8 e7 h/ m9 @. A, ]while(count<M-1)
! k' J1 P9 _ q4 b; d4 P{i=0;# k8 I& ]) ?7 A$ C
while(i!=3)
1 j8 i5 b/ ]& V( N2 f, k+ ^{ h=link[h].nextp;9 Z* ~, _& R, a" q; H. O
if(link[h].number)& |8 a3 e, ?0 u$ r+ Y1 M: ?8 R4 T7 [+ J
i++;}
$ I8 G. A) | b2 t) O6 f
9 \5 k7 F6 P9 N0 kprintf("%4d",link[h].number);
; x. k* \2 y2 Q/ N+ ?# e0 Qlink[h].number=0;
8 P+ v: @+ N. u* icount++;
9 p8 h. r3 B) N6 D; ^7 x9 J}
, C5 Y2 u/ n, S* j# i1 U6 \- H
. u1 d' k/ n# W, qprintf("\n大王是:");, G4 o5 h+ ]: B: S8 d4 a
for(i=1;i<=M;i++)
5 i: L7 L9 `2 { if(link[i].number)
6 i1 X/ I, Z) h/ p# q. V5 @( ] printf("%3d\n",link[i].number);4 Z# ]2 G3 M9 @6 u8 i1 W
# o) U% X+ m0 ~
$ A: E p. B; \" b9 h}
" ]5 s6 Y+ o5 N( I* w第三种是普通方法for循环
, N: l1 h' ?6 j6 U' G; T) Y#include<stdio.h>0 J) v; e5 d/ J9 E' H
void main()
0 O% o$ N% Z8 s. S# K% y{ int i,k,m,n,num[50],q,*p;* e t% v2 u2 a
clrscr();5 B6 Q+ _/ v+ z# i
printf("input number of person: n=");, {% I1 o7 @4 J1 A1 f5 u' a4 N
scanf("%d",&n);
! W5 W5 U5 q0 b" Eprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只, }, q Z' d5 t: R/ O3 J
scanf("%d",&q);: X u+ d& X* ?, c
p=num;
! N4 i& t% h# j) A- S: s for(i=0;i<n;i++)8 h- y5 H6 v+ P3 C( S) m5 }5 o
*(p+i)=i+1;
4 r2 |2 B# u- }! R/ i! ~+ W( i! K i=0;( F( N1 D a9 g
k=0;
. W1 y3 `4 u, W! B# U1 A( d m=0;
) h2 Z; o1 p- K4 q while(m<n-1)% D9 b" x5 z' p4 I
{if(*(p+i)!=0) k++;
2 i. B% |/ n. @) d: K if(k==q)
& w4 \0 F$ n+ S+ Y9 |3 k { *(p+i)=0;
- @2 B% y( O0 ?6 B6 n k=0;. n7 q3 E. H$ i" Z7 h
m++;
! t' I! r Z0 D/ b- H }# D" a! x8 |6 v! S1 O
i++;
: Y2 g0 K* u4 p' { ?) ] if(i==n)i=0;# Z) @8 [1 ?3 h
}5 i0 t' V! a- L8 w O ~ u* O
while(*p==0)p++;
+ b. v; S& i: B6 v( j% ^; i printf("The last one is NO:%d\n",*p);3 A# g7 n% l* ?( M/ V( ?% F3 H9 @
getch();$ h% H' x1 m4 G; n5 l
: M. a7 r B" g8 v+ M; T8 C( J8 W) U} |
|