|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
/ \2 V) v- v4 ~" `3 X( l这几天我在忙着编一个问题,我用了一种方法编出来!: k7 W- \! m' H; a A J6 ]' W! v
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
v3 y8 w$ k4 R& u3 n* P注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 & q7 b- I$ I: V. o* i9 E ~8 t$ B# t. @
4 @4 e: h% ]& z1 S& u3 N* c0 \! I
题目, q$ I7 }5 u- l- f. S* }9 s! I
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
, R4 F6 k4 u1 J7 a7 w第一种方法:利用循环链表8 A! _; _/ J0 m* ^5 b
#include<stdio.h>
" ^% L0 ^1 }- y( ]* O#include<malloc.h>1 U. H" l1 l$ ^5 c
#define M 8 //共有8只猴子) p1 R3 Y7 w( B8 p7 k; R/ Y
#define N 3 //数到3只时退出第三只4 ^3 H# U/ q; A* T
typedef struct monkey" x* u" Y: A J% v$ t% p; k0 D
{int number;
: ^( S6 X7 R d+ Oint flag;
0 u1 x$ _. x: M: `struct monkey* next;9 `! l% |+ Y" K! j! d n0 G
}MONKEY;" v6 p$ O! u, y- K" i" n v
main()
( N8 i7 e6 ]" R7 d% D$ y5 R{ MONKEY *head=NULL,*p,*s;
, {5 z- H; n$ B8 e! B! F int i,sum=0,count=0;! i: E6 e3 p( A1 B: K; F
clrscr(); //清屏: D Y( P8 j2 m. {5 }
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存9 `) g) ^% X$ f R8 S# |
p->number=1;p->flag=1;
W9 _" z/ A$ E! E p->next=head;
i- s# p3 V$ I head=p;/ {- B. m& n( d. }3 _4 P! g ~
for(i=2;i<=M;i++)
2 _: t5 J, i, l; v6 d9 R: E, \ { s=(MONKEY *)malloc(sizeof(MONKEY));: [& i e4 q) x d
s->number=i;s->flag=1;0 t# I+ t; z! v6 v9 M1 e8 S
s->next=head;3 H, g3 v7 d+ f
p->next=s;p=p->next;
. T5 }) J1 N: E! r5 h }
; k, q& a! B) j: Q1 {6 ~ p=head;1 }3 f- z& E6 p0 @% K$ y
for(;;)) R; H# K6 T% d, x; ^
{if(p->flag==1)% t: f; A$ P% t2 |1 @6 Q Y# ^( \5 Z* I
count++;
5 y$ b& `6 X: s, K if(count==N)6 ?6 ^, P1 u. G0 i7 R) Q3 L7 M7 [# r
{p->flag=0;
( F# u$ _. O2 { Y count=0;' k) A4 ?9 c: ]5 m
sum++;}- J# _' s( g( ^
if(sum==M-1)! E5 r0 v K. j) F0 |
break;* S6 |: _' O& k! a0 q
p=p->next;7 K a# ?5 _" P
}
+ G! y" n$ [7 \5 x' a p=% U7 E2 X- d" W9 z* `% V
head;# q7 ?* { y& S, Y% {
for(i=1;i<=M;i++)7 X* Y4 k* l$ G; e% L
{ if(p->flag==1)
7 B9 f( K: M1 c% B: Y. b* M& E4 s printf("\t%d",p->number);0 i( J7 e4 c- l' r. f# D
p=p->next;
6 o9 Z( }/ r, w' |% k }
; X D' W/ Z" n: b3 S4 w3 q3 Y# G. K
! T$ p* u5 S7 g! N, _
5 y; O5 @5 R/ j# a
}
6 @0 b& I% m& |9 W第二种方法:数组. e$ A7 y9 v& _$ g, S6 R
#include<stdio.h>
* ~9 W. V# D1 k* x' Z0 U6 ~#define M 8
7 X# _* I" o2 Q" _+ t, Y! ~5 m Q6 cstruct monkey1 f$ }) X8 s: f0 z' j% s5 g3 I
{int number;" }2 q1 N0 |; b; S9 Z1 |/ B: T. e
int nextp;- v/ V. n7 Z2 g, t. c' J
}link[M+1];( S& z4 T- G& k( A# `
# p& I/ m1 e* ?9 m! [7 ]void main()# _- t0 A Q) C# l
{int i,count,h;
0 {% E8 ?7 q, dfor(i=1;i<=M;i++)
% z3 X% u/ X9 z! r; t# D6 t# [{ if(i==M)- s# b$ U7 e7 i+ l3 o. ]
link[i].nextp=1;
+ B3 r i$ V& _3 i+ H' y3 M$ b else7 T& {* L* V2 w' ^8 l
link[i].nextp=i+1;
1 v+ P4 E3 P3 _6 [5 J0 s( Q link[i].number=i;
; d" o! P& `, g, v# ?% H}
/ W. k/ A, R( [# |printf("\n"); R0 ?2 [1 z9 X- O
count=0;
3 {2 A+ R3 [1 A0 f0 ^1 \6 ch=M;
8 ~; D( s, `" {) W- G2 hprintf("依次退出的猴子: \n");
* P$ }" B3 G3 K: ~0 z) Z4 N5 |while(count<M-1)( o/ @/ \( t) |. g
{i=0;, r- i& o* S( z% @
while(i!=3)7 K+ W- H& K( K9 E0 E
{ h=link[h].nextp;
* X4 d# m7 B4 C" ^" ` if(link[h].number)
`: D0 O7 r9 M" q i++;}
, B/ J* J# O' c+ m6 y0 t8 S
: E4 C n: X5 k2 {: [- @printf("%4d",link[h].number);
8 l( [3 ~& y4 G- plink[h].number=0;/ `; q, d% A% X* O
count++;2 F) s* \1 g2 I1 E
}
: r6 d; s4 j2 Q! t% }% q
5 |# }0 z$ w, R \. l i4 y _" qprintf("\n大王是:");7 |0 h3 U+ `) Z. Y3 P( x
for(i=1;i<=M;i++)
0 \( \/ K) F3 ~( V if(link[i].number)
6 P( e+ `7 u8 R; J# u) m2 Y8 x printf("%3d\n",link[i].number);
) {7 X& r/ Q e; d, c7 ~' [$ |6 @$ J! z8 ^9 G
- B( Q% ]; G! r7 ^}
! |% T( z1 v& f4 H. h第三种是普通方法for循环- ^ N7 O8 p( j" F. p- J8 v+ r6 F
#include<stdio.h>3 s2 i- n) m3 V) l" |
void main()
H. Z( u; r) P0 Z& ?{ int i,k,m,n,num[50],q,*p; B$ v! k. }4 b# o' A0 O
clrscr();
$ X! l. M/ _- Z7 | printf("input number of person: n=");0 S' C* ?+ g) l3 k5 Z
scanf("%d",&n);2 C1 v, L. \4 h$ S: s: N# @
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
2 A% O _8 K8 @$ W# p scanf("%d",&q);
8 F% {$ x$ K; }8 X& ?; Q p=num;
0 d2 [ [5 X Y9 ~' b2 b for(i=0;i<n;i++)
+ l$ w& y4 S" h3 N& Y *(p+i)=i+1;
$ x! ]- s0 {& a i=0; F |9 F- K* e
k=0;( r* L2 [" R# w! v9 [
m=0;
+ h' d# \4 L, y/ L1 T& [* P3 p while(m<n-1)
" p5 C- U" ^2 c% C/ X {if(*(p+i)!=0) k++;/ F; X5 a( S+ \* G' x
if(k==q); Q5 r) S0 |8 L) T
{ *(p+i)=0;: e. Y2 S% O7 P1 N4 E# k* h
k=0;" \5 w+ F# P; A$ N2 q
m++;" L7 t$ g3 f3 S+ {% |' {% e
}
/ {! Y% b1 c; e/ | i++;
9 E$ a# R& y& A5 [+ [% x if(i==n)i=0;5 ^6 G K F4 a1 D2 t
}
, D1 U+ `2 T4 k while(*p==0)p++;% s W# \$ y) \6 j" }
printf("The last one is NO:%d\n",*p);
( Y5 n1 t* }( @6 x5 R! s getch();* r8 u& X( S: \9 E
4 Z0 z5 g1 ?6 l! E; f6 d7 d/ p7 a} |
|