|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!2 d- m5 s, z5 O8 n8 \5 x2 F
这几天我在忙着编一个问题,我用了一种方法编出来! P4 n: g# p% s- Y4 y
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!8 D) n6 b {- U' R
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 3 M9 m: X( F- I4 o8 ~1 f
5 v7 o, Y/ y2 K" ?( b. G, Q5 W2 k+ e6 `7 q- ~8 T" u
题目
# l! ^) A' ~4 a' U" ?/ q山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
) B; A- |4 w' T3 n& s第一种方法:利用循环链表$ k$ p# f# r5 Z8 F j2 ]
#include<stdio.h>6 _/ C6 k2 y1 f5 }5 W
#include<malloc.h>
6 H5 k/ x& L' v" u3 G0 ~#define M 8 //共有8只猴子# ~4 }$ _& E. l2 l0 P5 ?
#define N 3 //数到3只时退出第三只, W! W0 Y1 S- ]5 c$ X
typedef struct monkey# J1 d4 }/ p3 ]2 p6 w9 K* i6 i
{int number;; P& |8 f" G9 Y# h; T+ G6 T- J
int flag;
* q" |$ a+ K9 r, u/ N% v2 e# Bstruct monkey* next;& e- E+ W+ b+ P8 u
}MONKEY;. N) t2 s- p0 S5 v% m# r
main()0 v3 y! j+ Z, d4 s9 ]8 Z$ c
{ MONKEY *head=NULL,*p,*s;
0 X' E M* r0 X int i,sum=0,count=0;
$ Z0 L9 N+ Z8 l8 K* V clrscr(); //清屏
, I& j. w9 b. w( d6 |: z0 e' X p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存9 o9 h1 F. n" y; l+ y+ i8 j1 u
p->number=1;p->flag=1;
+ G- P8 {& v( Z" E% v% F p->next=head;! c) n) R- u; j9 j- C7 F
head=p;
9 |! ]1 a7 j7 q3 c( Q for(i=2;i<=M;i++)8 v1 [2 B) i0 X8 Y" V% H+ j
{ s=(MONKEY *)malloc(sizeof(MONKEY));
1 R+ a% a% l/ |, J6 ] s->number=i;s->flag=1;5 b. f- [8 {- V' K: G+ |0 {$ u+ _; f
s->next=head;& C7 }3 x# m- K& X% Y
p->next=s;p=p->next;
: @# y5 x) j W) Q% j4 P }
4 b) G& {$ X8 Q" H/ W% B. l p=head;) [: A6 u6 K" }6 x
for(;;)
: S# }7 s, Y v1 q# ?1 r, Q7 G {if(p->flag==1)# A4 ?( T7 k- w8 {3 h. E5 Q: T9 n
count++;/ Y% |, X* w' {1 r7 @
if(count==N)
# p/ n, e8 h8 w! j0 b {p->flag=0;
8 c+ a. p. K e8 O5 D4 z. }9 { count=0;
# P) D. I! l W# f: Z0 D0 h sum++;}
* ?2 a- U2 T& T9 k' k$ t9 x4 n if(sum==M-1)
- S7 j; J) j0 e+ j break;
1 R, Q+ W4 r$ ]% t) v! O/ U p=p->next;/ T6 F8 l" a( ~
}
. ?. o# Z, G/ m$ B+ w# d p=5 A V/ R: D' _1 B7 I
head;
& `% P7 e5 V% B3 S* C for(i=1;i<=M;i++)
' h, f" C) a5 |/ N" k+ ~ { if(p->flag==1)
3 J7 @8 r% b! l! J! V" v! t printf("\t%d",p->number);
" G0 s0 p. Y) Q0 W p=p->next;
( x/ d" n* M0 v4 c0 v/ U9 _+ u }
6 W" |2 g6 R! m& M- J' I( ^) o( q; M( d
" N/ I- {6 p# X1 p- _5 h
, M$ z) m! X( m, r/ A# e}
3 A% n% Z! h% V' D第二种方法:数组
/ Q" ~7 e! V' f8 ]8 B#include<stdio.h>
: o2 J7 k1 Q. Z( A#define M 8
" {8 S7 W# O4 g- \( U: ^8 S/ @struct monkey
6 v! I5 e; \" b) j9 L{int number;
! _ f) L; S4 Y8 D: X! P1 aint nextp;* X) z5 w, n8 p b9 T# W/ C# f
}link[M+1];
6 G: P! P) O+ O+ k
1 S% x- ^3 d+ Z0 r2 E1 U0 evoid main()
) k7 S7 [1 y- o! |+ [# d{int i,count,h;; m! @8 U4 n. M
for(i=1;i<=M;i++)
5 n, M( I8 q2 ?1 A& v$ [: G$ T{ if(i==M)
: E! U. [2 F4 o V5 D2 ^: ? link[i].nextp=1; r4 a9 Z* t: J7 @ s
else
5 Y! c) x. o0 Q0 U; X* W7 U link[i].nextp=i+1;
& J. M! t& c; ?: ?' L link[i].number=i;
& k0 ~+ {8 L, R}
, ^, m; t4 \1 Yprintf("\n");' \, I+ M8 r/ D! ` I1 X1 o1 f! s
count=0;0 i1 G' Y$ j" G+ p
h=M;
2 j$ F% J0 ?5 ^printf("依次退出的猴子: \n");4 f/ W2 o* I4 _, \2 r* L9 O
while(count<M-1)2 ~" q# E* ]) a
{i=0;, N5 A S! B2 e
while(i!=3)
9 ?2 |1 ?6 M' ?# e+ a{ h=link[h].nextp;
" I5 V9 D5 W0 M' Z if(link[h].number)
. u r! [- R$ e. A8 u$ u i++;}: y' g' V* V' `0 n/ B
& O5 c3 {: r' S. a& Q# l
printf("%4d",link[h].number);
! i0 Q2 Q/ K0 A0 m, I5 q: I8 z, Plink[h].number=0;
0 D. J! i+ T6 Xcount++;
0 X# c6 R* ?. q* X- h( c4 ]2 a* W }}
7 O( ~# C7 U+ m
' s+ [+ Q8 ^0 T& }$ ?7 aprintf("\n大王是:");" l$ |9 |9 H8 l" m7 y2 m
for(i=1;i<=M;i++)3 Y$ N8 z- ]3 s% b: ]0 s4 Z9 Q
if(link[i].number)* |8 M" l: Y" } L! r- t2 {
printf("%3d\n",link[i].number);
U" K8 n# T. p# w8 |6 I0 R* s3 o* b
( K1 w( m# N) f+ }4 w/ L) }4 d
} - h# z P% L8 a7 O1 L; h5 J
第三种是普通方法for循环6 _! M B/ S& A0 z1 o/ p; H
#include<stdio.h>/ Y$ F: m4 U9 E Q u
void main()& Q- }( \( U0 [" y
{ int i,k,m,n,num[50],q,*p;) [& d) w7 {" V
clrscr();" z* M* G ]% t4 d6 x) o
printf("input number of person: n=");
' J6 C1 }+ Q7 ?; ~5 p% X7 E scanf("%d",&n);# j( x1 W! j$ p
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
' B* J. r% z$ z7 B scanf("%d",&q); g: |, {: Z5 ]) X, I5 t+ n- W
p=num;
2 z( ~/ u/ ]; h; x, i+ Z4 D for(i=0;i<n;i++)
* ]" |: m1 c2 Z" V- m9 K9 u *(p+i)=i+1;6 N/ l3 @8 U5 b, X/ k! H: e Z
i=0;1 P4 D/ Q5 M& q$ T3 s2 N3 j! J
k=0;
7 p% y0 w- T2 C3 u" } m=0;
$ [. Q4 J% k: k1 s' N+ V3 @ while(m<n-1)" L! F% e" `# O$ Q3 W, i
{if(*(p+i)!=0) k++;
# f/ R- j Y! f if(k==q)
' V$ r- p- i) S9 T* S1 l9 ` { *(p+i)=0;) y& d) ]4 g% t, l3 X8 ?
k=0;( S$ F) A2 E3 r4 S& P( g$ d% l$ j
m++;( l! S3 x* Y: L D2 c( ~
}
% p2 S6 Q7 [+ {( [$ M1 Q5 M i++;1 r& ?$ X" c$ c/ `: U C# {; z
if(i==n)i=0;
; W5 }/ p; p2 m* s4 _. o& ? }
+ J4 N2 Z9 x: }/ C4 v while(*p==0)p++;
# t6 b0 r# ~5 l0 B! g) Z printf("The last one is NO:%d\n",*p);
( e6 B0 i h3 A& s getch();
5 @ F4 m& X Q$ u. O& e4 K( r% ^5 b4 N6 D; F! p- G) B3 f
} |
|