|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
5 T5 L M& M( p这几天我在忙着编一个问题,我用了一种方法编出来!0 i" b7 I" k# O
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
0 k) e% C0 I9 L9 ~' c' {5 Z) D注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ' o' I$ d2 d' F a
0 L) j+ f: L. E* b& R
. u# q# ~* Y4 |4 c: } 题目" O; o1 s7 p- m& L, c* \$ @( G
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
+ y7 J( ~1 Z8 Q* j& D" \第一种方法:利用循环链表- [3 n; J0 Z$ |% f+ F
#include<stdio.h>
% F3 W- a2 q& T8 E* I#include<malloc.h>
# c4 g$ J: R; ?5 s! G#define M 8 //共有8只猴子
) X3 g5 {2 Z! E; h#define N 3 //数到3只时退出第三只
: k/ u3 ~: @2 r* t; g* M* ptypedef struct monkey, K! f! V5 O8 W$ O
{int number;% N L+ Y8 P& f* ^% j: V( G
int flag;
! O. D- B% ?2 sstruct monkey* next;
, d3 G, @2 `, m3 @+ j! w" _}MONKEY;
; n0 \- i: U Y. f) q5 omain()
: ^2 o0 Q$ ~1 s o( k4 F( g{ MONKEY *head=NULL,*p,*s;
0 b. [! e$ Q! A4 @# [' j) T, _ int i,sum=0,count=0;8 a0 t6 N; l2 J8 X$ C
clrscr(); //清屏8 S+ h. t: @# m7 N$ E% y
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存9 d- \. l0 k; r7 E
p->number=1;p->flag=1;- Y. x# E0 Q1 Q5 k* y
p->next=head;6 M7 I; f/ D" h$ l% y+ T
head=p;
0 T# D; D6 H" J9 N" H4 o for(i=2;i<=M;i++)
3 \; X4 g+ {9 C, B9 R' _# b9 p/ n; H0 _( j { s=(MONKEY *)malloc(sizeof(MONKEY));# f1 }7 x2 @7 z# d. u
s->number=i;s->flag=1;) @* ~7 ^& H/ s3 Y2 p5 C
s->next=head;
0 ?: ~" |. j ?. _& T p->next=s;p=p->next;
1 F$ E/ Y9 v; p4 D1 p }
$ d. P0 `/ T$ d; `- P, g p=head;
# M, _ u1 o3 {/ t b2 M- W8 @ for(;;)4 `3 S7 ]' ]; ?' ^, O \. y
{if(p->flag==1)" y5 W* h N/ d: X: s) R Q% J
count++;' \% m# `' A" d: Q- V# E. u
if(count==N)
, m& v2 V1 {& K4 I {p->flag=0;. x$ C* ~" K G! F% m) V/ m0 i
count=0;0 X% f% F6 Z+ V
sum++;}( M2 W# W: _# f2 o
if(sum==M-1)
; e1 m( Z3 N( K* d break;2 K3 j- ~$ l- \7 k8 D
p=p->next;+ [7 ^& ~+ i' V! Z B* x$ @
}
1 ]3 r* y; B/ U1 Q% J" W! z p=: A) P" r( F0 s& a
head;
* S0 M& v6 Z- {4 H for(i=1;i<=M;i++)! }% e8 Z5 |. J. C: f1 I8 @
{ if(p->flag==1)
# A& c2 J: q0 W% f" k. n ~ printf("\t%d",p->number);. P" e' b W0 T. M- i
p=p->next;
0 y( s* k" E7 O }" S k9 n5 f% |1 B" l/ `: }1 N
- W$ j3 x$ Q$ ?
2 A! y4 j7 {1 L) k& D
" b C$ [" h" n7 N}
; i& J) u' ?, u% L6 H! X第二种方法:数组. V3 _* d$ U5 b# B5 O
#include<stdio.h>( X# j# {" V: N2 M' [+ f
#define M 8
. H4 V; L; R ^& z+ D! Gstruct monkey
9 I. Z) z4 O! H{int number;/ h" d; O- o8 K P
int nextp;
' S) h2 ?/ k# Z9 N& S}link[M+1];
4 X2 H( i2 b9 v/ P: B; q
, U5 `& z. w6 T5 uvoid main(). T+ l8 T; a" P6 H
{int i,count,h;3 _' w6 W8 `) B$ y* G1 {3 f- }
for(i=1;i<=M;i++)
5 a. a# v) N* M. w+ O{ if(i==M)
1 [/ D( ~2 G& o* i link[i].nextp=1;
' [( D: v9 e4 o. o, t9 \ else4 j: c. P; t9 G( {' A% Z, D' H
link[i].nextp=i+1;& G* L, a, u, E, g5 b
link[i].number=i;# e6 a8 M; ]% L( Y& W+ Z6 D
}# }9 o$ ?8 A8 v g0 {
printf("\n");8 k9 f7 B4 S# \/ V, l6 g+ A$ B2 ]( o
count=0;
1 n$ p+ a, \7 A- q; {8 u4 Th=M;' ?# e# `2 I# `# O, x
printf("依次退出的猴子: \n");4 ~8 `3 k6 W- m1 G& L; w, ?
while(count<M-1)$ o( a4 h" J+ I; T; q. D/ C
{i=0;
: h3 B7 _$ i; l" y5 l8 lwhile(i!=3): K3 |( e( x( x0 @7 P4 r2 }( E/ S+ K
{ h=link[h].nextp;% T* r1 T! p. W1 B& W+ ]
if(link[h].number)
: _" F( b" h' {4 V% e4 t i++;}
$ b; F; ~7 _: p8 {
' I3 y4 n; w# Lprintf("%4d",link[h].number);5 Z7 d+ N7 W F
link[h].number=0;
% J; o. A: K+ c2 }count++;
5 m7 M9 ?6 F6 [}( T9 ~: e- W! l% ~5 @! a5 @4 j `
, N4 N, K* q/ |: y2 Eprintf("\n大王是:");! p/ o% f. w h, ?5 e
for(i=1;i<=M;i++)" g+ A7 ^+ }" p ]! |2 N& w
if(link[i].number)
# L, G4 s0 s8 X( G: @. `( r printf("%3d\n",link[i].number);
3 t. ?! J3 ^$ X% n- j7 s5 @" @7 n+ |. i S3 f2 U9 K! `1 ]
4 k4 P/ V! Y" ^2 N} , [$ y. i4 ` b- F/ a* K# |
第三种是普通方法for循环; t7 m5 I6 Y* M5 O* `8 L
#include<stdio.h>- w3 o" p1 _$ N; W
void main()# U" A$ F1 R/ r( Z# _* M
{ int i,k,m,n,num[50],q,*p;
; C" X6 y E/ J# J clrscr();
7 t t+ _/ K. \+ v" C. k printf("input number of person: n=");
, @7 [& i0 t1 `# G scanf("%d",&n);( v! ?1 E r* d9 X. v, U
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
+ j; O& I! E0 ^ h scanf("%d",&q);" j0 Z- n- ?& f" S: m
p=num;0 f5 i- B) j" j8 S3 a3 F0 C) ^! m% p
for(i=0;i<n;i++)1 J0 y& ?- E3 x9 n
*(p+i)=i+1;& N7 [, m X/ {" e8 |
i=0;2 ]# T% S7 M- y. ?( {
k=0;
0 b" \5 g P& g+ w% A, m9 b m=0;! Q6 t2 u5 h& Q. ]
while(m<n-1)
" h; Q9 O* e8 N/ k {if(*(p+i)!=0) k++;
$ D x8 j6 `2 i( P1 q if(k==q)
; Y* J! w, K8 h7 U { *(p+i)=0;8 v# G6 r( H2 P3 t, r
k=0;' Q" K( Z9 R6 k/ i+ W( @
m++;8 k1 _! O; z( F. U
}+ O) s. M/ S' X/ y) d7 h& z
i++;
' o0 ^$ N! p; a; o5 H2 ^ y% B if(i==n)i=0;) {- O# d+ b( x2 ]/ v6 Q
}
+ `% k2 y5 \$ i' K1 C1 B while(*p==0)p++;
5 k" R3 d9 d" e0 k0 k% [( X printf("The last one is NO:%d\n",*p);
7 B( G; f6 j$ f; @- g O4 u getch();
! j7 z& B" D' M( R
9 O$ w( Y4 J1 ~" W( C% ~9 x: a} |
|