|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
- I Y. T& Y# }! g. ?9 n这几天我在忙着编一个问题,我用了一种方法编出来!
0 M! r1 D" c; g1 b但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
1 C0 n) z+ f9 f! ]% @/ I注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
5 ^+ L& ^5 U q4 r
+ A, I+ }# W( I7 w9 b2 U' V$ l* b9 @( {/ C0 `
题目
9 c5 u1 M) O7 S7 J# `: P2 a山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
' f* t2 L5 x0 w: E第一种方法:利用循环链表1 D& d7 ]- Y! z+ ?+ P( X, Q
#include<stdio.h>
. }; v, d* P# {& Y) [% T#include<malloc.h>
/ j' s4 k2 f4 d9 w3 i#define M 8 //共有8只猴子
0 V$ r( T+ w) N* a: k#define N 3 //数到3只时退出第三只
# ^% C, o: }5 i* j4 `; ltypedef struct monkey
! u7 L9 J- U5 y' Q" d' H{int number;% J; N8 ?" x9 g) f k) a5 p! l4 h
int flag;
$ {0 F7 c6 B; q5 h7 ~! Pstruct monkey* next;
0 T3 O" o. l$ W5 b& S4 r9 b0 l}MONKEY;
; p5 O) B% L1 b' i( \main()
9 l/ j; Q* ^5 `5 N2 ~5 _" I% f3 z{ MONKEY *head=NULL,*p,*s;
3 g7 l% g$ J) f! c; J8 e5 L int i,sum=0,count=0;
7 Q0 J0 A* i0 i5 s* Z' {" ?: _ clrscr(); //清屏( M. ]9 q: Q; ~# v
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
: V! H8 j- S. Y% d& m p->number=1;p->flag=1;' [- x2 j8 I+ c6 z9 b; I5 m1 H( U
p->next=head;
2 b: E6 Q0 }6 o3 u head=p;
7 v: O9 R9 v7 K) p! J3 O- M! J for(i=2;i<=M;i++)6 h* \5 W `: l7 I" `8 n! S
{ s=(MONKEY *)malloc(sizeof(MONKEY));8 Q/ P$ s$ a: q9 l7 @+ N
s->number=i;s->flag=1;
+ i" X2 M# }: Y s->next=head;
4 [- f3 j5 N! D9 ^6 U5 f p->next=s;p=p->next;* I* N' Z/ W9 _$ y. `' Y M( r
}
( E3 O% J% |3 M+ v E p=head;: O$ V! h& I: ^" n$ v9 o
for(;;)8 T" ~( j6 J2 p1 u: O! I
{if(p->flag==1)
4 ?' s" `* w, d count++;
2 q6 u- p6 H. T if(count==N)
. M( o. p( o6 n {p->flag=0;6 p F- \( F! {) i
count=0;, _, i0 f0 k- u( r& u1 D$ \3 t1 k" G
sum++;}% g+ ^, x3 U- ^# T3 I6 ^) M
if(sum==M-1)
. ~, Q- @* o1 x e* S break;
7 O7 j& r1 J% k" D1 q% I0 O p=p->next;7 h4 `- {4 r& G! {$ A" R
}
9 C N) z) B+ u5 I4 `1 h p=
8 z+ e1 w7 ~6 \ head;4 t0 f+ l/ n- r2 P R
for(i=1;i<=M;i++)
' ~/ d" W" e' Q& b; B* T+ e+ r. E { if(p->flag==1)/ E* [' C6 F e. [; o8 `9 v
printf("\t%d",p->number);
+ K1 P" w# Z; g" s0 w p=p->next;) f3 }1 j3 c# t" a8 _
}( j, M2 w( a! p; o
/ k, U d" y& G& w) b* Y0 ?% R6 ?3 E( j
0 n! @- Q6 y5 `0 L
}
$ d9 a. ^- g1 y1 ^ F7 G/ W第二种方法:数组
/ W: Z; g' Q y$ e6 W$ c- g5 T#include<stdio.h>& w* U" x$ y" C) R2 {* {" O
#define M 8) Y2 s7 i& k9 O0 V
struct monkey
! F$ B5 N" O) l: M{int number;0 G5 k4 | V' ]/ B
int nextp; \" l6 a! q C9 p$ K) |
}link[M+1];
8 Y1 B! I3 I/ q
( o- ~" R" z, D* W2 H1 Y5 j( \void main()
$ \7 b( ^; Z1 @* ?! t2 k{int i,count,h;* u% I; f' `6 { l2 t
for(i=1;i<=M;i++)% Y4 [, u8 _2 ^
{ if(i==M)8 d. t1 C& S! B# D# E
link[i].nextp=1;
* E5 y6 ?3 N3 z2 R3 p else+ k6 S4 j/ q+ b5 C* g, k* c
link[i].nextp=i+1;
; a6 l1 l7 U/ b" }8 k6 j" W3 } link[i].number=i;3 K k' T- A% x. Z/ M; E
}1 j. Y6 F6 ^' R; V7 A9 X# {" c
printf("\n");
9 F& x+ `; [7 x7 f7 I% N* ycount=0;- { ?* D8 G' d, q9 J
h=M;
- c# F3 W" Q6 F0 ^7 cprintf("依次退出的猴子: \n");
- x1 m. X$ ~; l) C: Qwhile(count<M-1)0 u k" ^: {. I8 W5 }
{i=0;* ~, F/ j- W3 q* N- U
while(i!=3)
) T2 i( K6 }; L& H3 u{ h=link[h].nextp;
5 b7 \- t1 t; E) j; u* j9 z$ M/ ] if(link[h].number)7 ?. k6 I1 S! T6 P& X) r; X
i++;}7 u/ s- d, y- ?' a
i8 Q. e z5 J( E# s4 @7 |; r/ M
printf("%4d",link[h].number);% k1 G. a, l' e, M! K3 q; _$ D
link[h].number=0;2 a+ S8 j1 G3 U, S5 v q
count++;3 e# r4 K% f/ T% ?) s" K
}# n+ Q5 t8 h. Y' j- x
! W: i4 d7 _9 h( Xprintf("\n大王是:");4 u" x1 A% ^3 H8 ~; v3 E' c! C
for(i=1;i<=M;i++)
4 b& D6 t% q0 K( K if(link[i].number)
! ?* Q: V' Z- P+ } printf("%3d\n",link[i].number);7 @3 l/ Z* z4 n6 r0 ?( G
& ]4 t1 ?. x l d6 j2 C. P
# h# @% a5 B, s) Q} # c. E) r* E. ^1 O2 p; ?
第三种是普通方法for循环& T ~' ]% `" V* P8 S
#include<stdio.h>
. M9 |" @4 E* f7 Y; o; bvoid main()
$ n3 ?+ A1 G7 x- j7 c{ int i,k,m,n,num[50],q,*p;
) b0 T f5 g3 u& X$ O, l1 s clrscr();
/ f; e1 b3 q0 C7 c$ M printf("input number of person: n=");& |. G2 H: E+ B) L: [) d9 I
scanf("%d",&n);
& M+ \5 d ?/ P' ^3 Sprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只* I7 g% k8 t( _
scanf("%d",&q);
) X' C3 P( K o$ @: p p=num;
' ?" n; z3 L* r; `; [! s for(i=0;i<n;i++)
) N: I3 V6 E9 u4 p9 b+ ? *(p+i)=i+1;
# b) _. l' G/ e' @& D& C2 O+ y v i=0;3 K* F+ W# o* i+ A
k=0;
; ?* |0 F0 e( Y6 U N+ q4 h8 h m=0;
: g, u2 o/ C/ f- T6 N. J* ? while(m<n-1)
" {. Q! l2 ]( F2 \) i: f% x5 K {if(*(p+i)!=0) k++;4 \7 Q: E/ i h/ S5 d
if(k==q)
9 [5 D; f- u- z& I8 b! _- l2 o { *(p+i)=0;- K( _' B# r7 z7 Q& a3 F; M% R
k=0;' B* F4 m# I& N8 e) M
m++;
( E7 o: }3 e( [! C# ? P }% f+ y& V7 J# f: V- I5 _
i++;
( n$ v& h& O# e: z if(i==n)i=0;* a: u* V0 w3 ^3 ~
}! G5 R, G. Y# w I
while(*p==0)p++;& u0 D/ p1 m Y% O% e/ C9 Q0 N) e
printf("The last one is NO:%d\n",*p);
* G" T# n* Z' T [$ C getch();% T3 `; M j# @) p" j* h
) E8 ]) u; s' ^+ o$ U$ H H} |
|