|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!* p% [9 \+ l' s
这几天我在忙着编一个问题,我用了一种方法编出来!! Q- p7 \ i1 }, ^- A% Z4 s
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
- q0 @, n; X2 |$ g; r注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 9 a# H1 l; p, b# s6 \5 E$ ]
5 x8 Y4 n& P }* p P$ `( P
& I, X0 w7 x9 b1 D4 p! h/ O0 G
题目
3 b4 z3 S: j! t- z H }3 \山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。8 ~7 e% m, n* F0 w: L
第一种方法:利用循环链表9 z0 t+ `1 u# I) P$ X( N, i- q, e
#include<stdio.h>$ A2 V/ s0 [8 X6 H1 z0 I
#include<malloc.h># H1 F; q1 y! X
#define M 8 //共有8只猴子
5 a O4 @; @* f8 B3 Q) n#define N 3 //数到3只时退出第三只
% Y) ^ I3 s) S" O% V0 r, Ltypedef struct monkey
. w1 \8 G; b; S; i$ D4 c{int number;% j0 f" x. z8 }2 i' G
int flag;
1 J* s9 ~6 J% Y# o" c6 `struct monkey* next;( B2 n& c& J* A6 P. F' k6 |
}MONKEY;
* T2 `; u: k1 {" b) }, Lmain()2 I) l; v0 E, X$ t, j% G) Y
{ MONKEY *head=NULL,*p,*s;
, D! E I4 z O4 k8 a: z5 D int i,sum=0,count=0;
& A2 ]" p7 d0 g7 r' W clrscr(); //清屏
p5 Q a9 y/ d% D7 c. v p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
- v6 Q- r! h2 B, q# W8 { p->number=1;p->flag=1;
+ l8 Q* e; M' G p->next=head;
# d* @0 `7 v+ S# M! k head=p;0 A3 Y3 s( x$ \% A* m, p/ D
for(i=2;i<=M;i++)
/ [5 e0 r( q7 P1 \" c$ t { s=(MONKEY *)malloc(sizeof(MONKEY));
3 r1 T% n! H5 ]; O; Y s->number=i;s->flag=1;$ i6 G/ J5 l' S2 W% C
s->next=head;0 E) T4 K/ Q) t: E$ S- o% q9 v* v
p->next=s;p=p->next;
3 u, c A3 L" |& e8 ~! E7 g }9 I# p4 Q: @* |# }5 Y. k0 A# m# }
p=head;
3 {* b2 U/ O5 U( \2 ^7 | for(;;)
" d% d7 A1 ^% I8 G. O {if(p->flag==1)
3 G. L; Q! [$ a' o. p" j count++;$ O5 k" B) k! X* u- h, J0 l# j6 J
if(count==N)4 X% X. _6 w; ~% R1 S) o9 l
{p->flag=0;) F* T6 K3 u, o v
count=0;
# ^ H" T3 K3 `8 K5 k- Q4 p# B. Z sum++;}
( e! u& F0 g ], S. |* O. c2 E @ if(sum==M-1)4 i J( k- A/ f; r, c3 [
break;( w; \% b) W2 `8 {4 r( v
p=p->next;
2 a( L- V- D& }3 O }/ q! A/ Z" l# \9 X U( r) p
p=* z. a" _/ v% Y3 F% t2 V
head;
& ]) d' D I- x7 i, q! h: w# N for(i=1;i<=M;i++)5 S9 T1 u/ v' u( C0 t
{ if(p->flag==1)
3 f1 T2 U, S0 ?) k* q printf("\t%d",p->number);
; }& D6 P d: J! C, h* f- B- M p=p->next;8 u. e( c; Y% t' s
}/ U4 V; h* t4 e V- Z
" P4 B0 K0 w8 @' F" }4 q8 G- U0 O3 Q1 w( `7 `
1 I* z ]0 z, V: Q} ! ^/ k6 V# C. f
第二种方法:数组
! n$ u3 h- i3 A7 A2 x, N, ?" j+ e#include<stdio.h>2 D4 j6 J5 l( v
#define M 8; r% \6 D/ I2 S1 s) h& z) f* n
struct monkey
, [$ {: W4 S( V{int number;+ h) X- j K8 m7 L
int nextp;1 P8 O; @- s) {; b% I7 t, V
}link[M+1];
4 ?) D4 K5 g3 S3 @& \2 K8 Y
2 |$ e7 _& @3 |* q z% D1 D+ E0 rvoid main()
u: N3 }. n/ i4 `0 F+ J$ A! k{int i,count,h;
7 V" ]- u9 C( U! A; e$ [8 ffor(i=1;i<=M;i++)
" ?9 ^ {2 g. ]7 c$ }$ Y$ h{ if(i==M)" j; W, x" F) v/ [6 d1 s7 a
link[i].nextp=1;
( g4 K2 i* H( f3 i+ W+ A7 `! ^ else
: H* p2 z) y* f$ R, r link[i].nextp=i+1;5 J- i! I+ x0 [4 F+ \3 ~' K
link[i].number=i;8 N0 s; [1 s. Y) Y
}
8 r( r' [1 V4 O- e/ _printf("\n"); A# a) R. G) w: f2 i( A
count=0;
' L+ j$ r0 E. i* d1 `h=M;) z( V0 D/ t0 i9 S; N
printf("依次退出的猴子: \n");0 G [1 ^/ ]1 o6 E
while(count<M-1)
# [( r0 h+ C: c" A a{i=0;
" P; _5 @1 V1 m, u( Owhile(i!=3)
) w3 @5 O$ B7 o% m{ h=link[h].nextp;) e" `# o# c6 [! z4 f
if(link[h].number)
- E. S5 v/ T+ T7 X; q/ A$ N6 {2 R i++;}
8 A' a A6 s/ k8 ~; h! K* X* `+ y* N: G' S
printf("%4d",link[h].number);
6 G& L1 X) A8 X4 J; b- P! j7 W# klink[h].number=0;3 \5 `0 J3 q0 ]) L0 I8 A
count++;. {& z" J8 ~8 s/ v* c S/ g' L5 ?/ E! e
}
# s/ L ^4 J' n u# [+ p- R8 o7 v
) n$ S- u6 l* W- e5 i- Bprintf("\n大王是:");
8 T2 S7 X. K6 C9 O1 [6 }5 e for(i=1;i<=M;i++)
+ \( V0 X4 p J! N* h- A- Y# z, M if(link[i].number)
3 V% {7 U! W% | printf("%3d\n",link[i].number);' T. _" y2 q+ H. C4 D5 `
# P% h! D5 q i1 z! Q* H
7 g {+ E9 i( X9 Z2 ?
} " n2 U# @, a- H% J- B0 J" M; _
第三种是普通方法for循环# d7 r% }( q4 V# n) }
#include<stdio.h>! k0 D+ ]6 l" p5 c2 g/ P- s" }: Y Z
void main()
1 u# Z3 n0 O5 e: H{ int i,k,m,n,num[50],q,*p;. i8 f2 n6 ^3 N1 w3 m
clrscr();$ N- {& r" X# ~6 |3 q
printf("input number of person: n=");
7 p; y! x8 C; c( d5 s scanf("%d",&n);2 E5 k% m T4 W
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
; [7 w, S) f# c u/ X scanf("%d",&q);' H- P e2 P9 D4 m) i, [: A
p=num;# L: ]* h" h; x( D# }
for(i=0;i<n;i++)
) U( ]) M& I1 G! [6 K! K. F' x *(p+i)=i+1;
* h. U# A$ b9 n3 D i=0;1 Q9 A* e& ~: o4 Y" b- S
k=0;
# a( m2 L- |1 @! V: y2 c0 { m=0;
. r" l n) h0 ~* }* Q while(m<n-1)" {+ b5 k4 ]2 ~* o9 Q0 r1 M
{if(*(p+i)!=0) k++;+ J" s1 ?8 O P. P( Y
if(k==q)6 `0 k/ n0 N5 u6 s( x
{ *(p+i)=0;
2 E, L+ u* a. m9 l, w k=0;) O1 a. G7 ~3 ?0 y
m++;
5 a# M' a. P( ?6 z; }/ L }
3 L8 G0 X& L( D( ~4 t/ T i++;
. B3 h* k: p+ b5 i1 B if(i==n)i=0;
0 b7 W2 }+ A5 R8 `4 l3 G8 L }/ k5 b' X P( t. @( C- v! w
while(*p==0)p++;! S/ v1 f9 ]7 \+ x8 ?( b, m
printf("The last one is NO:%d\n",*p);/ ?1 k0 R" C$ ~& G
getch();
* D' E" r+ W) R. \: X6 x1 o8 N
% V+ S0 \2 r) }" h# u} |
|