|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!. p [4 y; u. m
这几天我在忙着编一个问题,我用了一种方法编出来!- ~. z: r6 e% K
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!5 i# d4 T% l" e. ?% l
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ( o$ h! `' E$ x; H9 z0 I
" r# v0 q& W: `$ F5 k& j
' y+ f- L1 W8 T: L$ v1 e- }
题目
# r8 c6 y, [. _$ }) m! K# r: o3 x山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。' }+ w, O9 r \ G' H1 j! S i* B4 K
第一种方法:利用循环链表+ |; {2 e3 ?( U3 M8 K. \ G
#include<stdio.h>
+ i6 ]' P$ e# p: u+ h5 {#include<malloc.h>
0 s) p5 n2 M4 w' ^#define M 8 //共有8只猴子0 a' e8 @ s" M6 k6 I
#define N 3 //数到3只时退出第三只
4 r* D& F% [/ ?typedef struct monkey- W2 {. N: L8 g4 x
{int number;1 y \1 z/ ? B+ `# ^
int flag;) t) f& _* B. A& u* |9 d
struct monkey* next;
2 I* t+ B/ G; @ X: Y}MONKEY;
' P: i$ T6 Y0 J* S; D$ emain()
' n: m" N9 l, g5 m: _{ MONKEY *head=NULL,*p,*s;
- X* p0 y% X9 u! J8 I int i,sum=0,count=0;
U) l8 H1 O# K1 _6 v! G, B4 a clrscr(); //清屏! u% _5 c9 l* `$ B4 T
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
0 X: x4 s5 _7 e/ c+ r p->number=1;p->flag=1;
& h. g4 S6 b" r" E2 b p->next=head;
5 t3 X0 d, K6 U7 N) | head=p;, U- M+ N) O L9 r) H
for(i=2;i<=M;i++)3 r& B2 l, z. \% W8 d& w3 [) r( ~
{ s=(MONKEY *)malloc(sizeof(MONKEY));# \$ l, H/ M/ ^# S+ ^' @3 M
s->number=i;s->flag=1;
7 y8 H. b3 q [: P5 i; \, D! f s->next=head;
) @5 N. g5 `% V2 R p->next=s;p=p->next;* `3 r0 m) X! ~- l( J( j
}
) S& _% r* `- W1 I- @ p=head;
3 Y8 U) G Z3 F; f8 ?+ F for(;;)
1 }6 B% s- [0 h9 f% }: P; n {if(p->flag==1)
, F/ s5 `1 j- z: w count++;6 D6 }' g& L' g8 X
if(count==N)% k) q. ~! x1 S6 r
{p->flag=0;2 v0 \5 \2 l7 J2 s
count=0;
! t- k) i4 ?5 D# I$ y sum++;}
' ^: V2 l# H* _, ~* s3 h$ ~8 r/ ` if(sum==M-1)
, H0 k; W5 |) z" J break;. Q2 k5 u. b2 L6 O7 L/ n6 m6 U
p=p->next;1 ]9 d/ c# _5 x% @) M: u$ `
}
7 `, s! T& [6 z: V p=9 P' r3 Y6 j2 R
head;
7 W4 h( B0 q5 w. W for(i=1;i<=M;i++)
. o1 i0 N( M* ?/ H) q. f { if(p->flag==1)% G9 K! R D' \ `5 M Q
printf("\t%d",p->number);
% m5 j5 m9 ~; A: i1 W) E/ b! U p=p->next;
7 Q% s* S$ M# p7 a- H$ [9 [# } }
6 `& X6 P2 d8 b1 C
* v0 f: x$ M5 j* S
" a' A4 [8 G1 ?8 C! H3 @9 T+ V. i! M" v% S; `, {" ?1 f9 H* L
}
% B9 k$ _! Q. m. u' G1 @第二种方法:数组
* m" [* p% s" [4 d9 \#include<stdio.h>& \4 {4 u9 t' G% {0 q! k
#define M 8( f6 N% J4 p! ]4 e3 L3 G1 c
struct monkey1 M7 I+ z+ }: D
{int number;; t; U0 m. }! R6 {" b; ^% q
int nextp;
1 B. O- F1 X5 m/ b2 C}link[M+1];7 A, h: Z* C1 i
. D8 S7 T5 g/ r8 e: f- @void main()
) ]; E1 s/ G6 `# ]{int i,count,h;, ]9 v# F2 F5 U8 W6 E
for(i=1;i<=M;i++)
8 [2 a* s7 ~' C" S$ }2 D{ if(i==M)' L) a$ w: W6 x8 G; g- q* S- B
link[i].nextp=1;) ]! x- E; V1 U s. _
else# G. N/ a8 |/ c0 W3 F
link[i].nextp=i+1;
a$ |2 f& J0 o2 r link[i].number=i;
$ f4 O0 ]; g) x$ t% A}
0 `8 z7 I/ s" Nprintf("\n");" }9 u9 D* J8 f7 \( m0 E
count=0;6 [/ ~: U: Y1 N" A
h=M;
" p6 E( Z2 r0 [# fprintf("依次退出的猴子: \n");
) y! O( z& ]4 H( b( Z- [; k0 b8 Jwhile(count<M-1)
$ |1 ^# p5 q$ u# n9 L{i=0;9 Z& e( C q5 }: D7 v
while(i!=3)" I9 R8 o$ `" {# [ F. }( U
{ h=link[h].nextp;
3 z3 ?, f7 B1 u; ^6 X if(link[h].number)
' T3 J, K) s+ j! v/ [% v i++;}0 Q) K- g7 p( ^; t! A0 f( E' @# c
/ \/ d* N) x" _7 s' a6 sprintf("%4d",link[h].number);
% ~4 k" \2 f3 ^! U6 h8 f5 Q0 v, Plink[h].number=0;
" n- Z1 o2 B; ]. U1 V% c! |count++;0 g2 i7 C4 {3 @5 S5 C. H
}, I ~: y- V! w; Z s- X/ m2 v
& W* y) u4 B5 `printf("\n大王是:");
. s( ~( J$ J v- { for(i=1;i<=M;i++)
1 f. D. I/ ^/ ^7 p8 S' p if(link[i].number)7 Q! o& a" l" @' A6 ~- d, r$ H
printf("%3d\n",link[i].number);
2 C3 v: a, |% b$ `6 ~2 d' {" `5 }/ q/ E( c& U; q5 c
9 ]& c7 j5 Z n
} & t+ r. }1 o0 L$ a8 j# A- r
第三种是普通方法for循环$ |; j$ c& E" x! ]6 q; C
#include<stdio.h>
! O" I. X6 i4 a- `void main(), F) ~9 m+ [9 ~* ` t8 B
{ int i,k,m,n,num[50],q,*p;
6 H9 y0 p' G+ a( v0 C' \ clrscr();! Z9 i2 e" W. G
printf("input number of person: n=");0 g% S) _# ~% y, W4 u) n
scanf("%d",&n);9 a! U' Y9 p' x" p! j& h; t
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只4 b! n {: w$ m) ~3 t
scanf("%d",&q);3 _4 {) o5 L# f" }$ n* Y2 X
p=num;6 v4 o- B. f) d* u. C
for(i=0;i<n;i++)
8 e. R% z( U- v1 M& r *(p+i)=i+1;$ X9 B/ O; R) b' s" w0 r
i=0;
0 O. _; R2 E/ I9 h! b& l' s& D k=0;& K( d# z. Y( n k$ a( S( P8 ?
m=0;
M7 f& O6 R; t) v: n3 b1 \$ t while(m<n-1)9 ~6 i9 z/ B" a) Z6 E
{if(*(p+i)!=0) k++;% n3 m& h2 A% {$ `5 e% o4 P C
if(k==q)2 y& m0 X# D( n: R- _0 `2 z
{ *(p+i)=0;/ X9 x+ ^) z( j8 W- p
k=0;- z6 _/ E5 }: n% O- [, R0 m' D
m++;$ j" e, D2 j" H
}
! y3 U3 D3 j7 F$ {8 B' C i++;# u8 W4 X/ l- v$ z, l
if(i==n)i=0;
7 z5 b) P/ T/ B0 c }
5 p+ C' w0 j7 U) [ while(*p==0)p++;* y! Q4 K) n6 s, w8 P; U' {
printf("The last one is NO:%d\n",*p);
& ?1 f; g B2 X7 Q) |/ S getch();3 L7 h. n/ x7 F" k) F( d- ]
/ X B8 y! e* f2 x7 d} |
|