|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!8 R: E. b3 Z9 v0 s. t
这几天我在忙着编一个问题,我用了一种方法编出来!" t9 {9 ]2 l0 o1 m" I; W/ g
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
, x! _7 u* h# W$ o+ b' b注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
* Z* H% n" @2 a/ G) Q
$ a8 w2 d" X# a( @7 E" A1 M3 ~
% i: f+ H' j# u1 b 题目
0 q; J9 D. P: d山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
! k' q: h0 d, A0 U第一种方法:利用循环链表
: s; k- [! y! z, C' {8 Z! t- q/ F#include<stdio.h>
' f7 y( L7 G, L" O: I#include<malloc.h>
( y- K7 X/ h; q. M, W#define M 8 //共有8只猴子- i/ Y: m3 f- n4 ?! U
#define N 3 //数到3只时退出第三只4 P# _( s a5 e; T2 |5 @
typedef struct monkey
* \9 C4 z; }, R0 h. L7 G{int number;! _) v- r9 B/ T, k+ }- @
int flag;, Q4 R3 U" u8 h& k1 t2 R4 S6 ~$ y; b
struct monkey* next;
& C! G, L" c4 R2 z3 o}MONKEY;/ O) L, b+ x' V' H* V) E
main()3 h" x0 l( U8 H% z
{ MONKEY *head=NULL,*p,*s;5 }% D: Y3 H3 Y0 j+ G2 s8 W( S
int i,sum=0,count=0;
! B) _3 P' G1 m$ F; w. L clrscr(); //清屏0 x4 H6 Z% Z! J: H. U7 V: B* W: }- t
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
6 G8 J6 o) V4 t9 Q; |$ y! n5 H p->number=1;p->flag=1;
* m* K+ n; j( k p->next=head;8 q a$ W6 x1 u0 f2 E
head=p;
1 n8 Q& ~8 Y7 k) h! q1 M for(i=2;i<=M;i++)
2 s3 [% Y) W) f& }% R; H, O/ k { s=(MONKEY *)malloc(sizeof(MONKEY));
, A H, F* E! w$ u s->number=i;s->flag=1;, ?( V! f) c7 D4 A( g9 D$ a. J% D
s->next=head;
7 E: b' B/ h6 p2 M p->next=s;p=p->next;
) c1 R2 m w' ^5 L" K# A; c }
0 d8 f/ i2 |' ?. ? p=head;1 f* U/ {6 f5 f) w( n: Y9 j& x* J
for(;;)
5 v' x. b* Y7 @' n {if(p->flag==1)+ A: c" j, o2 X' n4 P
count++;
$ D) B5 S+ ?$ @+ Q& T if(count==N)0 I! z: r1 t4 K7 P* w* p- H
{p->flag=0;3 {9 m& n: ^) e$ R, c- P
count=0;. u3 i4 x- R' n" I) l
sum++;}+ } q6 U% j! s
if(sum==M-1)3 R) _6 g) u( H2 Z% ^" R
break;
5 A8 |2 Q- n, G- S" C" t' d p=p->next;4 b/ N1 E9 W( m. }% q/ S8 s
} {0 {& |! C( L
p=
' Q& A3 s5 { y head;
7 Q8 d! Q: [% R7 Y3 F' Y: e; G6 E! v for(i=1;i<=M;i++)
8 C5 ~: R5 v6 Z" U { if(p->flag==1)
% e, `1 U6 p Y' s' \8 f printf("\t%d",p->number);
- j0 ^2 O9 S! {/ G7 r' u p=p->next; I! @1 x4 Z X, C2 _- z
}
) `- n; n i4 V6 M2 [5 j5 s% K( [; U0 a
f; e7 _) x1 b/ y: X0 h0 ^0 W1 p! W: {! Z, ]
} I5 Z) g& R( U7 P- r" j
第二种方法:数组: b/ c1 I; i- s4 ^' E2 @, X
#include<stdio.h>. c3 O# Z; C3 L. a! }
#define M 8' ?1 f9 e5 k g1 n/ m
struct monkey5 P) X( O4 `6 l2 _
{int number;0 s" ]. u5 L o4 T
int nextp;
, J5 s& m- s! M+ M: T% b/ m}link[M+1];
" ~: I" w9 I' f8 E+ J* L7 H# m C$ v4 ~3 j( H
void main()
1 f# a7 l' O2 \' u{int i,count,h;
5 D& h# [ h) Y& z* qfor(i=1;i<=M;i++)- c7 ^8 H2 w) |
{ if(i==M)
D% V2 W7 X% R/ T3 [5 O/ A, b link[i].nextp=1;" `8 l5 s) v- A& ?7 w/ m1 D+ [
else
7 t' _8 f$ W9 u0 \+ r link[i].nextp=i+1;4 `; h4 q& U+ F# s' c0 J& W O7 @
link[i].number=i;
8 `" b$ |9 N9 C8 B0 J$ l2 Y}- ^% h0 q) x+ ^; b" a! T
printf("\n");
! G$ N, C& V' d0 {count=0;1 T5 d; N- {) {/ L
h=M;7 L" j/ Q; Z" C7 C. J4 H/ e$ {
printf("依次退出的猴子: \n");
. a: J0 U2 s1 D6 p! U8 V& rwhile(count<M-1)
$ m; P" K# R# X- s8 \; @{i=0;
j1 Y6 \; Z" ^# @- O4 _3 kwhile(i!=3)! V# t- ]5 M. Q/ C1 k4 b% G- h- Q
{ h=link[h].nextp;
" f- m+ B! J3 E8 o; L if(link[h].number)
2 I: `- f5 {: R3 n- y i++;}
9 ?/ f, i' D# P3 W
) s5 w9 o" A5 ~printf("%4d",link[h].number);" \3 I8 `. X& N8 n: f2 f* e
link[h].number=0;
* ~/ G# Z" c/ ~9 u) Q! P# Zcount++;2 R5 x, v J, Y( i' ~/ C
}" k/ t2 z, o; @/ V
+ L. g. q2 s1 i& A* C; _4 w
printf("\n大王是:");0 [' W8 ]. M- }, @0 Z5 C0 _
for(i=1;i<=M;i++)" G% h& ^) ~1 b: {
if(link[i].number)
* @3 P' Y" `! V. c0 M" f# ` printf("%3d\n",link[i].number);
" m9 I. s$ H o& N( X+ u! o5 h( c3 b( f9 J5 q- }# t: B
9 S& N: ~0 d3 r
}
3 E+ ^( |9 K" m0 _5 [第三种是普通方法for循环
( _ g# i( q2 P# @, m#include<stdio.h> R o: d: b ~2 I( E& X. v
void main()
/ P/ d, ]% a$ c% O{ int i,k,m,n,num[50],q,*p;
1 S+ I `& ~2 e% B1 G% X# l clrscr();- | [$ e1 C7 @3 r( J6 `* n: }
printf("input number of person: n=");
& F( m! Q. Y3 R, l0 ?' a/ N scanf("%d",&n);- Y* d: I2 U7 ~+ L, i1 r {4 Q
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只4 [! K# j7 ?: _0 V( n
scanf("%d",&q);
+ K, O/ e/ f; H; L5 R5 G p=num; O' N8 [8 q) y6 g: f
for(i=0;i<n;i++)6 H( S, O0 k6 G0 _" G) B" H
*(p+i)=i+1;$ [! e" Y* Q. O3 s/ a$ M
i=0;" B2 W& [9 A# f6 T* I" [
k=0;
e9 D" p, l: X, s# w5 ] m=0;( {* W( ~9 t3 U/ p4 [5 _/ t
while(m<n-1)
1 s! d8 L% y0 N3 I {if(*(p+i)!=0) k++;5 F" i2 g q/ C' l; I
if(k==q)
- t/ C/ Y) O+ w { *(p+i)=0;
* s0 ]' g H4 G9 V/ B k=0;5 \) i9 E- o! x1 H6 f- @/ r: ~
m++;
7 x+ o) o, a, U }
e: e" G0 i/ ^6 R# u5 l i++;
7 J5 S: v5 S8 c) o4 R t9 [4 @ if(i==n)i=0;5 b! Z# \2 @6 E' X! H& b$ h
}
: D; J/ B) Q: ~, s& N% S1 W while(*p==0)p++;4 x' r$ g) r" ^+ G* I1 x
printf("The last one is NO:%d\n",*p);
1 d* a3 {* W- S! ` getch();
4 T: a- v& F' R
8 J) Z& ~1 n# s- z6 V$ j$ ?} |
|