|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!/ x5 _) v9 c! x
这几天我在忙着编一个问题,我用了一种方法编出来!* `! Y/ w& O' H0 E
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
- M! k1 L0 G, @6 D8 Q3 \3 s注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 % u. h4 x6 W, l3 a, b
6 t7 d4 k) D& r# g
9 F; ]/ N7 K2 o7 P" m
题目
; l/ q7 A, X+ A) r: M: W山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
3 \2 f# z5 ]; k# M! b L1 r: K1 b第一种方法:利用循环链表
& M+ q) s) T; k; K* T#include<stdio.h>
0 s" f- D$ M) d- j f) Y) v4 o# I#include<malloc.h>
! `: N! O4 n: q1 z! ~#define M 8 //共有8只猴子1 e! \8 J# t: d5 W# B& a4 e$ E' G
#define N 3 //数到3只时退出第三只. i I3 o) ~+ L- d& ^# W# ~
typedef struct monkey. G% g8 ]% ?, r. V% b2 b7 Q
{int number;
0 G+ z( s( r, z% |int flag;: o0 e: E3 }$ u# Z
struct monkey* next;; x& e! m' D9 I# {# _, \
}MONKEY;4 k, x1 x6 v" P$ Q+ _
main()
" @# N! m; Q: Q. e9 c{ MONKEY *head=NULL,*p,*s;
% y9 Q; G/ G9 X int i,sum=0,count=0;$ v) Y) e. R1 z: o' M+ d
clrscr(); //清屏2 @0 _8 O- q& g$ Y7 U
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存 Y6 a8 d2 w0 a: s5 B
p->number=1;p->flag=1;& N" U, I8 y- R' B
p->next=head;
' T3 E# A+ ^) j2 ~ head=p;$ L6 W, g1 e3 Z5 W3 l7 H
for(i=2;i<=M;i++)
' h# F: B( z1 _( k0 y, i7 g { s=(MONKEY *)malloc(sizeof(MONKEY)); x$ R6 i' x" h) t# A% \
s->number=i;s->flag=1;
. d% ]' l1 n4 c: n, r3 \ s->next=head;9 s2 O3 m$ T% u9 B
p->next=s;p=p->next;
( D, {6 L3 ], c2 w }& a3 F1 b* ^. Y- X3 D: V" I
p=head;
: v v% h4 |! h for(;;)
4 @1 j: b* V! } U {if(p->flag==1). V, S( A! l5 ~2 K+ Z' c$ w
count++;: r; k; P6 \ k$ D( k2 J2 y6 F; ~
if(count==N); j. m# l2 r5 P3 p
{p->flag=0;
: K, F9 b" L y/ z7 T9 N& D8 ]1 ` count=0;
1 S. v. i7 r( S# @, M k sum++;}
' X" p2 x; b$ B' y if(sum==M-1)
4 D3 H* E) l3 q. @# Y* z break;
2 S+ J$ A, b7 q p=p->next;
% X( }) e5 S: ? }
0 o: O2 }" `0 L1 w5 {$ |2 I' T: }1 N p=
) y1 X8 C* `4 b# O: U. \5 N head;
% t* X2 ^! ^- f! [ for(i=1;i<=M;i++)1 u& C) d& s. T& ]$ ^5 A4 K& ^
{ if(p->flag==1)
6 |1 l7 k. e% ^7 G. z' E- p9 p) B" f9 b printf("\t%d",p->number);
/ `1 p- r$ O& R, ^3 D7 M. q# b p=p->next;+ R, A; `9 Q& W U- s% Y+ L! c# N7 |
}
5 s0 h7 V5 i a9 O' B5 }
' I2 n5 \5 J j. H4 q: N+ l+ D" H/ }' A) T$ e. I
6 _" t6 E! H* d* d0 e} $ ^1 B8 t1 k' A
第二种方法:数组( W6 e/ o+ v i, t5 o! m4 b& Y6 a' ?
#include<stdio.h>
) |# s: s2 H( C6 \5 P#define M 8
+ @- I& v \# X, C) T$ ~4 k2 | Ostruct monkey1 q0 w# K! B$ e
{int number;* V/ V& K* c& n/ X* F `% f
int nextp;' G; a3 I" T9 l; G9 x
}link[M+1];
- c$ o- n7 c6 q( V
& p: d- A1 ~1 X8 tvoid main()
& b+ E( C# E% @; M{int i,count,h;: _" C% \; o# h9 k
for(i=1;i<=M;i++)3 I5 R. M0 `9 C: H$ L
{ if(i==M)' A) k2 w o' y$ w8 `
link[i].nextp=1;
* c6 ~! I, P# T. L else
( }2 N, {8 t7 Z4 {! } link[i].nextp=i+1;
/ B; `# z6 t/ c link[i].number=i;( h3 h4 T9 k2 w! ~- h: ~
}
; D2 ~; K3 |0 P/ fprintf("\n");
9 `2 w) _7 ^8 r2 p6 ccount=0;
6 v* i( d( B5 W' L# w# Gh=M;8 }) i1 e1 ^" L6 }$ h* l
printf("依次退出的猴子: \n"); ^5 g* I3 B* ~# P
while(count<M-1)' Q2 L7 u1 ~0 Y- B9 q1 E' H1 {
{i=0;5 H/ H. L3 P0 F
while(i!=3)6 }$ q* X% A2 P; t5 T" s6 Q7 A, M
{ h=link[h].nextp;% ?/ {3 W, k' h9 Y$ p* u& w. i
if(link[h].number)
5 w- Y6 p+ d. e" |8 i i++;}
% z$ B# [& W. }' U" m0 D. p" _$ Y5 [& K# L5 }/ h& a
printf("%4d",link[h].number);. h+ X9 s T% V$ a
link[h].number=0;
5 e3 \7 P! R8 k) }# K8 [* l) Ucount++;/ t1 ?% P' O4 H6 E
} D, S9 O$ N! |* C
% g4 \5 N5 Z1 y! J7 B' Nprintf("\n大王是:");
+ V9 `6 {1 d$ ~4 s U% N, s1 D for(i=1;i<=M;i++)
?( {$ A% x6 _1 l& W& t' T$ H, j if(link[i].number)
/ y. n1 X7 s w! x4 S B1 M9 C printf("%3d\n",link[i].number);- U, `1 o+ F2 e8 b5 l4 Y
/ g9 d+ \) F4 q
4 k6 p4 Z$ f5 G) O( D2 r}
$ P3 F# Y U* Y1 t3 G+ g第三种是普通方法for循环6 V# Z% ^5 c: d- w
#include<stdio.h>
# H; f. q- x8 B9 u3 \; Jvoid main() t* H1 } z- ?5 C8 @
{ int i,k,m,n,num[50],q,*p;
& M7 M% n* g% B/ U clrscr();
( V$ p* f3 l8 D( E+ p" p printf("input number of person: n=");
+ r$ n9 I0 M' N. M" W: g7 N scanf("%d",&n);2 g- p* `8 d X& [9 z$ q( y
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
- o0 t' c% @! P$ Q% C: x, a% k scanf("%d",&q);! k# e/ a5 O0 C, e
p=num;
, d) m! ]8 I ]; w( H: d1 f for(i=0;i<n;i++)
- o; R3 _) z" }" Z *(p+i)=i+1;
2 U5 m, v ^ X2 n) u i=0;
: A/ i" V8 ^1 {- s$ O k=0;
+ H5 K. @; w+ E/ M5 V m=0;
; d+ ^* [! y* r1 F while(m<n-1)0 h t2 D2 m8 }
{if(*(p+i)!=0) k++;
$ I; b; A" v9 p2 x' a if(k==q)
4 @4 o( T5 e$ F I8 S' @ { *(p+i)=0;
9 q/ L0 t+ f% N! W: x k=0;# p9 K" _8 X! Q. \5 t
m++;
, T+ L) \2 M6 z2 I1 E8 m }
! Z5 X7 R/ b( n) F: L i++;
$ ^4 {; j4 Q, ^ if(i==n)i=0;
% P8 ~* f n3 J0 `/ Q: F, W }
; @! J' K( j5 b1 C! M* J& [ while(*p==0)p++;
" A3 l9 i5 Z+ B( z: c3 \$ k7 C printf("The last one is NO:%d\n",*p);
. y1 a" C' H5 j2 `0 e# c5 N& Z getch();' u. R1 x/ D7 u* _1 {: B
" o0 e' [ m I* p0 o( X+ q) r} |
|