|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!- M% m |8 N# l
这几天我在忙着编一个问题,我用了一种方法编出来!
/ v! h' @5 r; b9 x但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
" w& y! H+ Z2 o注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
! t3 ]+ t& ^7 O; t- |( |5 S% H
' B- G& p8 D# @0 Y5 X3 S6 f, p+ }$ H) \ R( {$ M* j
题目
+ [! L( s" |& w4 M4 H山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。9 ^( n2 e; T/ a! V
第一种方法:利用循环链表
$ \4 W7 @4 w0 G9 G& ^% ^+ l#include<stdio.h>
/ p# Z6 f7 `3 m8 m#include<malloc.h>% L7 r% p$ D+ w, x
#define M 8 //共有8只猴子; R0 B, d+ \: h
#define N 3 //数到3只时退出第三只
& P+ V- c E/ w/ p% k6 jtypedef struct monkey( l! d1 O: v5 z b" [
{int number;* ?1 | `: F8 s: _3 l! j7 \& Y7 A
int flag;" v5 Y3 I( @0 K1 o2 V* ^
struct monkey* next;" [- T; N! o, b: h1 f
}MONKEY;
5 v' ~1 F, O4 A6 T4 D+ o9 e9 E, qmain()
2 I0 Y, I% {4 L q0 ?1 f' m{ MONKEY *head=NULL,*p,*s;/ S' I' X( Q* X' ] U( H( c; U6 F
int i,sum=0,count=0;7 A: I! ~0 k" i
clrscr(); //清屏, B+ @5 p: A3 ^2 l; ^6 q* d: ]4 _
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存- y! A9 m9 g5 v
p->number=1;p->flag=1;
1 r; R; B/ \6 N1 C+ F4 L p->next=head;
! N8 ?: g$ f* o5 O6 s5 A; ? head=p;; x) Y& B8 I3 ^/ u5 y' |7 T+ L
for(i=2;i<=M;i++)) X$ V8 E3 b; M0 R' L
{ s=(MONKEY *)malloc(sizeof(MONKEY));
8 e/ M) a, y0 e/ p& y$ N( D s->number=i;s->flag=1;
D X9 ]* e" w5 d: ~# n9 | s->next=head;0 i |5 c6 t+ C& n, h$ }9 H
p->next=s;p=p->next;' q3 e6 K* A2 h' l$ j
}; R' s1 Q: v0 k) O, w% ?' G
p=head;- ^5 \$ m4 u: J+ i. z! q: a
for(;;)( B3 {) Q8 R8 V/ x
{if(p->flag==1)% c# `1 J& k( G% l
count++;
; [* ~, w h# C+ }5 F* Y- S2 ?5 ? if(count==N)" p& F- u* I) S, y. O7 m' x9 f4 R
{p->flag=0;) I$ M6 S* J. [6 ?: a0 o
count=0;3 G. z0 R# k) \% E( L. ^' [
sum++;}
c8 ?1 K. \) X( |- a if(sum==M-1)! S/ R/ U- J' D/ o; _: y% a
break;
8 t# Y. _7 J; ^1 ?6 X7 X p=p->next;
+ X! v% h' ^( |% u' v }0 I8 s' R) y0 v0 D7 q
p=
! ^7 `* x& J0 q" h$ C- T; H4 Y head;
& {0 E6 G1 E0 z4 e# t for(i=1;i<=M;i++)
/ b$ U b9 {5 k( s' | { if(p->flag==1)
& r( W- Y) D1 q9 j2 s( h+ v# w printf("\t%d",p->number);
2 F6 J/ U- F6 Q- P+ T7 @3 s! Z p=p->next;, b: c+ H" n" {+ c0 g/ f
}* l7 |* R1 v1 U0 |8 J3 \
2 R7 v6 l+ R/ F9 M/ L- ?" U
8 V: v9 a _/ \" f! Y' t5 S/ ^& y6 B9 d% x7 K6 S6 D3 z5 p
} 9 U: i: g7 c7 S$ j
第二种方法:数组
3 m, x1 r# F8 z3 F#include<stdio.h>8 }$ j& Q/ l9 E
#define M 8- F# [. ~) M: N
struct monkey
) K+ g S' r. A* J! X6 p T{int number;
0 r3 m1 J* X. Pint nextp;
& F9 k& w4 c# O- }}link[M+1];
, c( E: |0 C s* N& D- S) C
]: t- Q0 v+ L. ~% hvoid main()
8 l8 i# b0 e" V{int i,count,h;
: g9 D" y* r n: R) qfor(i=1;i<=M;i++)/ l' O* x! f) Z7 N- V
{ if(i==M)
G5 d% W& B- z7 s5 p0 z0 G6 a link[i].nextp=1;
% w& i$ }( U' k% _ else: d1 Q$ @) A4 N# t+ R
link[i].nextp=i+1;1 P# ], u; J$ i; t8 l
link[i].number=i;
- m' w. }. _0 T. b) ~- S p}' m$ ~; x* C' ?% t
printf("\n");
, z/ R/ P. p, Z$ g3 F( Icount=0;3 ^3 p7 c. d: Q7 H
h=M;
2 R/ _. K6 J2 G" oprintf("依次退出的猴子: \n");
1 }5 S0 b( Y3 D% m1 D3 U/ Uwhile(count<M-1)
: n* _4 z/ l% H6 W" c/ I{i=0;/ N! H$ |! W p; G9 p
while(i!=3)" B6 B* Q: z6 J+ ~, Y" N5 P
{ h=link[h].nextp;/ h4 |7 K A! k- n1 C4 Y' h6 B
if(link[h].number)
R9 K2 A/ n2 q; O$ j i++;}6 `4 Z0 U. k0 V
, t5 i1 y5 i) B# B, Y
printf("%4d",link[h].number);* g' B& H- \8 b# a, @/ y
link[h].number=0;/ A1 w0 R. `) x& p" l# w
count++;7 L1 d! a( m8 d" R; s
}) N7 m; i; Z3 I+ D7 l; z; f8 G$ z& w8 M
. r; a7 x! Z; j+ N$ A2 n i9 ~+ X
printf("\n大王是:");1 w( Q& G$ ^# j% @$ O7 X
for(i=1;i<=M;i++)
+ m: G7 m% v- C$ D$ g5 }; Q9 d+ d9 v if(link[i].number)
1 O" C: s) y1 a* Z* ^ printf("%3d\n",link[i].number);9 B8 l. }7 ^( s: ~& J5 f$ U
$ N+ D$ W) f2 k* M$ C5 B) P+ j* K
} " _# E, g( m/ @) h4 ?1 o$ }
第三种是普通方法for循环! w, M5 W/ e+ S, T6 n1 V5 y2 a. U
#include<stdio.h>
6 Y3 `$ o. n" T! Y4 D% bvoid main()
# u/ K r- Q& o- `, N, u; |1 u{ int i,k,m,n,num[50],q,*p;
3 m$ Z$ j& {& S! o" Y- t) } clrscr();& p7 F4 f! v( I- i
printf("input number of person: n=");
8 e3 y. G. D& `) ]& c6 I: ^, L scanf("%d",&n);
' i3 C; f. G0 Y, X$ \+ O% M, |printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只3 ~1 C+ Q- r/ k, Y5 m
scanf("%d",&q);
) i0 D9 ^* J$ ^5 E. u p=num;6 S& g$ y% L( @) [8 Q
for(i=0;i<n;i++)) o$ {4 W+ s* Z5 z9 `$ d/ R/ _
*(p+i)=i+1;# K& e, N5 R$ I0 S3 p
i=0;
6 Y+ F8 V; H# Z5 g9 q2 y, ^0 N1 | k=0;5 a3 a% Z: m: S5 l9 D/ p
m=0;) p0 g0 I% ^" J) h8 L, Q% E: @
while(m<n-1)
. Y! i. g7 i# v L" I- n q {if(*(p+i)!=0) k++;
( V$ \! J$ B5 @+ b" z: J' o2 \ if(k==q), b# l) j4 ~- ]; b) }0 r4 j
{ *(p+i)=0;
$ V9 q# ^0 k9 [! ?/ z& ?( M k=0;5 o: r, w; Z: s: x V
m++;' O/ ]' a8 q4 N
}
9 `+ F1 `$ V1 |& Z) ^! v i++;
" [) [2 v, W: b if(i==n)i=0;
1 j4 @, Y6 T2 v }4 F- m) N9 H4 k8 J$ X; w& G9 ^
while(*p==0)p++;9 h4 Q6 s2 ]% t3 `+ t
printf("The last one is NO:%d\n",*p);
2 A. B) F- {2 G7 l$ R. v$ _; J getch();7 d. @' K2 |4 t7 n6 j
" M. I% q& {* D7 z8 a
} |
|