|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!8 M! a. G4 }( y4 `* D/ D
这几天我在忙着编一个问题,我用了一种方法编出来!
[% ?5 B" X) u但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!& g, M t5 @" G$ k0 }
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
$ t* E. J& N% o. ]$ X9 W" K+ u& A0 {4 f3 N; f6 n# Y
5 O: _. d z) W$ k7 q
题目9 u* `" h( d- U7 Z* c" o3 L
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。5 J, w9 l4 o- P5 Q
第一种方法:利用循环链表; O) F+ k4 B% B7 V1 ~: ~/ T7 Y
#include<stdio.h>
( S0 M0 R3 q% S" f4 j#include<malloc.h>7 F. ^+ V- J% K! x$ w
#define M 8 //共有8只猴子
$ ^: h2 r/ ?% k3 c! s#define N 3 //数到3只时退出第三只. H3 g- P! l. B" j9 m
typedef struct monkey
/ B) f% d4 A2 d* p# c# e{int number;
. D; t$ [3 n, hint flag;
& {& c; C* p/ Nstruct monkey* next;; _( V) O* V6 J9 Y9 l, ]
}MONKEY;& z r/ i& m7 `+ t0 V; r
main()3 W$ G4 }2 s" n5 {: e! v
{ MONKEY *head=NULL,*p,*s;
5 O0 t7 ?( ?7 Z7 F( o7 y2 M int i,sum=0,count=0;1 j; f$ b4 G; R$ T. L
clrscr(); //清屏2 F, K# g7 _+ |$ S
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
8 `" ?) B1 E" ~7 G' W" t5 ~8 c, i p->number=1;p->flag=1;
, N* M; n/ M3 }9 x1 N( M! | p->next=head;
# ?% ^. @4 u K head=p;
) X3 \6 X/ }5 d/ N5 [: U- ~: E for(i=2;i<=M;i++)
8 D5 u5 T8 V3 b! A { s=(MONKEY *)malloc(sizeof(MONKEY));
) x* M+ O( p- B, V' w s->number=i;s->flag=1;
3 e- p7 w/ ^# n s->next=head;3 k8 O6 y4 _5 `8 ]
p->next=s;p=p->next;6 r) e5 @" t C8 p, \6 C. ?
}
/ ]5 G# S2 }1 ~ p=head;' x! P( p( H9 Y0 B
for(;;)9 v8 j. q- n5 c& }8 o
{if(p->flag==1)4 V* O$ L$ R+ g6 ?
count++;. w4 l, H7 `1 y, u3 i6 F6 ]8 t6 u
if(count==N), s- A* ~* c- k( N+ S8 \0 S9 Y
{p->flag=0;
# q, s. f' B: p; @1 [* z count=0;
/ T# t0 F) O* `5 b, J* M' B4 L sum++;}
) L% S! W# [1 d if(sum==M-1)
! ~& M' [! T# \8 a2 y, ? break;
. l6 G' A4 i, @, z p=p->next;
}! G! k8 n1 a% L# p; o }4 h: G: x! m. V9 d" x, ^1 N; a
p=( K: `" q& n% x9 u
head;
5 v3 e T; E) H! j4 G for(i=1;i<=M;i++)
k. H* H3 m/ w J { if(p->flag==1)
2 s+ F' m% V1 B, E# y printf("\t%d",p->number);- s& @, [8 b7 c: g' F
p=p->next;
7 I9 q$ A; n7 v }& q' q" O- i. s/ O
0 g( g8 P6 e. l) B# X
t1 Z" X( q. D% r4 E6 l6 Q8 ]6 v* {# Y
3 J6 y A! ]) e% U, W}
. }( d8 @2 _) a第二种方法:数组# J2 {1 B n" O5 o" l! R" a R+ V
#include<stdio.h>
0 A0 {; e9 N9 P `! ^- R#define M 8
9 q/ t# H9 f% Z& cstruct monkey
: H9 E6 A3 _! P$ t+ y{int number;# l$ F" m) i) I! t2 }8 }" }
int nextp;3 W5 ?8 d3 a& l8 a( u9 U2 V
}link[M+1];
7 y% o9 p$ c: ?2 H* a7 \' Z/ K8 \, `8 x R+ J4 P. q, W1 ?! Z
void main()
7 N' ^, `3 M! A9 ^8 g{int i,count,h;: N! h6 Y' V0 L2 y& k4 p5 O
for(i=1;i<=M;i++)$ G' c2 B5 e" j7 Z6 N/ @( w
{ if(i==M)& Y# a- j0 ^8 A
link[i].nextp=1;# p* Y5 p7 T, {( v* Y5 G& `
else3 O2 Q8 p+ G9 X% W6 d. k0 g
link[i].nextp=i+1;8 r( P: G) D( C, l) _# K
link[i].number=i;& } o& e7 ~( g; e0 L
}
. d! M% g; w" y! Yprintf("\n");- J0 P( s2 N% f
count=0;
6 W! ^) W6 c5 ]& ah=M;
' M0 Y C8 Z$ jprintf("依次退出的猴子: \n");
+ J) }* P6 a% ~4 nwhile(count<M-1)# b$ n6 B8 P! v0 a; w# c. g
{i=0;' t, b" \ P( a9 C: ~6 Q6 k
while(i!=3)5 g* q6 x# _; s" _9 p
{ h=link[h].nextp;( P' }" _" }/ X. I$ B
if(link[h].number)
3 c( Z9 n0 j R4 h i++;}
: K, c$ Z4 b1 x Q; M
q3 p% m! a$ L2 b2 g# h& N& w2 |* g+ Eprintf("%4d",link[h].number);8 g& G6 s1 ~: p8 D8 g- m6 p0 y
link[h].number=0;
5 v6 |7 }0 w# ]* Z) Q zcount++;( ?- K5 O% [, @0 _1 A! t, @3 I
}: C+ i$ u* s& h8 s
1 b; _$ I3 C6 r z2 M: u+ ^$ b! Fprintf("\n大王是:");
1 E% S# A( \ F4 c% j0 V: b for(i=1;i<=M;i++)" l2 i% H. D! j4 W+ E3 o
if(link[i].number), F% h2 G' l2 j' P
printf("%3d\n",link[i].number);
5 r( w" g* G+ y- w+ V, P/ I; l
/ U& ?4 |$ l3 p3 d4 `# t# a1 Z! }: t) I: b" n" Y( b/ Z7 E
} " b; g5 a- G5 g
第三种是普通方法for循环5 n3 z& C: l6 N- e0 K' `: H
#include<stdio.h># c' {1 C: D2 N' P1 x2 w# W
void main()! I% Y6 s: u+ r d+ D1 g: K# X
{ int i,k,m,n,num[50],q,*p;5 i, [( y3 m# K5 n. Q4 u
clrscr();
* R' E! W. B+ Y8 i4 G% T' B* k printf("input number of person: n=");
: |& }& \2 c+ a% m" f, \; G# q scanf("%d",&n);
! @8 U6 W+ Q% l. |9 G+ x, Z Iprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
8 i; r/ h* i9 e! c# e& G( f scanf("%d",&q);
( E- B( A, i6 i9 _ p=num;
! b. T0 \/ \- k8 U( E8 L% K for(i=0;i<n;i++)- x' o) K! j: T% _9 a' y U& C
*(p+i)=i+1;
% a6 N& ^% `* w" @ i=0;
" {; M0 m: u5 M6 d9 c$ ^ k=0; `! g( ]6 l2 t3 u5 l- U
m=0;5 f: L% @* z" C |4 {3 D
while(m<n-1)
: T2 Y' h! Y: R {if(*(p+i)!=0) k++;& G3 a0 S7 s5 e- D, w0 R, q
if(k==q)
- Y9 ~& H, @/ j8 I. I0 v- y6 s { *(p+i)=0;# B, r5 C3 B7 [) E6 c( D
k=0;
1 N t* v- v5 o; p. n: o m++;2 T! P8 T' R# {( |! X2 y3 v) a
} [) J0 N f w( e$ X6 Y
i++;
, x, c( |4 {2 \7 B* q1 r if(i==n)i=0;
- \8 P0 e. w/ O/ D* p }
- i+ H( p7 _$ m; a6 ^! v while(*p==0)p++;0 q/ ~1 Z' }4 F, r7 K$ C
printf("The last one is NO:%d\n",*p);3 x9 _$ H2 E! }& v S4 J6 f* F2 P
getch();
/ U# T$ B7 d; t1 m+ ], J, d4 g& Y3 Y4 C$ e
} |
|