|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!# ?$ D3 c d; @/ l7 Q9 i
这几天我在忙着编一个问题,我用了一种方法编出来!
4 ` B% b- c6 ~4 R7 g但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
* c3 P2 O4 ^& B! ?$ R% E3 f% ~注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 4 k1 q- G. |* Y( b) z( Y
& S1 ?- m2 ^1 Z/ [$ R$ x" f+ W5 r+ `0 S/ u9 y! k. X4 q$ p3 X7 G
题目
- y+ O% S3 Z+ Z) x山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。& m: W+ N! h+ d: V1 S2 a2 k
第一种方法:利用循环链表: t! \" m" F B3 ~
#include<stdio.h>
( Q& q9 M- r+ q% O& t6 x! H' V#include<malloc.h>
# s& S. Y8 p/ v#define M 8 //共有8只猴子7 v' `2 ]# V+ t3 X$ N
#define N 3 //数到3只时退出第三只* U( C$ ~" X' c
typedef struct monkey
0 m2 I+ W; n7 J$ s+ i+ k2 v6 V{int number;
. Z/ E" }8 F" {* ?& Q9 nint flag;
) y0 h9 S- I9 T+ D) Vstruct monkey* next;
. ]8 R" W/ W* J- h* Z5 o}MONKEY;; a0 g; ]* ?* [
main()/ Z2 t- f. f8 A# w* ]7 X, f
{ MONKEY *head=NULL,*p,*s;2 k( x8 I& V, F
int i,sum=0,count=0;
( c! b! O0 s B. t5 T clrscr(); //清屏# R' N; P9 U4 j6 N- K
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存+ k5 l$ o% X) c6 L( n
p->number=1;p->flag=1;
% t/ [) @$ Y/ [' b; ` p->next=head;
8 W! ^1 o2 x* \8 C6 i( W1 O, G3 e/ ` head=p;$ Z) _ \: M9 _8 J
for(i=2;i<=M;i++)
0 i* X, L8 ]' F1 h { s=(MONKEY *)malloc(sizeof(MONKEY));
) R4 d7 j% M7 H& ?- _) ^6 A s->number=i;s->flag=1;+ {0 I7 @$ a% a# V7 d8 f$ R
s->next=head;, y+ ~1 c! u9 H! X, z7 }- S
p->next=s;p=p->next;
t8 ^- w5 |8 W: x8 \+ t }
6 [4 h P2 P0 h p=head;
! j" e1 ]' r9 k, ^$ j for(;;)* ^; p9 X5 y" j- q. Q- Y/ _: t5 D5 m
{if(p->flag==1)
5 z: U0 D$ a6 ?2 q# Y( z* P3 v1 p0 a count++;$ R- G3 T. e, n9 Z" M; ^3 p, A
if(count==N)% c8 {3 q1 i& D
{p->flag=0;
) E( T% G& H+ Q0 K1 w count=0; l# G) ~; h( j% E
sum++;}
' ]& n* U6 _( O2 L% v( {5 ]& { if(sum==M-1)
& S8 Y3 ?+ b! e break;
7 M u7 S$ p2 n. R: s p=p->next;
/ K( p( }7 {' L; n8 N }
. M4 w. ], p5 I5 {& [; b p=
' @' i$ w. T+ N4 l9 h; s# G3 V$ ` head;
; Z; |+ p! l2 e% n! b0 j) { for(i=1;i<=M;i++)( x; G: x. T) X0 T% N
{ if(p->flag==1)0 \1 ^$ q. ~& s
printf("\t%d",p->number);( p6 h# t% g3 _- ^& c5 S6 u5 _
p=p->next;; [- T. K3 h0 j5 { C' @: ?
}9 D0 r# `9 y+ `
0 [& ]- {8 j b! b* B
- }9 k9 h* b/ }( Q m( ]/ G9 n& v# T1 O+ M! a3 |* E
} Z' d; y& D J+ x6 u+ U; _ j
第二种方法:数组
/ w% m3 [8 R2 q4 c$ k#include<stdio.h>
2 P: u- H' @( u2 v( |4 t#define M 85 L8 R$ F; l ~5 u& v
struct monkey
) B% F2 f- c* J# N3 ]{int number;
% o9 {& ]. x+ M! I* Uint nextp;7 @8 A9 U; [; b8 e
}link[M+1];
! {1 T1 T2 O9 `7 z2 ]6 ?- d) \' Y* |* ?; r( A' V5 E I4 g
void main()2 U$ r: e! X+ i; c0 \
{int i,count,h;
7 w0 q7 V/ L; r3 ffor(i=1;i<=M;i++)
& y7 u5 r9 t- ]{ if(i==M)
* l/ P! @1 O3 D+ z link[i].nextp=1;; O( s- X3 M S* ~! p, G5 p8 P
else* A8 u: q" L9 O
link[i].nextp=i+1;& ~ E& S/ L$ ^! H$ k: Q) ^
link[i].number=i;! o3 R; U# f2 `# b5 L: |
}
7 F: v' k$ z6 d) S* vprintf("\n");
+ x, v' Z# B5 ycount=0;0 v! `! R! V+ W) m: A3 D& l0 D& H( o
h=M;
1 O# }/ P$ ]1 C0 mprintf("依次退出的猴子: \n");# r0 u' S9 b+ x
while(count<M-1)
! x# C# p1 L# B% o8 w{i=0;% m1 O( w9 N1 B: ^2 o
while(i!=3)
& D U' D' ?, P& w. q+ c7 I' E{ h=link[h].nextp;
6 h0 a' f X7 b* e( I if(link[h].number)/ m. Y( `+ i; E6 i% E
i++;}
/ C& S$ p+ t: s0 [* t3 y
0 s, |, c) D+ ~7 @. F7 L& w# `( |printf("%4d",link[h].number);
, t8 v4 x; ]1 X/ nlink[h].number=0;
9 Z4 v, V" \& v8 ]' V# N) hcount++;
3 n2 c- z4 |7 }0 L6 S& }}
0 u& t" S. q ?5 E. g# J& ^2 @3 c8 D3 W9 C- T* `
printf("\n大王是:");
1 W P/ T' y6 r8 I8 f for(i=1;i<=M;i++), {$ x E/ ]& g$ Y
if(link[i].number)
! K- X$ o% n& v! A) a5 ~! U: @ printf("%3d\n",link[i].number);
0 K2 A! y- [9 Y) b. v
2 y+ N9 k8 z( W" \- a1 g, N) ~0 |& _& r4 o8 j* s. l
} & m4 S+ j9 a/ ]
第三种是普通方法for循环/ z6 K" E& O& W- r* S* w \
#include<stdio.h>% s i0 k% U5 D
void main()* V& k: [/ d* \6 v
{ int i,k,m,n,num[50],q,*p;
5 h/ J, ^1 I \! { w( L" m clrscr();
. g w$ v, G1 b* @9 O* ~ printf("input number of person: n=");8 a5 @3 \# v" I3 H: }
scanf("%d",&n);" [' W, T4 c& x6 s7 ~
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
: I0 V: G% q% v" @7 K scanf("%d",&q);2 A! w6 S& e& H
p=num;- X B9 M" q/ G/ g i- g8 f
for(i=0;i<n;i++)/ }) U5 U7 A4 s V3 q+ r
*(p+i)=i+1;
1 B) j2 k( ], H3 P2 Q4 [ i=0;& R+ r+ O9 P" q$ _. F8 U
k=0;9 y+ Y a, H8 S$ C
m=0;) |4 l& H. L/ M3 D! ~/ f j. |4 ~; Z9 f) K
while(m<n-1)
. }% V' g+ g) b1 ]) `! f {if(*(p+i)!=0) k++;2 S: V9 u: C4 f
if(k==q)4 i8 d9 ?0 r# n2 e) y7 T
{ *(p+i)=0;8 s3 L. {2 y* P
k=0;
( O( r l/ Y- `5 _ m++;
+ z; f5 ^7 B9 N+ z7 T; P- W( ^ } `/ s5 c8 B( C* E# a! t
i++;
) A& _: p$ P; e, `! y0 f. r if(i==n)i=0;
% p+ P0 i+ c: |+ a I" x }
) R- {! N# ]: Q6 x" Z while(*p==0)p++;. u7 Q" R) d2 }1 {+ x' S q
printf("The last one is NO:%d\n",*p);; i* u f! G0 C/ }2 @6 ^
getch();$ Q: k n9 h- \- h! d5 S
6 I: _8 v* O6 ?
} |
|