|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!) c. _% u% l; j& Z) N" W# ^
这几天我在忙着编一个问题,我用了一种方法编出来!( Z& r4 \$ d# q- Z1 [. [
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
9 u! r$ g7 H& v: B2 ]% F$ |注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
- L$ M7 Q) F' [; z
9 E( h+ B2 s! [" N# }4 U8 _/ Z$ G/ h
题目- {3 F3 v. B4 D# n2 @* b3 h
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
& L+ C' J4 e+ Z( O- L, i1 h/ e第一种方法:利用循环链表
: R; X5 H3 ?+ ?#include<stdio.h>
2 W8 \5 P+ a0 T7 p& y9 \#include<malloc.h>! \/ F( t9 Y. ^; _8 @8 j, V* A- H
#define M 8 //共有8只猴子
' p1 T& v. ~' m: u6 ]#define N 3 //数到3只时退出第三只0 w$ G4 R! C t' I0 p! @
typedef struct monkey
B9 s$ S/ n) _+ g{int number;% |. c4 t' ^2 r1 I$ u0 d; y
int flag;
3 P% R. ^! W9 o; {1 o2 {struct monkey* next;4 [* [" M) w' D9 Z6 D! o& y9 n
}MONKEY;3 u2 F/ a2 O7 w9 g2 a
main()
' C( v E/ R6 Z0 f{ MONKEY *head=NULL,*p,*s;8 D8 ?2 r% u5 n- a; x
int i,sum=0,count=0;" b2 ~# i/ T$ B9 M: ~: J
clrscr(); //清屏
1 L: A# h; h, Q& E2 ] p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存! Q0 ^; r0 f! |7 q
p->number=1;p->flag=1;. |# f$ s% _" j: u
p->next=head;
; ]% l3 \5 U3 o2 y7 q2 `8 A head=p;
( c9 u5 t+ C& Z# _5 P9 a for(i=2;i<=M;i++)
+ h; E+ K5 v6 ^1 v { s=(MONKEY *)malloc(sizeof(MONKEY));0 n) i- I' I9 V' a8 y
s->number=i;s->flag=1;
( d$ r. O9 {- n s->next=head;( C7 {' h9 p/ t: o+ {) f& o8 w9 l3 J
p->next=s;p=p->next;! W5 E) k! b* O; R
}6 ^% Y5 R# U* _) {1 q% w
p=head;
! ^+ g% ^6 R: I/ J( H" z$ ~6 A: W for(;;)
" L( S6 H" p% y {if(p->flag==1)' e& c' X! y: w3 m% x% Q
count++;, H( r( \) X8 C6 t5 {" r" \
if(count==N)
# g1 F, L; ^/ p; P {p->flag=0;" Q2 g* I& D" c- D5 N/ ?6 O
count=0;3 q4 Y3 f- G2 C9 ^$ H
sum++;}
( B6 s8 @6 k0 t+ i- x9 K# F% s0 |) | if(sum==M-1)0 a3 r/ Y2 a' F
break;
: J+ y& x2 H/ S) Z2 c4 w p=p->next;8 |3 f% r, r2 z' [1 K# f
}! T" V$ E D0 \" M& |
p=2 f3 v: M4 o9 w6 Z' P
head;
0 S* h6 q$ w8 T% t9 Y! } for(i=1;i<=M;i++)
/ C9 g6 l3 s; t8 R! [ { if(p->flag==1) [! p( Q. s4 Q5 Y* F% K9 J
printf("\t%d",p->number);
/ w# f( k8 {% u5 K) _ p=p->next;" w2 r! _7 T. T }3 f, N
}1 h4 y6 r* Q6 ? e; B
" _ m) Q; [, c, }% I2 M- f
: E8 ]/ d4 M) \+ i7 S! F S; q$ O; W; W& G4 S: _
} 3 }' C9 X6 m+ V( S
第二种方法:数组
2 K$ ]: c; S6 ?) V2 W/ [#include<stdio.h>
m! O9 Z+ w, O) w$ I" y1 Y#define M 8& i2 U {' e- a5 L1 V. u0 b
struct monkey
" e9 S8 X1 `& k( |$ q% q7 Q{int number;7 U$ @* n" i' v3 r
int nextp; ]0 _& E" @, I/ k
}link[M+1];, A' C- m' J- l2 v0 n. J
% B7 E x9 N# p- k. J9 g: p
void main()$ @1 k3 N; d' j5 `. R; x
{int i,count,h;
3 m, Y" @* p) H2 g, }! Ofor(i=1;i<=M;i++)
: Z3 G+ V$ r& C3 x5 _. z{ if(i==M)( a2 M" @2 p' H' g0 p7 V
link[i].nextp=1;
* ?, B7 K7 i4 p- ]. w" L else
" ]( h* O [* }$ n. B3 r o link[i].nextp=i+1;0 i& ~& n! J# K" z/ s) z0 _- @$ F
link[i].number=i;
- k8 m1 n/ o6 O9 q! J' R6 b}
. a A* O; V. uprintf("\n");6 G% |* r3 c7 T
count=0;
7 T+ r: i z: P1 S- [- Xh=M;6 U8 G. o7 h& `, `- ?
printf("依次退出的猴子: \n");
m2 K# L5 R* M* Nwhile(count<M-1)
) O, K$ M/ m! P9 y{i=0;! e$ I& p$ G' H7 Z1 a( f! |; n
while(i!=3)2 n8 D" D" j7 x5 J( w6 x
{ h=link[h].nextp;1 K0 c8 W4 n6 _1 M2 S- n& a2 U, P
if(link[h].number)
K* Q) t2 ]6 T i++;}/ _1 O' m x O( k2 Y5 c$ T
* ?2 `8 Q& P4 p4 n3 s1 x7 ~
printf("%4d",link[h].number);
+ \! N" Z* ]+ Z0 M1 G }link[h].number=0;
0 B1 a; Q" \2 A& j1 Fcount++;7 N4 ^. P L ?/ H; i5 [ J
}$ x8 h2 v- p9 M- G
* ]0 l# M3 r) q2 zprintf("\n大王是:");7 k; ^$ J2 I7 u
for(i=1;i<=M;i++)- J! a( B9 C7 V
if(link[i].number)
8 }$ {8 ^& j1 @! C6 s printf("%3d\n",link[i].number);: K7 m1 q: B1 @1 [% W2 V2 F
6 o3 X: I5 Q2 M# p+ b( R1 e
; \9 O( j5 C! ], c: o2 [} . O5 E2 R7 t+ X) b/ W6 f' C
第三种是普通方法for循环
3 A" T$ Q; g2 \! {, {2 h# S0 c4 a#include<stdio.h>
( e$ T- X& e- S, Z9 K# ~8 I1 Rvoid main()
, Z3 l( |- ]! x! D/ w" p& z4 g{ int i,k,m,n,num[50],q,*p;
8 s- u3 Z. o+ T8 @% i' n& X clrscr();6 B q: _2 U" U" \5 _
printf("input number of person: n=");( a% ]) c3 P2 a9 n1 r9 E
scanf("%d",&n);
& q/ w* `# L& H2 xprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
+ D2 `8 E( r/ y# V* g1 s scanf("%d",&q);
/ H3 Y4 F) A+ f$ ]! _" H# ] p=num;
8 X6 [7 x: B1 M1 ` for(i=0;i<n;i++)% _/ \( o [* t8 G* G7 B
*(p+i)=i+1; N7 r# F# J# q3 l$ q2 R" I" h
i=0;( A k3 Y' Z$ k+ {1 A3 [3 G
k=0;
6 G" u5 ]3 D$ O1 k8 ?! U m=0;
% F- Y: x. W% W z' [ while(m<n-1)6 Y( O" M; z) W# |4 C) l, @2 h
{if(*(p+i)!=0) k++;
6 R. r0 L9 ~, k' G1 F7 f+ u if(k==q)
1 H& E6 P; v( w: V& e2 _ { *(p+i)=0;
# |0 u1 x2 W" f5 Z. A5 S% E k=0;: K7 P% A! C) d$ r4 |# e5 {. C
m++;
g( Z1 f/ ^3 a9 F% _+ ^2 i }
. d% F! M+ ]% h( C3 \0 s i++;
5 H$ n. n0 D6 ^, J if(i==n)i=0;
7 \# G4 Q9 v1 Y2 ]% C) T }, I5 }- b1 r. D5 X# [: O
while(*p==0)p++;
# t/ f& r, ^6 E$ F# F2 g, y printf("The last one is NO:%d\n",*p);; E' }) d1 Z" g9 ]
getch();& t- y$ T! l; I; s: ]& ^* z
( J' i# E3 m6 E/ S6 p} |
|