|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!& Z" s# ]6 Z- n4 W. U( N' c3 U
这几天我在忙着编一个问题,我用了一种方法编出来!
! F- I( m/ q" h- M. C' t但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
# E- s2 S5 q: X& a2 @& J# Y0 ]注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
% ~/ f$ M/ q( Y$ `, \, T
+ _4 h, ~) ]8 I$ t
0 i$ e3 W1 z; W* L6 S% ` 题目
. f, f6 D( j" O; N- w山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
2 \- k6 j7 Y2 d# h I第一种方法:利用循环链表
; C) x, R; c' Y% Z& K#include<stdio.h>
, I1 _! D7 R# c#include<malloc.h>
5 q' h' N& z* f; C#define M 8 //共有8只猴子& P! P, `0 f. O* A9 R2 ?6 S4 o8 M
#define N 3 //数到3只时退出第三只
- {0 U6 a$ b" }9 Z6 A( Z8 u0 ktypedef struct monkey/ m& R1 o! z1 m& J7 I8 }6 V
{int number;6 [3 y: h& U; `+ N7 t: Y, f
int flag;' {, a, b/ I. ?( N. Q G+ r: B
struct monkey* next;6 Q5 Y7 Y0 t/ u a
}MONKEY;
+ `! b8 {4 f( m6 X! x$ [# j' ^main()
; V8 g$ a# q D8 B+ A{ MONKEY *head=NULL,*p,*s;- P \- D q5 \! g) V; D
int i,sum=0,count=0;
- q2 t. I$ o) \% k clrscr(); //清屏
/ U2 E+ K2 r8 m d: ^( a, |$ @8 b" i p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存0 a! Y& A5 _+ r% a5 B; l
p->number=1;p->flag=1;4 T3 i5 d* z6 v$ `. T2 C2 L6 H# g5 u
p->next=head;: \ S4 E2 o1 p; T3 R) l3 h
head=p;
$ N6 s/ }: E) p) n/ p( L/ K for(i=2;i<=M;i++)+ J' I. H. |1 Z7 k
{ s=(MONKEY *)malloc(sizeof(MONKEY));0 A; d* e4 Y2 a1 q$ E% F
s->number=i;s->flag=1;
! t6 b9 d, E) j0 i* u s->next=head;* e ?9 s1 W# T( \: W. ?
p->next=s;p=p->next;
5 ~: F7 G( m- d9 z$ B7 g }
: y: e0 m" j7 X _ Q! R! | p=head;
. r. b4 G$ ^/ h7 b- _ for(;;)9 k- ~. o' k& R$ n1 ` ~
{if(p->flag==1)
7 s4 ^2 Q- e% [# ]* I0 F; v+ W+ d count++;
( i3 r- e) r6 i) b6 G$ Y if(count==N)3 g+ L) S4 w% R9 B# L8 s# x T
{p->flag=0;4 l" q8 @+ g1 u) T; g
count=0;2 F8 D P2 k0 z Q# U% O& R
sum++;}
% r. c( ~5 a( J if(sum==M-1)" e; {8 S' W/ ^% ` h( F0 D1 l
break;
" b6 _" [) [* q5 j" l. O p=p->next;
. G: J( ?, d. b* c/ x0 E }
/ k4 n* B# |- N. D p=
9 D/ C+ j& [( R' d head;" v4 @( S ^1 S: O# a, a4 Y3 d
for(i=1;i<=M;i++)0 T! P$ ?( V4 O0 f: H) d
{ if(p->flag==1); }, U I1 v* F; | I
printf("\t%d",p->number);
+ `4 k! s/ b, [$ e0 D8 F0 S p=p->next;
@: o, n, G% u" l& Z( ]& `& a }, Z7 T$ E- k3 G
7 E w2 ?& u, x; G+ Z: B2 B7 c' e- u1 |" O8 V
9 `7 w( m* W+ R c9 H5 Z+ L
}
% ` c `' m! P第二种方法:数组& C5 b1 V# H' k7 _5 b; s {
#include<stdio.h>% u B3 F* z, s! [
#define M 8
+ L* b' x8 w* B' l( bstruct monkey5 C2 A, V" X3 u* `) L
{int number;
" K3 X( {$ k, d9 r# B+ Y5 K2 }0 ^int nextp;9 n$ M+ ]; c# o( C" |6 ?8 }4 a1 N. e
}link[M+1];+ y+ o% W9 X" b% E8 J9 t, a
! ]( o m0 }4 e" Qvoid main()
) ]. f$ [, {7 V2 G{int i,count,h;
l) Z! N# D0 {9 r1 g6 u6 L) Wfor(i=1;i<=M;i++)' E0 [. p" o0 } p8 l
{ if(i==M)
, I0 v" r O: W5 _- j link[i].nextp=1;
$ u! d2 n5 ]* ?3 E3 K) j% Z else+ g" @6 T( ~9 c, E& a
link[i].nextp=i+1;
+ B9 J- f9 r- U link[i].number=i;& ?9 [& Z2 g5 E6 t8 h
}+ ?* q! G4 I% h5 |) j( @
printf("\n");" A2 s4 {; \8 X$ S/ e
count=0;
% a [" x3 Z/ m* g H3 y+ Gh=M;
/ S& g$ \2 M4 o- \* uprintf("依次退出的猴子: \n");' u, L5 |, H# n: R2 V' {/ @- q
while(count<M-1)4 X7 f6 J7 A: _0 m/ c- `5 p* G
{i=0;( s2 q2 B0 J: o$ r4 o
while(i!=3)
S( J' P! e0 o0 j& z{ h=link[h].nextp;
4 c2 o, s$ `1 V. D$ ] if(link[h].number)
) z6 c, S4 v% k1 p! t/ ? i++;}1 b/ U O& c' `6 e! _# u, q: b2 h
0 W" G. S3 c2 \) Y' jprintf("%4d",link[h].number);
4 j7 M5 n8 W# Xlink[h].number=0;; [1 A9 Q, N) C# \( _
count++;
0 Z. v% L1 M) o}0 M1 }& O: A- }! B v& D2 j
3 H. V5 C2 @3 ~* s3 }) g; `
printf("\n大王是:");. p1 N ]% P9 ? Z* |. u
for(i=1;i<=M;i++)
. V) ^0 c- W2 L) d; F# O if(link[i].number)
8 \. R0 j. \/ e: j+ m+ }; F) C printf("%3d\n",link[i].number);
/ Y; w2 t; F5 m8 p' }
% ^/ j' ?* @8 r' A, f8 j# H
6 s/ T+ ?. G9 Z. m C. D- }% |( x} 1 }7 d1 b7 c7 X' }% y6 c7 _
第三种是普通方法for循环2 }' c$ f* f* O$ M* E t
#include<stdio.h>
* Q) r9 Q- v3 K1 K dvoid main()# A8 x. P' @8 v6 s5 \6 f4 [
{ int i,k,m,n,num[50],q,*p;
/ Z) C0 d( K- Y! d- G2 B. v, B+ a5 O+ v9 t clrscr();* n* g! k. f, y0 O- c; I% h5 |" J$ ?
printf("input number of person: n=");% ?" `3 K1 k1 {4 Q
scanf("%d",&n);
5 B" U. J% y; m# B5 m) Lprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
+ L: o- T" v3 b# H8 @3 | scanf("%d",&q);4 a6 P( z/ Q1 T' @
p=num;# L" v# m/ L3 N- B' e/ E/ a
for(i=0;i<n;i++)
% E8 H f; H* @; ~ *(p+i)=i+1;- G1 r! a0 C4 U4 Y4 C& p3 v
i=0;
+ e" X; ~ G4 H, U! b& X k=0;
& h" c4 n, t X* X m=0;
7 ~. A; Q1 l, u9 O+ F' d while(m<n-1)
& \5 z9 y/ c2 j3 {7 n {if(*(p+i)!=0) k++;
2 z" W( c, C! o( P# q if(k==q)' }# S3 C# R. Z% k [
{ *(p+i)=0;
" W$ O8 R- b, l: a# }+ C5 `. Q k=0;' `3 R S' Y% I/ i' K
m++;8 R2 g6 q- s' A5 u8 x
}
( C z2 n8 I0 ?' K- i" O2 W$ J i++;. y! o; W- q$ w0 _7 k9 O
if(i==n)i=0;
, S9 F: y. K4 k2 I }
! S% r( ^# A% v& T9 C9 X0 b* Y while(*p==0)p++;
& g4 \; v: D, i7 ~& j* S printf("The last one is NO:%d\n",*p);1 j' J) V) e5 E) b$ o* N X
getch();7 {: W$ B5 ^% b
) y7 E* |, H2 S
} |
|