|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
. Y! f; n, d4 B3 K这几天我在忙着编一个问题,我用了一种方法编出来!" {2 J8 [+ k+ _7 c: J5 D) S4 f
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
+ Q; O5 w/ c8 e6 H" s; e注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 . J" y9 Z# }! X3 n; v& ]
+ L+ a* _- e2 f: z. {3 q
: e/ u: b( N* \( Z0 F 题目
) X5 h, L% N l( f山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
1 M( `, x5 ~2 \$ y" C+ m第一种方法:利用循环链表3 u2 e) c$ _% U; ?3 e% T! m. `0 [* r
#include<stdio.h>
7 h* Z2 R- {& E#include<malloc.h>
! }" y6 D. C. P* ?* N% }8 i+ o#define M 8 //共有8只猴子
! e/ {4 _) w* }9 X4 }4 y# Y' S. N* @#define N 3 //数到3只时退出第三只 O F1 A3 J/ J, T& I6 @
typedef struct monkey
$ A x) B) D/ ]{int number;# t0 R1 N* F+ ~# u, O4 B
int flag;- V7 O" J5 R/ L2 K* Y
struct monkey* next;
7 B ? E) i+ d5 }}MONKEY;3 X( x6 o! {5 j+ D h" I8 z
main()
7 ~7 ^! l/ X) ?$ h4 Q{ MONKEY *head=NULL,*p,*s;- m. |5 z" K; X+ D- T$ i* l, l- Q
int i,sum=0,count=0;# H1 F1 y6 R! n8 l7 M0 M3 x
clrscr(); //清屏5 M0 B& K i( e5 l
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
0 X3 s6 B+ ^! _' X: W `1 l$ S1 Y p->number=1;p->flag=1;
8 O7 l1 f6 d" U7 g9 N: p7 H: h p->next=head;
: U; q) u* W( ~ b) b' G3 [6 g* [ head=p;
% _, i1 a( o6 q( E for(i=2;i<=M;i++)$ k" V+ T2 ~( ?% V# a8 y4 J
{ s=(MONKEY *)malloc(sizeof(MONKEY));
9 D9 k( W2 K- I1 U7 W7 p2 v s->number=i;s->flag=1;
; |3 `# b, W! ]* \ f H s->next=head;0 a. g& c2 ~' i& m
p->next=s;p=p->next;# K4 g$ G* Q/ D& z; W {/ L
}
( d) ?2 ?2 s" g# b8 l p=head;+ k# w. ^7 r* M& b2 X& `) D
for(;;)( J, N3 F) e+ a" Q6 ?
{if(p->flag==1)' _( }3 X, ~" e
count++;) v6 [1 ^: m' d e6 D# X r' t- F
if(count==N)
T+ Q0 u! h7 I9 I {p->flag=0;
( ~: X( L. B% K, s count=0;3 w! Q3 z& I+ {2 e
sum++;}1 _0 r& u0 |1 M9 d0 N
if(sum==M-1)2 c# k4 s2 G" k0 z6 @, m' {* }/ u
break;
9 U1 }2 m/ v! M p=p->next;# d: C4 K' V0 ?* F5 H
}
: d# }1 A* \- F6 @& S3 ]* {% C6 o p=$ n. [# ~0 I9 ^- P
head;
- ~4 M2 {5 P9 I for(i=1;i<=M;i++)6 [+ |7 E7 s1 C+ p% h
{ if(p->flag==1)
+ ^$ o, M4 C% z printf("\t%d",p->number);5 A, e [7 h ^1 C* W( P
p=p->next;( _; L- w) H. W* `0 T
}
# |+ G3 f: e+ \& d# l, l* Q6 d/ J6 z7 B
. q( O% A9 a- c( x5 h% e. ~- \( b# [1 U @; F
} % o' p ?' h5 ]! h0 k
第二种方法:数组
+ U9 |$ H1 b, {4 X! Q#include<stdio.h>
8 k4 ?& N& T7 N#define M 88 z6 U h% P# ]% j6 _; A
struct monkey
% I3 k3 O" ^ [* H* d+ c; H{int number;4 v$ [3 I/ X* h6 ^) J
int nextp;
5 {& e5 ~0 d, c B9 [+ z" l9 U}link[M+1];2 ?. m& E' e6 p( Z) V: C
% f$ I/ `3 q u8 o( W2 _void main()$ I0 O) a3 R' e- P4 l0 B ^4 S
{int i,count,h;
) p: h- M; ?& l u1 R& jfor(i=1;i<=M;i++)+ H6 F$ j3 t% v3 w, z' Q; x% g
{ if(i==M)9 T2 S' s4 u" k) W o
link[i].nextp=1;. c* D" m9 g l4 [" L5 ?6 b
else) Z6 p' `9 v2 W. Z6 j. A, C
link[i].nextp=i+1;
$ x- m J' d8 _7 O! O0 F3 N9 D% j) t link[i].number=i;3 z8 D) C; O4 b$ U7 P N$ I
}
* C0 R. N3 A7 T6 `printf("\n");4 T; p9 G1 R3 k. t
count=0;
- p3 Z: Z% r! y! U1 n8 eh=M;- N" t$ c+ d6 C, _; O8 ]+ _
printf("依次退出的猴子: \n");7 I7 J b y$ d- k
while(count<M-1)+ Q$ \- _; I4 {7 L2 N# P
{i=0;+ [6 t# |1 G1 h" \" a
while(i!=3)
! J# {( `- s* k8 m' Y) \7 a$ {3 ]{ h=link[h].nextp;' n) Y0 B6 R. [+ x; b# q" }( }
if(link[h].number)
$ t- h. S& D/ H$ K; @4 y i++;}
1 F* k' ?- @/ p& l2 B2 \! D! ]
; |% k" _3 Q. Q9 Dprintf("%4d",link[h].number); k, V( C M- }
link[h].number=0;" m# V9 Z3 ]5 {3 B
count++;
: ]4 n/ h- u; @) w( |4 L}
0 \# J( l$ t, z; ~9 C; A5 V
) _, c% t7 k+ O, ^4 D9 qprintf("\n大王是:");
% E2 r6 o; b3 u% E3 w+ Y% h% H* W5 Y for(i=1;i<=M;i++)( I0 M& K, U) l0 Q$ q" T
if(link[i].number)/ E! e3 ?- f: j5 _' M+ Z
printf("%3d\n",link[i].number);
. W+ V( _% l7 c h" U, {. w( a, W U: C4 x3 o: w
! g) s _2 P% M4 f} & P0 P7 U" b" c- j7 W4 J8 |
第三种是普通方法for循环: H7 R. L) h# A/ h+ \' S7 U
#include<stdio.h>: u" q( M- j! h& i
void main()
7 a5 m( {6 X9 u+ m2 D# T{ int i,k,m,n,num[50],q,*p;# Z! |) {3 Q7 ~2 l+ x. v
clrscr();
/ n G3 q7 _5 @ k' ~: A, t printf("input number of person: n=");
" v% V& J7 o, B* x scanf("%d",&n);
U% D% ?, i8 d3 }9 ^' i5 Mprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只* H# d+ T! r Q# T) ^( b
scanf("%d",&q);6 F# ` B5 c' }- u+ p' e
p=num;
, J' ?' U/ Z3 m+ v, k0 A for(i=0;i<n;i++)
0 k$ r+ Y% j i *(p+i)=i+1;
+ |* u/ P0 {( \ i=0;- r) a: m' s! {7 y
k=0;" O% b" h1 s3 J5 \) ^
m=0;1 C/ r1 S. e. B6 l: Y
while(m<n-1)
7 y- c8 X( _: B, n3 [$ e {if(*(p+i)!=0) k++;
8 x: [) h' b1 r; j: a# z if(k==q)
# _! X: h# S/ T) ] { *(p+i)=0;' e( D% t) O' V! K: D
k=0;
1 e8 X' l4 Y3 m) Y m++;* q1 Q0 l8 c) u" o- j4 w5 w
}# k: H1 s$ @8 u- m
i++;& ^9 j( o# F4 Y3 }0 _. k
if(i==n)i=0;' J3 d+ h. V3 ?$ x: y$ `6 l- p( U* \
}
% B5 P1 h8 [8 x7 B" c. C; | while(*p==0)p++;8 z" N& B8 i' I* B
printf("The last one is NO:%d\n",*p);7 k1 ^8 l2 f% x$ Z0 o
getch();$ o [* R- [5 ] A! \( E" V# y
) Y$ |7 }9 J* m( g% K' c4 D+ \/ n2 _
} |
|