|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!. Z( ^! _. ~- y1 M6 \0 Q% p6 R
这几天我在忙着编一个问题,我用了一种方法编出来!7 ~8 ^, y5 b, C5 u/ y1 k5 D1 \
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!7 P5 {* Z4 W5 N! {
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
* X6 C+ z9 ]" a: P# x- ?
% |1 E: p" O: X6 d& k4 y* K( {
6 j- v7 C6 R; A u& ^5 h) k2 W$ g 题目& e' Y& J, A3 C% w3 A
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。 m6 A# A0 o' D: G0 |! ]: ~
第一种方法:利用循环链表# M! d. z$ z! N9 e# _7 S
#include<stdio.h>
+ \( [& i. G; P g9 T) q2 G% v& R#include<malloc.h>% o3 X, s7 P+ q6 c
#define M 8 //共有8只猴子: P6 m5 U# o4 Z/ H- j% D
#define N 3 //数到3只时退出第三只8 W( Y) _/ ?3 C& W
typedef struct monkey
. Z* X+ g7 W6 _$ A$ H0 r{int number;8 z& e9 _: N' c0 @7 B* K
int flag;
% w- m Q( [( H: i) z2 [8 m3 Vstruct monkey* next;
4 a2 Q6 r9 g1 f5 ^}MONKEY;
% V( V8 s$ n( K, k, {2 ?. z n3 T3 ~main(): x" p7 ~3 h: a; W8 A
{ MONKEY *head=NULL,*p,*s;! w% X' `/ ]/ v6 j0 w3 i. _
int i,sum=0,count=0;
+ x0 v% i2 z& K clrscr(); //清屏
/ _1 n S' ?. `' E! J2 m) n0 E' E5 y( o p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
, D& K H; \9 } v6 b- b7 \( n p->number=1;p->flag=1;
, K3 b- w+ k/ a- K9 _ p->next=head;
! \& u6 e# L; V( v0 H head=p;, E, r- A& a, j, S: b8 o! F
for(i=2;i<=M;i++)
5 Y% `2 R" ?! E( i3 r; H { s=(MONKEY *)malloc(sizeof(MONKEY));
" A( i4 z- U7 O! s" l9 T3 q, ^# ^ s->number=i;s->flag=1;9 J# v6 C2 J( S4 e' g' ]
s->next=head;
' v$ U/ w- \ S' ~ p->next=s;p=p->next;3 ? F! b3 u8 j, y- N2 K: R
}& g3 t& i) h7 e7 P
p=head;
3 R5 p5 K% \, j" Y9 z for(;;)
: t) i7 I. F# F4 \$ J {if(p->flag==1)9 X& P$ H4 r- V# N8 J6 |, ]
count++;. }) |# z) i+ x! M
if(count==N)
; W! L* d* |5 Q; N7 H5 ?# R {p->flag=0;
8 o( r- _& ~7 x6 [+ ^ count=0;
5 v1 F- m4 K t! r. m8 { sum++;}+ S0 w b! U% y) A, x, m, f
if(sum==M-1)4 L. c: L6 h, ^: J
break;5 u' h l, O+ N( Q' Z3 O/ K" W, Y. A- g
p=p->next;5 Y8 h4 m$ H D
}
7 J# l" j% ]- |& s3 M p=
1 G! T4 ]1 u5 B2 e( G- e" A! G4 v7 q head;
$ `8 }2 e) z% e: n7 R" m for(i=1;i<=M;i++)1 d7 c% E& {/ C& o8 N
{ if(p->flag==1)
, y3 `; M% a6 U printf("\t%d",p->number);; a4 \ r3 G+ f
p=p->next;
# Z3 Z5 `4 q2 T) M }
! ?; a7 T( M& J) D+ E6 \( }
1 d0 ]( ~ u9 j+ W# f1 `, G
/ g) J8 b+ }% z% z! ~! n% y/ D N* E! e1 G# n
}
3 K1 [( `# n# c. k7 m7 c c第二种方法:数组, g" \- o' W# h$ X5 q/ \
#include<stdio.h>/ Z: F4 }5 A g/ r4 |
#define M 8
% i+ d- \2 X" s: x3 ]struct monkey
! t* t9 \- p! w" o4 F{int number;) N8 j: y! c6 ~
int nextp;
% [8 j9 d. w- K8 l}link[M+1];, A# K6 W6 a! R
" s6 g) Y4 ~, }3 Q3 Fvoid main()/ c( a P" U3 e5 U& G) @
{int i,count,h;* z8 J+ j5 K( O3 ?) y% ?% J( x! o- d* ^6 f
for(i=1;i<=M;i++)
3 b5 y, l; ^# Y" B( G" H5 T5 s{ if(i==M)
' _2 W: p( g2 w% L link[i].nextp=1;
1 [ J3 k+ ?5 ` else9 w% o' K/ X0 b; U0 k0 ?9 D
link[i].nextp=i+1;
# m2 R% M" h- A6 |7 @; I* e* x link[i].number=i;& T; i0 Z/ G5 p( \) |) Q
}8 n' E0 \0 k4 G" z! y
printf("\n");
' {* ~8 @& [0 x7 {% Ccount=0;. m/ s+ U& v+ o& e g/ M
h=M;
! L! G, o% m& B4 N% b4 @: aprintf("依次退出的猴子: \n");- E1 V. g4 N- L! H
while(count<M-1)1 j8 r5 D. z; h
{i=0;
+ q% g1 d( {. _3 R% ?- U: uwhile(i!=3)
% C K: P8 O( C( w* ^3 l{ h=link[h].nextp;0 `9 [9 P2 V. R4 V3 n7 Y
if(link[h].number)
4 R" J! Q# o7 o* f0 q, I4 c6 s( i i++;}
7 V w, _( Y! F4 c9 o: V. U. y+ H4 b8 d2 {3 K( ^$ M8 m# c" D4 d2 P
printf("%4d",link[h].number);
3 d, L! ~: d( E0 e% E- zlink[h].number=0;
! s% k& U, V" x. C1 n- i. ]7 ocount++;
9 f' w, V7 J; a" E$ l2 ~}
+ F* v, h$ y. r2 D: h! z0 L) h. U. \
printf("\n大王是:");
@+ y v& ~9 ]$ c3 b7 z for(i=1;i<=M;i++)
+ O- C& v0 }! }9 H* q T if(link[i].number) X1 d. ]: y$ j, C) A: p
printf("%3d\n",link[i].number);# l6 O# K: G' R8 K
5 x4 x7 P. T4 n1 q; Q3 {
& o+ s0 z% {$ ^} ' f% D" _: |3 C! Q4 F! H; m
第三种是普通方法for循环* B1 D4 \* z. Y( w, i7 s
#include<stdio.h>
5 J) j$ [, {4 Lvoid main()1 o+ m- K. l$ o
{ int i,k,m,n,num[50],q,*p;/ ^: C# W3 q+ _1 e. u
clrscr();
) M+ r7 l6 D6 E4 Y& f printf("input number of person: n=");; L$ @3 _& U, J# H6 H0 `" c0 _/ O
scanf("%d",&n);
2 |2 f8 V+ y2 ] Y2 ]# R2 i/ eprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只1 |7 V: Y% y3 W ^
scanf("%d",&q);
" }9 l; g1 P7 o2 }% J: ^0 o C p=num;
; m# X0 Q; i* @- V/ q( v for(i=0;i<n;i++): X" U% b8 U/ O1 f
*(p+i)=i+1;
; U' b! w9 z: K, p( p i=0;
1 d( ^2 P/ Z- W( E1 @' X k=0;
+ i3 L6 E' A: [% O4 R# O. [8 o" |) ? m=0;
7 D6 N/ u5 `$ U4 _( S8 N: F8 h while(m<n-1)
% b' V4 A) g5 W6 r8 D' o {if(*(p+i)!=0) k++;
, n/ k" j. e- A7 _+ J if(k==q): S# H4 G% y9 \+ G' b
{ *(p+i)=0;
+ P1 f4 z: w3 U8 f$ } k=0;+ q: B2 y! k( K" A5 F6 [7 ^
m++;
1 z5 k. a+ I/ y }
4 t! U1 Q7 q+ g8 N4 x0 J! I i++;
$ U" ]9 x% T% C( G' z' ? if(i==n)i=0;
9 u W4 T6 T3 ~* u }
- S) e! x u# W+ h, q) w while(*p==0)p++;
% [# r9 }" b3 T8 P5 c9 g printf("The last one is NO:%d\n",*p);
. d2 o- q* v$ |! a& S5 m4 U getch();
) }8 M* G2 L% Z7 E5 k1 a% P, J& w# j l! b
} |
|