|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!( Y/ F" t4 L0 u) G
这几天我在忙着编一个问题,我用了一种方法编出来!
( h. s- E* E. x- A" S但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
9 ?% Y7 Q. u9 @' q! O注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 0 I9 @; }. r |+ n# u
, S/ H" A g( A( F3 H) `! P5 X5 y
/ z9 Z m9 v0 y/ }, `* c. y/ i 题目4 }; j+ D5 K( G0 s$ x
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
' I |+ u# P d3 g1 s1 U第一种方法:利用循环链表2 N1 l" w% u- z
#include<stdio.h>: y+ X) t: `1 B) i; w6 M9 h
#include<malloc.h># }# ]0 \; n* j8 o$ F- H( m1 m
#define M 8 //共有8只猴子8 t0 c8 x/ M& v0 p2 }5 P/ X
#define N 3 //数到3只时退出第三只# w( U) e' S2 h" U
typedef struct monkey
3 C3 B" P0 H. r% H. J9 m$ |5 i{int number;, n5 m6 \2 B# ]
int flag;
, A3 v3 P4 P3 Y0 wstruct monkey* next;+ u$ p& V% J0 N& T4 h: ^7 U% q% \) k
}MONKEY;' h5 A, n M; j2 h, a" o
main()+ T. H; Y+ Y$ Q% {9 T- d
{ MONKEY *head=NULL,*p,*s;* `) M. F# k, e
int i,sum=0,count=0;7 f [/ F5 w K' k$ V
clrscr(); //清屏
/ }3 ?- Y5 G% E* ?8 L p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存! ~0 Y$ O- \/ G" ^ b( l
p->number=1;p->flag=1;
0 w# D1 Z% Y% K$ I; P p->next=head;
2 z# ], U B: C! ] Z4 |& R9 I head=p;
$ j6 C& l' D6 F4 {8 q4 b1 o4 i' F for(i=2;i<=M;i++)
# T- r6 y' s9 A { s=(MONKEY *)malloc(sizeof(MONKEY));
* ?+ x) s7 G, S! E, i" R' ? s->number=i;s->flag=1;; K4 ]% i9 @$ i/ m, V
s->next=head;
* C3 X/ n- s1 H5 i3 `; w' I p->next=s;p=p->next;
, ^* `/ F. |/ c& X# y& U6 f5 h }; X- x' V# o1 v" ]% w3 K. u# @0 L. D
p=head;
! L' P5 M0 k: y) | for(;;)) G, J# s/ T. X. V! Z) X
{if(p->flag==1)
( Q: ` R9 J! \ count++;0 G$ b$ u' M$ I; ]( u/ j* l% q1 m
if(count==N)
% b! o+ ^8 O& v6 r0 n3 n: l) Q; ` {p->flag=0;4 ]: Z. p9 x6 W7 `
count=0;
7 R2 J, A& p1 A# b' c0 a5 @ sum++;}
! [! v Z3 s, H0 Y2 v' T if(sum==M-1)8 e. ~- K/ j# Q8 w
break;! q u- l1 P* l% c9 q% |/ i
p=p->next;
; c6 j$ |; v' I; M, ~9 U }- c1 W: u1 t( ~* l$ J; w
p=
1 a N; [% D* N, ]5 T4 m7 x head;
/ f( m& t$ V, G9 Z. Y6 j5 z for(i=1;i<=M;i++)
6 b* G2 ~( s0 F. f& P* K { if(p->flag==1)
5 {% N6 i. e& U printf("\t%d",p->number);
% I) U) N5 B, {8 t1 m; b: ]9 ^+ V p=p->next;( T% I# e" q0 {- p! ?
}
- Y( E/ {; K0 y$ X+ r. P7 E8 ^- ]
1 q5 ^8 j0 `$ e) q, E$ Y& n3 K& l% I" p2 p" c- g
C& M) P% Y1 A1 M
}
5 x- U6 ~/ E; Q8 y. u( ~: g第二种方法:数组
& p2 ]2 v& O; }" c+ h#include<stdio.h>
& c3 R. v3 o/ T1 o! L7 R" y0 |#define M 8
+ |0 Y/ |2 i/ M* ]# P2 I: M" W, Wstruct monkey
1 w* t7 ?& Y, y" r0 C8 I{int number;! L* j& F' @; \: ^! h+ s) [
int nextp;
$ w- y0 K/ ?+ Y7 ^}link[M+1];( ^- L6 C) E9 e' q
2 e# R9 M: x* t5 C# F5 Svoid main()0 ^" X8 d1 V! r' L
{int i,count,h;% D/ f" ? S7 V" ]$ @% _
for(i=1;i<=M;i++)
0 Y1 b0 K( `' |* K' a{ if(i==M)
# w. _3 B0 u8 T link[i].nextp=1;& F2 X6 `7 _7 `- t$ k7 i
else
* a3 p2 f6 g+ a/ W2 y D& g& Y link[i].nextp=i+1;6 |. m }3 I$ ^8 b
link[i].number=i;
, G' H$ F: C9 k' M- U. z- ~6 X}
6 W! B6 l; X/ u! r2 i, W; qprintf("\n");1 {" H( q# d. f: ?$ G
count=0;* w9 z; j3 G4 Z" m% M* c4 P+ S; z- |4 Q
h=M;
& ]. a* C: g3 B6 uprintf("依次退出的猴子: \n");- ~8 A' @. G( j1 j7 a4 Q
while(count<M-1)
/ T5 g8 X5 @3 S7 P{i=0;, H! p {+ s9 ~6 h
while(i!=3)
# t" [) j" ~$ A4 S5 `. T{ h=link[h].nextp;
1 l2 m; C& s$ l R if(link[h].number)
5 y; v& N# Y9 n4 Y0 g' B$ y3 \7 z! ] i++;}
" u0 _% P1 i; x2 k! a6 @
5 b6 x9 w, D% u! E5 E# n& W/ hprintf("%4d",link[h].number);, E, Q$ u6 F* W2 S/ \" Q
link[h].number=0;
- k0 [ \% ?4 b4 g) ], e. N9 scount++;
, s* R( D" U6 E- ?8 }6 L}
/ k7 ^( n: c% e* J6 j# ~, S" e0 U3 l/ n7 ]; {3 ?
printf("\n大王是:");- ~. U) e$ a6 ?# u8 i
for(i=1;i<=M;i++)
6 ^7 D S+ l) P if(link[i].number)- K0 o2 J( Y) i8 I' _
printf("%3d\n",link[i].number);( z2 a# d6 X( E9 c* {
7 [# _8 @: p. I
8 ~6 h# ~$ W+ K2 L8 `
}
4 `" i. r$ `/ K/ q! v第三种是普通方法for循环$ P5 _. y5 d3 ~2 h
#include<stdio.h>
0 C" b: M: _" I, v/ [: Ovoid main()
1 g5 K! h+ ]8 |7 S{ int i,k,m,n,num[50],q,*p;, [" G# e& q" r1 r( E6 y$ y
clrscr();
1 E4 p9 g7 ]5 R! f printf("input number of person: n=");
- p/ A, Q1 s8 h scanf("%d",&n);
6 ], V. g2 g6 i4 Eprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只8 ?% L( A5 U6 }
scanf("%d",&q);9 w3 X1 h& z6 z$ ?
p=num;
+ Z4 ~5 h6 [$ l9 ^ for(i=0;i<n;i++)
3 q9 V8 q9 ]: p k5 U9 g *(p+i)=i+1;" t$ {/ n4 r" g" V6 f, }
i=0;6 S/ n; t2 P [0 k7 i
k=0;
: k# n( e6 I. [- s( P4 R* a m=0;
0 Y6 r1 [1 f+ i2 c4 O; O' a/ A while(m<n-1)
3 V7 |, V" e: a' P! _) X* C) n {if(*(p+i)!=0) k++;& k3 I( {9 _; q( P
if(k==q) r6 t; k" R7 X; ]7 I/ x5 O5 S: t
{ *(p+i)=0;
: G! ~0 u O/ k, e; L* x- z$ ~- @# y k=0;! n! k2 K% B: w/ S/ ~
m++;
6 i& F) |' U0 H+ {# | }2 ~* Q9 [7 r" A
i++;
* F! L' h& `# }. H if(i==n)i=0;
+ B6 ^& a- l$ M9 o! b }
7 \9 @* b3 @1 G: k while(*p==0)p++;1 g1 C" J+ f8 w. s
printf("The last one is NO:%d\n",*p);# O- O* Z3 z4 j" S5 P% @9 E
getch();
# P/ u) T+ @9 [, ^! v ?3 b& Q
; ], `* ?: Z# V" w! ~+ `$ b4 O} |
|