|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好! e0 \: w. E! F# S$ A; w: z
这几天我在忙着编一个问题,我用了一种方法编出来!2 U/ M$ u; u3 ]
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!$ g2 i7 Q7 t* I. h7 }" p
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
! L) v' m0 O' a" J% P
, K* F; i2 b ^
. P6 V% C8 C( c" @$ n 题目
9 U" W* h. L% Q/ d山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
8 V4 w9 t! m' j" ?/ A9 R第一种方法:利用循环链表 S6 |6 y+ e# |& e7 D5 F
#include<stdio.h>
) c: W7 i# U1 t+ g& v3 S#include<malloc.h>
5 E, @, M1 f& |2 J3 M: }1 R% B#define M 8 //共有8只猴子9 k/ T; z1 B. c0 T3 B% ]9 D
#define N 3 //数到3只时退出第三只
% c$ Y3 j r0 G) ]* m0 ~9 D0 v1 M/ ]typedef struct monkey
+ r4 l; p1 B: M6 j$ Z6 h{int number;1 T& |1 c. @% H! R. C
int flag;9 `5 }# _0 M5 f
struct monkey* next;6 J4 X/ _6 N" Y l& n
}MONKEY;1 e7 Z0 h- T4 l! R* T, `
main()
6 j3 A k6 R a& W$ B2 v5 z{ MONKEY *head=NULL,*p,*s;
8 F: I8 d, ]# ]' V" l int i,sum=0,count=0;
- y d, Y }0 O clrscr(); //清屏
q9 N2 W" s3 | p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存2 x2 p, r$ x) T* l
p->number=1;p->flag=1;
0 E9 |) x4 v: s, G; d6 J p->next=head;
0 {: q' r/ G. {" i' g head=p;8 m, C" S) y" s4 f" h# ? x
for(i=2;i<=M;i++)/ B( ]9 V& ^, ?( ~' r: |6 t
{ s=(MONKEY *)malloc(sizeof(MONKEY));
6 L. J, }* Q" b! v s->number=i;s->flag=1;
! u% R! c" F4 A$ e2 t' d s->next=head;! O: I; {9 h* Y3 t0 F+ k2 G# D
p->next=s;p=p->next;
4 P" N6 J; ^5 m4 K- f6 r( N }
' G" y5 T: r9 u- S$ P; z p=head;# W1 s7 y e; O# [* `7 s
for(;;)
0 B4 A, `6 i; i3 E {if(p->flag==1)7 S/ i( E! r3 j/ f
count++;
1 |* u+ J$ k% O% l, G' _* u5 f" g0 P if(count==N)9 E) p- S/ I1 m$ {& e$ s& w
{p->flag=0;9 O( T7 ~4 u) C$ ]
count=0;
' z; }" n. N3 ^" ^1 @! S sum++;}
X2 m/ E" R. v+ ?6 F4 ?5 L if(sum==M-1)
4 W9 L1 C1 w/ k2 [+ D* W* C' N' j" M break;
) {2 ~0 U/ a3 S" l" u1 A9 G p=p->next;) J; d4 e& q1 M, @
}7 H& M" U5 p( s- O6 n C5 q: {$ w
p=7 n0 J7 u A* V3 f4 k
head;6 l( C. @5 `1 V
for(i=1;i<=M;i++)4 `) q9 |2 F) d$ j. s) M2 i- N9 f2 O
{ if(p->flag==1)
: c, K% S) B' V1 B printf("\t%d",p->number);
( m1 V: p, R+ V0 h$ I# l p=p->next;
7 e# Y {" {% b% h' Q }
$ ~4 w+ P ]# N% \
0 a; N% `8 s/ e$ p8 n! b
& u Y1 {2 y% ?1 B0 c, b1 F5 q4 n% ~: T4 x& S) R- R2 X
}
. P" ~( z9 o% f1 z5 E第二种方法:数组
7 ?% c5 L9 m3 r* b. |* ^% V#include<stdio.h>
, Q* \6 s2 c1 ~& O#define M 8
& \) X+ T; ^) M+ p3 B3 B' M4 estruct monkey! {$ R) L8 D/ N0 W N) m5 c! a* i
{int number;
" P: ~* G9 I; f B t1 W3 O( Iint nextp;
5 e7 i: p5 t- [% f) ?$ c}link[M+1];% {3 f" J% [1 z5 F5 i
( T2 O7 h2 }$ @$ B; p8 w2 Bvoid main()9 p# D6 }/ n; z3 E# q4 k
{int i,count,h;
; Z/ C* y0 F9 V6 E# L) i! _for(i=1;i<=M;i++)
, Y8 k9 J; h/ B; z- N{ if(i==M)
0 l; Y* Z4 J) y8 D" g, ` link[i].nextp=1;- x/ s$ t" `$ ]% h
else9 q. g" e3 F: p& E% g$ p
link[i].nextp=i+1;* }, R, s6 G* B J& S- I0 @
link[i].number=i;
) J, ~ s0 N1 a8 {}
# g# l* y6 {! u/ @: K' ]printf("\n");2 b* z4 g5 ]" |8 x
count=0;+ N8 B1 a9 ]5 n$ a; ~
h=M;8 f/ |6 ]9 d9 M) ]
printf("依次退出的猴子: \n");$ f9 { B( `6 L: }, N
while(count<M-1)
+ K; |6 i+ C% J, A" v5 M{i=0;* W z% o0 G F) ?$ C% c) A
while(i!=3)' l# E+ C; p! B* t
{ h=link[h].nextp;
' i q& l' W3 U# a! D, b8 Y5 J if(link[h].number)% h- x6 @, T: f# B: m& o4 v( G$ z
i++;}6 G- h, Y2 S# z3 H
9 N( h) U- a: f+ h) _5 \printf("%4d",link[h].number);* N! s( k. y& c V
link[h].number=0;8 e8 L5 V5 ?3 G% u$ b! Y; p
count++;
7 m! f2 e {5 B3 G; H {}8 M% R0 Q* A$ Q q! n
4 I& l! ~' [+ N5 i$ w; O5 z
printf("\n大王是:");# ]' g) d" G2 B# t( S' ?* v
for(i=1;i<=M;i++)+ _1 e7 E4 x7 W: L" u8 h8 A Z1 c+ D* b
if(link[i].number)7 e! _3 d' e7 V# g& \2 I/ ^- S/ K
printf("%3d\n",link[i].number);
) P _, O& B9 i$ @ c* b/ I
- y0 H( i; i" u$ k, [
w# A, D$ z# o# b4 [3 @} , i% M' |8 I' T
第三种是普通方法for循环
6 u- M% S. W: b#include<stdio.h>
& ^6 O) T1 N. G9 ^. L/ A9 j' n! h; yvoid main()5 K( d7 ^ V9 ]2 t3 m8 B6 k9 n3 C* m
{ int i,k,m,n,num[50],q,*p;. f, P+ \- J. Z
clrscr();' \$ v2 t( `2 ]
printf("input number of person: n=");* o& o2 f: P: i s, Y
scanf("%d",&n);
7 N. m% L7 {- a5 sprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
: n- O% J6 K( `& A scanf("%d",&q);2 }* H# |- S7 ~4 X+ u, f9 f1 O
p=num;7 B, @4 i) o+ E ~
for(i=0;i<n;i++)
/ U% p0 J! Z! I9 T6 o *(p+i)=i+1;) P: l( R Y4 e7 x
i=0;
4 i& ]/ H1 ]" B k=0;
8 ^, ^8 g7 t q% q+ N( \8 S m=0;
$ b( |! A. R6 T while(m<n-1)
- m, k, O9 [4 u8 U8 H" Y {if(*(p+i)!=0) k++;
, J/ i! ?% _1 C2 u& E' P if(k==q)( ~: k2 C4 o) [2 `( D) ?5 q6 b' [
{ *(p+i)=0;
' |, T$ p w3 {: j1 e k=0;' R3 Z0 @& b# O( L
m++;+ e, O; k9 M7 O2 b, I' _) H
}' _9 u: f: {# e
i++;# R2 O1 I* v" \$ d8 Q9 I( Z
if(i==n)i=0;7 r' c3 u) j/ n" X( p: q; D, |+ q
}% I" ]( B2 \0 H0 D* E5 r
while(*p==0)p++;# N( V* G# P1 Q, x2 U6 N6 [! {
printf("The last one is NO:%d\n",*p);( q1 O& z9 W7 D6 y' p& R+ G* ?
getch();
; N- z# {! D& h7 a% Y; K6 H, y
} |
|