|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!. E: ]4 X0 A, s& u0 ?& o
这几天我在忙着编一个问题,我用了一种方法编出来!0 S6 O: _1 X* i' v7 I1 t; L
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!+ B- A$ y( n4 k: n4 x9 c$ D
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 4 [; ?8 k& V3 c3 U& f! m! t, r
G3 |* _ t1 I0 W- W" s# I0 R
# M. `+ }) J" ^' W 题目& K- O; d/ M6 [2 m
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
7 [; q2 x) H' g" R: L. Q7 i7 h. ?2 S第一种方法:利用循环链表& x! D4 k" o6 E3 o: K- N
#include<stdio.h>
" O2 y. {1 C! Y! }: m) U- r; `6 {#include<malloc.h>
* I# ?1 W5 C7 M- i+ F9 A! g- {" b#define M 8 //共有8只猴子" B% |6 _) ^. d/ k5 c" ~: \
#define N 3 //数到3只时退出第三只
# O0 `. b3 |9 S& xtypedef struct monkey
' y. e8 m& k; W: ~4 D* I{int number;
: w6 ~9 ?9 W/ k, l ~* r3 Lint flag;
5 C0 G" @% }4 d! J$ Gstruct monkey* next;
2 l( N+ O8 ^7 d3 R}MONKEY;
) m6 T+ R! U1 P; c2 {4 Mmain()
, O, R; l1 n0 i' [% `# |0 q{ MONKEY *head=NULL,*p,*s;
; X, J6 t z& l% R6 j1 t" q int i,sum=0,count=0;
7 P- D- e" P4 n% o- z clrscr(); //清屏4 M9 |9 f& p7 n' I2 ~' w
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
& I7 x# } w7 B! C p->number=1;p->flag=1;/ \. R3 Q9 n9 W' g
p->next=head;$ A& X( K7 u" x6 w. s+ N
head=p;
A+ z+ Z/ e; f2 j% q. m& `: V for(i=2;i<=M;i++)2 ?1 G, f( p/ [& o Z
{ s=(MONKEY *)malloc(sizeof(MONKEY));# o2 i7 s/ U$ L F9 [% `3 H
s->number=i;s->flag=1;
5 D9 \; Y+ ]' |; N s->next=head;' j* S7 o, P! d- Z" @$ y2 @5 f6 S
p->next=s;p=p->next;; p: e' ~8 T, V) ^) V* J8 W
}. q4 z, ]: ^* r: ~ W% V- `
p=head;
8 O( ]. C' I+ t for(;;)
/ _' {. T' i" X3 a. w- M& o R0 g6 W {if(p->flag==1)
' k* G/ P0 x9 Z+ u: H/ c& e count++;
. R/ S+ |% U( f4 C% T* N4 |$ J' }4 H7 W if(count==N)* u5 H6 C- |) y& g7 w3 U
{p->flag=0;
& P7 B3 T c) Z8 V+ B& C, {- I count=0;
1 `4 I! W% v/ u+ e! H( h; | sum++;}
) M3 Z6 U( @) p) j if(sum==M-1)/ f0 k" l* E0 C4 \3 }/ L
break;
8 t! S, h, l8 b6 |0 m/ k1 R p=p->next;) \% J+ T) V2 \8 P
}
( w- T {& r A( |( k p=2 E( s4 `0 y1 O9 C8 Z8 D* x
head;0 ?8 ~2 B0 z6 F7 m+ z- P
for(i=1;i<=M;i++)9 U% t. _- a4 k
{ if(p->flag==1)$ a, d6 e" L2 W: _/ y3 k* @$ m8 C, d
printf("\t%d",p->number);
% z: N9 P/ n4 Y* X$ z6 T p=p->next;
- m C% z: m6 ]0 \ C: N+ h" { }
1 U: Z$ u* d! E( ~2 m: r6 g7 }1 S) I7 j4 f5 H% W
2 j4 S1 ~( i/ ?2 @8 X- z1 Q9 Q$ y
# v v: P6 k: Q% k8 P}
* I% I$ G5 C1 j9 {第二种方法:数组 d% I: ^! a2 ~) s
#include<stdio.h>
/ x9 x2 C/ X- @: K' W4 K5 o6 ^. h#define M 82 n1 h7 g9 |, d3 U
struct monkey+ O1 ^; P2 X, z8 e6 D- m, x" N
{int number;( c$ ]( v0 ^( k8 H, j. ~5 {1 R
int nextp;
# R q# |! f2 i* E# @: E; I9 N* Z3 p) O}link[M+1];& Z3 F/ G1 c1 p' e! P
6 ~# w9 V9 O3 A4 c" J: w
void main(); |) v( w0 A; J% L; a) P
{int i,count,h;- q; ~ j1 b( @
for(i=1;i<=M;i++)# v5 k7 z- U8 ?' N" D8 t0 S5 P
{ if(i==M)$ l: Z' t! N, K {) S- G
link[i].nextp=1;
2 w9 J# v3 H8 L( {; X3 A else: v6 p+ X4 o" a/ J! F9 K
link[i].nextp=i+1;& }6 _& r: x$ t/ {) S! G! {- o8 Q
link[i].number=i;( L; b, v7 H* _# z% D
}+ l, `! J' x/ o2 } |5 T1 Y6 a/ k
printf("\n");
" A, B* H% ~ O2 g( o1 Qcount=0;" {/ W% u- G% Q7 T5 C7 W
h=M;
7 c2 `6 P# i% ^ yprintf("依次退出的猴子: \n");( i0 j# }/ v; C
while(count<M-1)
% Y- U& a3 m3 ]# Q{i=0;
/ L! {6 J% F3 _! E, Z. l# S/ Qwhile(i!=3)- X% W2 ~% t! s8 [! \
{ h=link[h].nextp;
9 q% @! Y, K' i. q3 d$ K if(link[h].number)
! L- r0 E Y" ]+ G i++;}
* l7 N3 ?" r& U& L" c% }% V: |1 G0 V9 W, D1 S' S! b
printf("%4d",link[h].number);
: b8 g8 p1 A) v: r5 q4 jlink[h].number=0;
4 Z" a7 K9 w2 Y0 @* |% Ucount++;* K: Y; ]' G3 j: H, p2 H, v5 i
}, }, f8 B4 l' M/ C. d
! [* X1 i' x. B8 ? A7 }printf("\n大王是:");4 A: c* o& j# H g+ U) X7 l. n
for(i=1;i<=M;i++)1 x4 w1 @6 z B: O
if(link[i].number)
4 {, _) X% L3 m" c: E# A' S. M printf("%3d\n",link[i].number);
" z2 ]& b q" M0 H1 R0 Y! O8 @4 ^* r/ j) t
& d: G/ W* P; I M8 s}
# b% b8 {5 L6 ]! `- n* J9 B7 H第三种是普通方法for循环
# Z! {+ O+ ^- e) o9 H: ?/ G#include<stdio.h>
2 i2 \, G" R. Y# E2 T4 t2 {void main()2 M4 A, }6 S8 n4 m. g5 ]6 B+ q: \
{ int i,k,m,n,num[50],q,*p;2 O! `- O; ~: V4 h5 _9 L
clrscr();1 K" w7 ]$ ]/ F1 d! c
printf("input number of person: n=");+ [+ a6 h9 I3 G- z$ i3 l
scanf("%d",&n);9 p4 Z; I7 [9 @7 `- H
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只0 h9 {) _6 Q- Z3 m0 T! }+ f0 u
scanf("%d",&q);( D" H8 F$ L# y! ~3 E' m* A
p=num;
1 U6 t5 z( ^7 e$ ~' ? for(i=0;i<n;i++)/ Y* W. h+ ^! q- j
*(p+i)=i+1;
+ B; K, g# ?# T0 p g) T i=0;$ M3 a2 v2 V; Y: Y
k=0;
0 R% c F3 X0 ~% a+ L m=0;) n" `1 B, ~6 U" y
while(m<n-1)6 _# ], s* K4 l% k% b2 \# G4 B
{if(*(p+i)!=0) k++;
% S' B" [# s- H, f$ B if(k==q), m S1 O: O! c. G5 {
{ *(p+i)=0;
8 @4 b5 [3 o# q2 D+ G* Z0 U k=0;
; O; ?+ b8 G& a0 U% P' G: d; J m++;
/ @6 x/ L" |" x& J& Z1 L- P }1 p, R" A7 \) m8 A- p( l0 Y
i++;
) y. ] d- o: e' T4 }& v, u3 Z if(i==n)i=0;4 k) M$ X! r$ B; Z
}
0 A }1 m) Q2 C6 E/ C/ g0 y while(*p==0)p++;7 t+ B( O5 [1 {( U( x, t9 y1 E/ i
printf("The last one is NO:%d\n",*p);5 }" P! x8 Q4 v* |6 j J- c! \
getch();
1 m8 W* R& G% o/ `. E
5 ]3 O8 P) \. ]; [! A. `( Z} |
|