|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
. K! k# O* R# P4 C3 P这几天我在忙着编一个问题,我用了一种方法编出来!
0 a( o; X3 A4 L) u( X. a( i但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
7 X" h1 @: J9 B# J, U, [/ M注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
+ g! D& c4 n9 P5 a( d X
5 }2 a$ `: n6 m% `, G
/ h2 R8 ~/ v5 d 题目
. W" y: V& f5 t* T( r& k山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。4 {6 t6 B, R* E' E' f- b# i
第一种方法:利用循环链表
2 Y1 B( @/ t; |#include<stdio.h>
% Q3 P9 y% L- a5 t. I6 h0 i: h#include<malloc.h>
/ V. f+ C# k5 y& r: C' j4 n#define M 8 //共有8只猴子& G, q$ H3 r# ]+ E; Y$ u" g
#define N 3 //数到3只时退出第三只
& E! V# R, U/ P$ z: t) ntypedef struct monkey
9 c7 {8 y2 A( W$ L% S{int number;- G, F, z# a Z, n @2 m
int flag;5 g9 d" ]" v2 y. D
struct monkey* next; a l2 Z: t0 i% v! \
}MONKEY;
! Z" ~" D+ C# U/ `1 g: Qmain()
3 F; f+ S; z% x6 h& J3 l/ d; u{ MONKEY *head=NULL,*p,*s;; [5 C; N% @7 B8 a0 Q' B
int i,sum=0,count=0;
/ w, X- C4 v# R clrscr(); //清屏8 K" H6 y, c/ d) U9 x5 s$ {
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
; y" g) n3 H& Y* Y& _/ i, X$ w p->number=1;p->flag=1;& }% K7 U) I. [; z& N) F3 O4 u! a: O
p->next=head;
4 G+ `0 i! y5 r head=p;
! J% d, W$ K& X( C$ o for(i=2;i<=M;i++)
9 ?! u0 x3 |- l$ H { s=(MONKEY *)malloc(sizeof(MONKEY));3 k8 q9 X/ V4 t! c
s->number=i;s->flag=1;
% {' u7 T0 Y4 U# n! y7 U$ @" @, k s->next=head;. S' H; M4 O. L- \
p->next=s;p=p->next;
* }- C3 O: S1 x' E( @2 H7 a9 k1 V }" J6 u' w+ l% l8 A5 Z8 t+ D( p
p=head;: m( _3 g0 Q* T3 y; f" @! C
for(;;)
2 P4 Z9 b1 W) P+ { {if(p->flag==1)
3 Y0 R$ r, O; m- ~+ E; U3 V; E count++;
! i, r. p2 Z, g if(count==N)8 Y& e! a3 \" k1 E
{p->flag=0;$ p/ q# z! A3 g1 r; ^$ \) N2 I
count=0;
4 e9 i+ u; ?+ O sum++;}& a7 \& _! h: H1 K- p1 \
if(sum==M-1)0 a5 |$ x; y6 T* p7 ^% t( ^
break;6 N/ |, m8 Z5 v( O
p=p->next;; q) X: v7 V, C1 E+ A$ j
}
; }5 B, O+ D4 G4 X. @8 ]9 b; o0 S p=$ H7 @) [, ~% L; H/ e8 h
head;
3 L) E: H" W) b0 p; z for(i=1;i<=M;i++)" G: y% a8 [! S& Q4 U6 o9 f
{ if(p->flag==1)4 N% P; ]2 ]4 o; Z. s' q
printf("\t%d",p->number);
- N" u, H( E- y& L9 u1 X p=p->next;8 L5 n% S& s& }' b
}* b4 f0 r# n: N$ V% Y
; h& E% b) ]4 j3 p6 A
8 O8 Z) t/ l6 E r1 O- J' b
4 J; g- K) J, w/ j} - h# w9 W* Y% D0 p7 A
第二种方法:数组( Z2 V0 o: \9 _- B7 o: ~1 m$ P
#include<stdio.h>5 r( d% g' X( R! @) V' A
#define M 8
- w6 S3 M- V1 _* estruct monkey
9 l T6 `9 L j7 y{int number;
6 d4 X& A( i, j: i" v$ [/ yint nextp;3 C* z4 W/ d' Q9 k
}link[M+1];5 o# M+ `# U+ q
. B* m/ `, ]& M3 x3 |void main()6 y" O. f! y; }7 _0 B8 o) R, g
{int i,count,h;
: N; D$ v) m! F/ R3 t$ ffor(i=1;i<=M;i++)
( \! w& T. T, r- h+ }{ if(i==M)1 r; g! o( C/ s" V9 w
link[i].nextp=1;
( i6 Q* g8 H* I, E' K9 E/ _& C else
1 L+ h" O0 ~8 z R* k link[i].nextp=i+1;# a9 Q4 |3 V; b, ]* M3 U% C' e& q- V
link[i].number=i;
8 g6 `" @( \. G}7 d) T# K) d3 o
printf("\n");8 P/ p! g2 B0 x
count=0;
8 G/ a S( h: C7 l6 d3 w& [* ]h=M;
+ h+ T6 L% m) m, a; {/ a% aprintf("依次退出的猴子: \n");
0 B, k/ C) r. `8 Lwhile(count<M-1)! b) V( z. ~; h* v3 \2 {
{i=0;
# s7 J" l0 G; ]! E; ]1 Ywhile(i!=3)5 x8 Z3 C) ~# U! d, T
{ h=link[h].nextp;, f0 Q4 N+ s8 B2 |! o
if(link[h].number)
- i# N3 W2 |/ M$ x5 A( J D2 o i++;}
! R5 k; @ Q3 Y$ @: h/ C
u8 f. r. L0 X+ n6 C$ }printf("%4d",link[h].number);
' t$ e. Z0 `3 D2 O8 \2 Ylink[h].number=0;4 M3 Y0 u, P- x
count++;* Q- b2 @6 ?5 J2 W6 h' ]( i9 G
}
; F( U/ |7 c# X- _) S# k/ ]% F! ]/ J0 f( ^8 L
printf("\n大王是:");
+ A8 U5 f0 ]$ d) S |8 p for(i=1;i<=M;i++)
5 o/ B" W. \3 r# _) i if(link[i].number)
* M W7 x$ t1 ~% Z4 {' z% h printf("%3d\n",link[i].number);* g) T* W% i$ l: v. o5 E9 \
9 X& L$ E( ^8 K C1 v3 J+ B) f# C/ f7 E6 J
}
7 z, ^3 Y/ }8 G* }第三种是普通方法for循环9 a% K+ |, N9 O# u m
#include<stdio.h>" U0 }; o! o( l3 S u' X
void main()
0 Q: N: @8 f1 C9 ^{ int i,k,m,n,num[50],q,*p;, D5 x7 n3 Y* H4 y. U7 x$ ~
clrscr();
9 J" o% o9 }- R: b5 v6 g printf("input number of person: n=");; f* ~2 h0 _5 i _
scanf("%d",&n);
, H& i: k7 w9 d! r5 t1 ~6 a* K- nprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只- }# O# `* E' d, b+ p; s
scanf("%d",&q);
0 @, K/ n# \& k$ b3 w$ a p=num;2 L# [# Z3 p9 _9 }/ a4 K$ `8 q/ S- G
for(i=0;i<n;i++)5 {0 Z5 a: [0 y
*(p+i)=i+1;
. e0 q5 w3 {0 Z& J3 E3 |& ]1 G i=0;
@+ {- n5 i1 c6 a; p2 N k=0;
* c% {- J: E0 q8 _ m=0;3 c- ^# h3 ^+ S% ^8 R' Y3 d1 t
while(m<n-1)# v8 i ?- V( k
{if(*(p+i)!=0) k++;1 v( E2 X$ C' L. x7 L- S
if(k==q)
9 P6 f/ n7 z& W2 {* f+ ^: `; J { *(p+i)=0;6 u. f/ p: }6 ^# r, e
k=0;
" p- Z) {& P( W- p) M1 K( J m++;4 `$ ^/ y: c& b
}
. m5 z! {! m+ [ i++;
" E; j0 \8 I4 U* n0 I1 v if(i==n)i=0;) f) u8 ?+ q ?) a( l' K- G
}
: b, b$ D2 [# r S4 n while(*p==0)p++;
0 x& P+ y2 H8 ]6 f printf("The last one is NO:%d\n",*p);
5 B2 L6 U: Q; m) p9 [' z% D* T: ]- l getch();1 P5 z, s% w' _0 L+ h
4 A1 [& X% `! p
} |
|