|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!1 F# A* s" f! `2 F, y' }. s
这几天我在忙着编一个问题,我用了一种方法编出来!
% `! F% u) l( c' e6 u/ Q; {9 ~但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!1 b+ y6 }5 j, \: U8 X' A" t
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
1 [8 E8 c. d+ l3 J) N/ F3 ?
7 ]! p7 v! P* o4 F4 N/ S# B
, d( o- Q7 f; m) [7 C 题目
4 V+ E O) n# p5 X山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。" P/ Q5 C, p$ p
第一种方法:利用循环链表- G; X, F2 c* f) t8 p' S9 T
#include<stdio.h>
B. w4 g) N5 ~8 z0 y6 U$ L#include<malloc.h>3 m: i# a; \+ S5 ?% N: c
#define M 8 //共有8只猴子2 h2 x& ]8 T+ _8 a' u# W
#define N 3 //数到3只时退出第三只
( m# M- m l8 u$ Z; R5 H! c4 ctypedef struct monkey% `- `0 A7 H& J# z
{int number;0 J% f% d' B5 r y/ T5 Y, a
int flag;
9 o: }6 U8 ^. X, Vstruct monkey* next;
9 I% _6 G& ?( _5 u}MONKEY;
# f. h7 T3 E- O* kmain()
5 I8 ~5 @1 V2 G# k$ \% \{ MONKEY *head=NULL,*p,*s;( D- ?8 h$ A9 N4 @
int i,sum=0,count=0;7 W3 E1 ]' C4 J9 i; O' ~5 s
clrscr(); //清屏 |) S) j7 g, Z0 |
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存' h. t# }# c- M$ J4 S
p->number=1;p->flag=1;! m8 |3 F5 W* _% P/ y
p->next=head;
: Z6 W+ a0 f5 v' R" x, A% Y2 m head=p;& a- a/ a- y1 b6 r! j% E5 L
for(i=2;i<=M;i++)
$ B' W7 g) H7 d, C/ z z. p { s=(MONKEY *)malloc(sizeof(MONKEY));
, }0 m% v- v+ I' M! @ s->number=i;s->flag=1;" d: k( n# @$ K. I% ?
s->next=head;
. h3 g4 v& t. @* D% d$ } p->next=s;p=p->next;! X8 O8 Z P" z8 p* A2 b
}
( N% ?9 {4 L' z p=head;
) s$ m" D& v3 Y* s+ f for(;;)2 k/ r2 P- N' t) v
{if(p->flag==1)
1 d; S* e9 j0 b, J count++;5 t. L- I1 U4 f# r/ V
if(count==N)
# f7 _9 g/ w7 Q$ T {p->flag=0;) M; g# p8 ~. A/ ~
count=0;
! e$ ~+ Q$ i; G; T sum++;}- [4 F& y* v& G% f
if(sum==M-1)' `$ H- M v! b9 K9 {
break;" v5 z9 d& h- c: x7 O( S" g
p=p->next;8 V* d/ `; ^6 F5 n: K
}
/ S( s/ c& k6 K% _: p9 K p=/ x7 S3 B8 S' ~6 @
head;# [# Y& D. O6 c6 u) P4 Q7 _) y
for(i=1;i<=M;i++)6 A* k1 o; `; b. a' d( \. T: R; k
{ if(p->flag==1)
3 ~( e+ u, d9 l/ U' a, ^' B printf("\t%d",p->number);
' Z- [ G* o7 I" o) i( E) Z p=p->next;
, D$ g! Y+ {0 X) J4 C }$ T, c h( A# i
$ w6 ^2 P% Q( f$ ^9 ]9 l
9 r* M3 B* z' u6 p/ T8 @# S K7 H2 S$ a' F# s4 ?
} 6 v* X' ]# q" ?+ u2 s0 U+ f
第二种方法:数组9 D% z7 E2 c) d
#include<stdio.h>
* X4 j F) y2 q# e7 _#define M 85 [ J. [7 ^; a
struct monkey
# S$ s2 K P, A8 ]{int number;
* [% W3 R3 ~2 S* |, lint nextp;
& d; G( x8 B. P. t}link[M+1];' U; M; E5 c) p' A. a! f/ I
. U$ z) d' B+ E" B+ R* z
void main()
; s. f) c& W4 i& F1 s{int i,count,h;; C9 g0 b# A8 p/ i' B5 s0 ~
for(i=1;i<=M;i++)
$ y' m4 L# j) F+ s{ if(i==M)1 _6 V* B" X0 q* a* k
link[i].nextp=1;
" `1 M, N3 M- l1 d- W# V/ ] else/ _, r5 I* I+ S" e
link[i].nextp=i+1;! c7 M9 J3 C5 [4 o3 A( N T) H5 i
link[i].number=i;
% {$ {' {5 Q" n8 Z- u/ A, t}! {; {: _1 d& b, e% k$ t/ q- t- k: M
printf("\n");4 d3 D# s) v; U+ r4 K
count=0;6 \9 @- Y6 G9 \& D) c
h=M;! W; y* P# U9 H# h$ i, y7 j* \
printf("依次退出的猴子: \n");* X+ g7 Y+ R) l8 j5 g
while(count<M-1)
- q2 o# _, m% D# J1 g! r{i=0;
9 ?0 O3 s; w' U* `! T+ qwhile(i!=3)6 j) P$ d. r# U4 h3 z
{ h=link[h].nextp;
, a: v3 `" T1 M" \" U; ?$ k4 J if(link[h].number), f5 Y8 Q3 p8 `4 C% s
i++;}4 N) q7 Y4 s0 R4 t- v; k0 i/ B
]. D: t% Z w; d g! ^( s" bprintf("%4d",link[h].number);! w5 H7 S' N3 u" r% \- |& @
link[h].number=0;/ s- Q8 Y( I+ K7 b, u' m
count++;
$ ^2 s; o$ ?7 p6 A7 x}( F$ Q( V% t q4 f/ x
' q, Y3 U* l7 M. Qprintf("\n大王是:");
1 D# e1 w4 G; C7 u4 p for(i=1;i<=M;i++)
8 m4 |$ V1 ^1 n4 m$ r8 W if(link[i].number)8 d* Y$ b* L9 g' w0 ]5 j, X# @9 ` s
printf("%3d\n",link[i].number);" n3 o( r* ~5 k2 `# T% i$ H m
, j- A% y! e. G( C0 f9 j
- c7 U6 F& u7 h2 A8 H2 K8 d S} 6 E2 \% t& H: k0 G
第三种是普通方法for循环/ N6 P, l6 U8 b) {* Q' t
#include<stdio.h>
) a3 J* ~* h+ ^2 l. `0 o7 b/ u# evoid main(). P. P* @* K1 R8 g4 K! m* W* p
{ int i,k,m,n,num[50],q,*p;
( F A( `7 w l6 @8 R clrscr();# X$ k5 g9 w ~. e. D' `
printf("input number of person: n=");1 }8 Z9 `# q6 N" t2 z3 H' ?$ c, T
scanf("%d",&n);- L" d& g/ ]: o
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只6 X' x0 H% w( E! z
scanf("%d",&q);/ D. ~. e% q( K. t
p=num;8 C1 A# N! T/ K, N
for(i=0;i<n;i++)/ D M$ K5 O- ~9 ^8 K
*(p+i)=i+1;
2 F( s# e: O8 q1 H' }9 x& b8 \ i=0;/ p) y) p2 r: S6 J. L. `
k=0; l2 d2 f" b8 f0 Q% d4 U
m=0;' e2 m7 M+ ]2 c- F0 p/ u X/ Z9 _
while(m<n-1). A% K# X. o' F3 h
{if(*(p+i)!=0) k++;
3 f8 y# S G @4 N2 S if(k==q)) l; Z; o0 H9 T; C5 x5 |" _
{ *(p+i)=0;1 _. j* X1 o4 g8 x5 H% v
k=0;# y. l4 D" j- U% j
m++;
0 G2 Z$ q4 T7 z) F }0 V, D. p Y& G- T/ ?. ~# T
i++;* Z* {& P/ S- o
if(i==n)i=0;3 J6 n" G; s Q# N8 n' K3 ~
}- @( J. V5 ^3 x( [
while(*p==0)p++;
& O* J- `* A1 ^7 s printf("The last one is NO:%d\n",*p);
! B. m; F1 B) E9 a) `. r* h getch();
) P) k! m# W5 d" R+ m* d6 @, b, k
} |
|