|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
2 Y+ o" E5 x2 C这几天我在忙着编一个问题,我用了一种方法编出来!
, z, j5 l( I2 Z; A. G但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!3 }6 N' G0 x- ~; _ L
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
6 [0 g" o# h9 ?* d: O2 a
/ \ e4 `' v* z& Y/ ?$ n4 Z: S+ f0 m% m6 L& G
题目
k5 Z/ [! t& d6 D! u B* ^4 `9 m/ b山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。8 }% W* T: N- y5 E
第一种方法:利用循环链表
- t2 E$ v- k F9 C/ B% Q4 b#include<stdio.h>3 y4 R b7 v/ l, x- c
#include<malloc.h>
) Y* K# g: k6 l! o0 U. k#define M 8 //共有8只猴子
% _7 ~. W- e5 n9 e) ~#define N 3 //数到3只时退出第三只
3 S. N6 v/ a7 wtypedef struct monkey2 D! g$ P1 t6 Q* A' d) J" x( d
{int number;0 p) M& `; ~, Y: d0 K3 |
int flag;
- m! N, e1 {4 Z) Istruct monkey* next;& f4 J6 u! _; e5 y2 l
}MONKEY;! h/ _$ S6 {( a7 B3 c: H
main()* Y- V1 v$ a8 k1 [* ?6 n1 N
{ MONKEY *head=NULL,*p,*s;
) c. ]1 D- t: D3 z- D5 r int i,sum=0,count=0;
) q0 x9 V9 m+ |' ~5 N. [4 Z clrscr(); //清屏& K! r, _* d# u& _4 w& L
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存) ^( W8 a1 Z" j5 m, X$ b
p->number=1;p->flag=1;0 n- {# z$ f; G+ a7 K" r
p->next=head;" S8 ^5 [4 E$ N/ L) p
head=p;' h! S& f7 @) g2 Q
for(i=2;i<=M;i++)# z2 o# t; B+ p6 M$ X
{ s=(MONKEY *)malloc(sizeof(MONKEY));& x% q' t* I. l4 b# @8 a
s->number=i;s->flag=1;4 A- Z- B- ]7 T+ d5 a5 d
s->next=head;/ K# @5 i" I5 V- W
p->next=s;p=p->next;
8 g! c% `! X# e3 ]! o }. Y1 y, j( \4 j& ?% G! C/ L
p=head;, M- Q2 l# p8 R& K2 d3 ~5 b
for(;;)0 [' v& W+ g+ a
{if(p->flag==1)
2 w, I% W* O C, J& Z, V+ q count++;
; V$ i: m1 @* j3 f7 F6 w4 y if(count==N). {; S# B% u" @3 \3 y
{p->flag=0;
* f; F: v: M$ [- F. ?7 p# @ count=0;
. K% h( g, G. I* E4 ?, w; L" W sum++;}
7 r/ |+ h# F/ P9 Q4 a# S8 e4 ` if(sum==M-1); m5 ^* U9 u4 |9 i# O
break;
. d6 @! ^5 U/ J8 U4 g8 n. n+ {" G5 k p=p->next;( |8 _3 ?. r# w m0 j$ y& c
}/ ]( I6 w Q8 X! H- ~
p=
" L6 c+ S5 \( K% b$ X% @/ ? head;1 x2 T: X5 f1 l" p- D3 y; \
for(i=1;i<=M;i++)) r; p$ A; H6 q* S! i" q) Y% i5 x
{ if(p->flag==1)+ J" Q/ ~! J) S# L: t7 s4 I9 A
printf("\t%d",p->number);
. `' d/ Q" P5 b; Y p=p->next;
* K( k( x- s+ n7 d9 X }5 o* L" D. f/ ^" d/ K0 J& D
& o* L* u* g3 B* D# i4 o
, V0 l2 B! }6 F& b7 }9 d8 H+ b- x
; X+ }# Q, N. r6 Q; |2 M: R, ~}
, U3 d' s) G0 s3 _/ [第二种方法:数组# |' U: h) ]. C P+ x/ g
#include<stdio.h>! ]5 h" \: y- j& p8 H' t8 W; Y: f! q' F
#define M 8* D) C! Z# C. x9 S+ x5 L% u3 R$ g
struct monkey1 s r' e" `" V4 ^' h: C
{int number;
9 s$ K3 B% w3 R( t Y( f7 C1 L' w/ Mint nextp;2 R) g" d& v# K5 W6 L; V, c
}link[M+1];8 T4 o w" k& G
1 y ^4 E1 K9 B6 t' l% N6 E" _1 X
void main()
G4 o* s9 b7 o! ]) Y* w4 u% o{int i,count,h;9 Q3 @+ X4 Z) ~- C( G; c2 f, F) m
for(i=1;i<=M;i++)+ ^) |. g0 j' H1 n) i+ a
{ if(i==M)
, _6 v' c' z9 I m7 M+ k. S link[i].nextp=1;; J ~+ d0 R" p. N
else
3 K% z, l% f0 v! X4 J! \) M( R link[i].nextp=i+1;
+ `4 b- A6 ~4 O6 w# q link[i].number=i;
3 Z# B$ f Y. z}
0 L% b/ Q* Q0 O% i5 r% kprintf("\n");
0 V: N, Y+ Y7 u" m5 G- j! `$ ~count=0;1 C+ {6 q: \! a2 [
h=M;$ B% [ l# K" J# ~! m1 P
printf("依次退出的猴子: \n");8 U. Z) o% x! `- l6 w& T9 Q. x3 ^
while(count<M-1)0 \' p) F0 j' n
{i=0;- b* r" M* U, J1 X* U
while(i!=3)6 P/ h- U2 q; ?9 @. }, R
{ h=link[h].nextp;1 O% O7 F1 H+ d# N
if(link[h].number)
) a& R8 [& a0 `( r7 S; p1 y3 U i++;}
9 c8 T% u7 v/ C, l' g! g& E, m
5 \1 o/ L5 Q7 eprintf("%4d",link[h].number);
$ H; ~& M! h3 plink[h].number=0;
( G& R' o' J, F8 mcount++;
# S: p1 f* s# s' i8 P) B5 k}6 n# |8 q1 q$ ` f: }% c1 y# }
; r* v' x" G+ Kprintf("\n大王是:");/ X+ l% y, N9 k( t1 ^
for(i=1;i<=M;i++)/ q! I2 b. Y" L' _
if(link[i].number)
/ L: o% i4 v+ `6 X+ l. H$ } printf("%3d\n",link[i].number);' k5 q9 L# `( H j# X Q
- y* J3 ^' E e; X/ I8 @0 J
1 w |8 a: B; Y2 p: a: Y* P. V' Y} ! R; a/ z- ^6 U+ e% x( X; R" S6 m
第三种是普通方法for循环
" h! v: r- p$ i4 \& ]% N0 Q#include<stdio.h>
9 \+ W- q8 `1 w( yvoid main()
% K: t# ?! F+ D$ l0 d" p" `{ int i,k,m,n,num[50],q,*p;
y" i4 i: k8 Q { clrscr();
& I% Y. y9 y: _5 K; O printf("input number of person: n=");
\9 h" B( t. E2 F/ p9 P* f% x scanf("%d",&n);
) P1 ^( ]7 s" R* O% Q% t0 rprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
' I6 O$ C' f3 ~* D: d$ T6 K scanf("%d",&q);3 v; d2 ]' N5 H7 _1 U* Y
p=num;
% B1 O" `% {+ n: ^" v) @ for(i=0;i<n;i++)
: w% v; S; t) `( s- G *(p+i)=i+1;: l" w& m8 j# L7 Q
i=0;
4 g5 G4 i! y$ P5 t1 j' A9 Z k=0;' x; [, n6 Y2 m# g* d9 \8 Q
m=0;
" n0 B+ q- Y( K# [+ ^+ p$ Y while(m<n-1)
* W/ ?7 @8 O; G, V" \" ?) G" A9 m {if(*(p+i)!=0) k++;
) f" E0 ?% u& Y$ A; e if(k==q)
6 p3 I# P$ `1 w { *(p+i)=0;+ H* t2 N8 _( Y. a' d/ P. L
k=0;
9 G N+ m# n8 x3 }- D$ [ m++;
9 a# M4 R. O- a8 a' P5 r }+ l3 X0 f1 t* j) K3 e0 j/ J' Q' l
i++;
; g0 L) a" P3 D! d7 ]/ n" T if(i==n)i=0;2 t1 e) U3 t" J% c/ Q9 M, J% w
}
: _) j2 D! Y# {1 m- Z while(*p==0)p++;
* I* A; L2 z* f& y( i3 b* z. _7 P printf("The last one is NO:%d\n",*p);3 |( S# O* G% F* E$ K
getch();3 k [# c @% U8 k/ r
, n' @1 ]2 p. m# [; Y. p( \' V
} |
|