|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
; d) B1 Z. A. Q7 E这几天我在忙着编一个问题,我用了一种方法编出来!8 A! {, { ^, u% n+ q9 N+ |
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
0 r$ V4 p8 @$ C+ u$ q0 z注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 6 O7 A0 }! F8 @6 f; o
- J3 D: W9 n' L& ?5 O
& R: ~* l. c0 i0 A2 P2 f
题目) m6 F% u/ N0 }. Y
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。- ]3 i1 g |. L
第一种方法:利用循环链表
# ?2 x$ _ k$ s#include<stdio.h>9 D5 {, K1 F- S3 f
#include<malloc.h>
" w0 R Y+ t2 V" d* b+ e#define M 8 //共有8只猴子% b e% s* h6 m" r: l( U
#define N 3 //数到3只时退出第三只
! B; c1 { T% V3 {2 Otypedef struct monkey2 t2 s/ x, d n& g2 C) d/ r: }
{int number;
4 E6 @" d5 G5 v9 k1 Pint flag;
) E& i0 ^5 S1 ~! s- F( bstruct monkey* next;
* ^4 I# e8 C" s- K n5 m" i; i}MONKEY;
$ Y8 b& Z1 h9 e7 D* ]$ ?9 umain()
( [9 E: C0 y% ^- W{ MONKEY *head=NULL,*p,*s;
* y q8 S1 B! z, S- m9 E/ ?& U int i,sum=0,count=0;$ } r; o1 R7 n& ]1 T4 @" K
clrscr(); //清屏
$ v" g2 @* \; J p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存5 k3 e8 ]1 K3 z7 ?" M, y5 E
p->number=1;p->flag=1;6 B! }* b" K( Y$ p
p->next=head;2 n8 e3 I+ ^, L
head=p;( m: x7 l# k c1 ~% O; E! s6 N
for(i=2;i<=M;i++)% k+ z+ y5 m; Z* x$ p0 K0 ]& A
{ s=(MONKEY *)malloc(sizeof(MONKEY));$ e* h; T+ R: x i2 N
s->number=i;s->flag=1;+ M7 c- i1 m. g$ ~
s->next=head;
$ R* a- u7 \0 r) `: | p->next=s;p=p->next;
' {/ F& ]% B* Q* ]3 S9 \8 `) c }0 r/ w6 d9 W3 ^6 m
p=head;
* Y$ d G! d3 Q- g' c for(;;)
6 D) v7 w/ F$ U* t6 ^* r {if(p->flag==1)1 B6 B$ M+ a3 \# G( ~
count++;
0 `4 F# u' m0 w$ z% ~2 ? if(count==N)
9 l' T6 k7 w- {9 C( |6 U1 E' |8 @ {p->flag=0;
) [3 U8 T! ?1 n% K' A3 Y h count=0;! A0 d; e0 V) d% K- Q8 z' y5 \1 ]
sum++;}
0 c1 { l0 \+ b# l5 I! d. _6 J if(sum==M-1)
) B3 S! ?% s ?9 h5 k break;% p# Y! W/ x+ k8 L
p=p->next;
4 s0 f, d c6 q; z9 C$ u! L }9 e1 {: |* }% i8 d: B. U. a0 y
p=
9 p4 b7 Z' _: b& l" s head;. O/ N4 ]: d; Q7 M& D
for(i=1;i<=M;i++)
1 p+ r; P: r) b, K- ]- j { if(p->flag==1)& I- `& D! t- e) B' I
printf("\t%d",p->number);
' B6 \2 @; Y5 g' G& _0 j p=p->next;% |- O" l/ J) M( H- r, O/ ^7 |
}4 q5 E$ y$ f* k- j9 A- i* @
6 _& ~3 v, G9 \
: Q. r7 o) U7 O7 t' O: [" q. _
+ v2 U( ~+ H& W} : @, F) F% `) w/ l8 k
第二种方法:数组% R. G& V4 K, Q2 M2 c3 {, T
#include<stdio.h>
- l! I4 [/ W8 n0 s#define M 8
6 g8 F" b' e% v. r6 Astruct monkey
! p1 M7 o+ Q7 j& i e% N{int number;* C" v V& a G* t% H8 p" c2 _
int nextp;( u4 r' z# i+ B4 g/ I4 l$ i
}link[M+1];
6 S, H9 S4 l8 { i# W9 W' c2 H; ] u' K1 @" ?* g! i. a4 b
void main()3 Y9 h8 I2 b& R1 V/ {$ X
{int i,count,h;- X# C* t) C/ }: u2 M
for(i=1;i<=M;i++)
0 Q$ T1 l, ]9 U6 A: Q6 p9 ^$ x{ if(i==M)" g, ^( N) X% p5 K" |$ i
link[i].nextp=1;0 ^5 |5 s& o9 w: B
else
7 ^( n5 o, k! v; [" A link[i].nextp=i+1;- q' l2 D8 ]3 W+ ?( w9 v
link[i].number=i;
X) t2 \8 E0 P+ r- o5 Q3 I Z} q: O. f" `. U* G( N: w
printf("\n");
* Y" L* S/ {5 Y" w3 mcount=0;
. V4 g7 X! A$ gh=M;
4 ~; Z5 p3 {) N/ a+ N/ K; zprintf("依次退出的猴子: \n");
2 f) O: {& q" j" @8 |while(count<M-1)
/ X$ ]: Q6 f. _+ C3 K8 ]; R{i=0;0 {" i& ~1 h. `) R4 H
while(i!=3)% H5 P4 H( t) q+ d/ K3 `4 @
{ h=link[h].nextp;4 y! g$ V3 k x ?$ \6 S
if(link[h].number)5 S$ H( c4 d7 E6 @6 x4 X( x
i++;}/ W, X5 q, [) H! T* S$ G5 k& N8 r
% r3 i6 Y& A) c: R. R( N4 ?6 g: nprintf("%4d",link[h].number);
. [6 Z% t1 n" X% C" O( P( d Ylink[h].number=0;
5 j' v/ _! p9 z8 `7 ^4 ~$ B# V% d# J5 icount++;: [7 t, R8 S, y! y N+ ?' S; x
}
0 y5 T' Z; ^1 n
0 K" e+ n/ r& n2 y0 X7 E9 y+ Lprintf("\n大王是:");" c3 r. o; v1 ~% w/ d1 x) V
for(i=1;i<=M;i++)! a$ t4 b+ x2 Z* x$ z) f3 H
if(link[i].number)( @# ~- \* e# g
printf("%3d\n",link[i].number);- l' h& ^# q% k
3 }5 i7 G, b" M, o- v8 ]9 x
% ~( i4 [2 ?5 L4 [# j- I}
% A, \ q0 \+ H+ L0 @; L第三种是普通方法for循环3 k% z$ R- f% d9 |
#include<stdio.h>
: J$ F2 T" F; a( b# Q+ Nvoid main()
8 [) j' U8 p5 J5 |9 D( f{ int i,k,m,n,num[50],q,*p;
1 D/ M( n# s2 @+ p/ P2 k clrscr();
" [9 e7 J! t( a$ b printf("input number of person: n=");8 y) Q" y( b/ [2 @. _. P3 U4 P
scanf("%d",&n);
# w; }. T. K7 Uprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只2 V* h. L r( [) x3 ?- k0 z) L
scanf("%d",&q);8 f2 Q0 C& n+ q0 B
p=num;" M- A9 x+ F- y Z- P: v4 |
for(i=0;i<n;i++)) T4 S4 K' ~! D( f7 o y/ G
*(p+i)=i+1;1 @% ?! W; o5 S1 _! r2 A
i=0;0 {, h! p5 q. f i9 P
k=0;- Y! d+ F2 t- i, V! D: n$ a
m=0;: `6 J y/ T& m$ M: L2 X
while(m<n-1): _5 K8 J1 K8 Y/ ?# H% T4 M; Y8 ~
{if(*(p+i)!=0) k++;- |& c( k# Q9 e! R j
if(k==q)) |" d. P. K% T( Z5 Y; p
{ *(p+i)=0;
0 z. @& q, |$ W7 s$ l1 v3 f k=0;
# ?4 ~5 L; V2 `1 z0 ~9 m6 ] m++;$ t' c& N% l( ?3 n
}
- f2 s, a# t! ~+ l" ?5 d i++;
' Y, m. a" l" D7 J if(i==n)i=0;& H4 k. z1 v$ q' Q, m/ W# a$ }$ Y
}+ W$ `5 ]1 N* y" ]/ W
while(*p==0)p++;: `2 u$ |3 x2 j/ p# U
printf("The last one is NO:%d\n",*p);5 Z( ~5 l& m$ s, h) `3 @; Y+ h
getch(); g4 r& s% G& G1 A s5 i
X* k' r( q, J} |
|