|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
5 y2 V1 g& f4 O2 Q这几天我在忙着编一个问题,我用了一种方法编出来!" B4 l V# w& f/ F
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!; Y! ~# o6 ?5 m8 i
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 9 t `! J; C2 E$ a
; o& [1 {' h: k( i, M7 \' N' _6 J- r, E' }0 Z3 O
题目
$ h0 q' I+ W" C3 o+ J山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
: g# U* g9 P$ y/ a/ Z第一种方法:利用循环链表
& r+ m, `* s! `#include<stdio.h>% r* ~3 H; K+ s1 b( _) ?2 z0 `4 [
#include<malloc.h>
; X8 j4 f1 ?# V: J" b#define M 8 //共有8只猴子& Y" @% ^' i2 u! j
#define N 3 //数到3只时退出第三只
* i2 z% Y, C' M3 z, p0 N7 _5 A2 Qtypedef struct monkey8 R5 W6 J$ h5 X8 m" L; G: b
{int number;
9 Y) q$ }3 E* h% c8 N/ Yint flag;
0 {, F! X" \7 Jstruct monkey* next; a2 B- Y' G' }, B
}MONKEY;
+ a' {6 c0 m6 i# O& C1 ~9 g+ ^& cmain()2 S; B- u1 L/ w$ Y: E2 c) f5 q6 g
{ MONKEY *head=NULL,*p,*s;
5 Q z) {7 W* a int i,sum=0,count=0;
/ `: N' `. g8 s clrscr(); //清屏% H& R+ }9 S @
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存' `2 V/ K Z4 O1 G6 U8 ?, A
p->number=1;p->flag=1; p# v5 ~* h6 h$ j6 q
p->next=head;* \1 [2 ~) V$ @' E
head=p;
( c5 `7 q0 c6 K: b, n( E* C for(i=2;i<=M;i++)! K4 N' M6 C/ s1 U3 y
{ s=(MONKEY *)malloc(sizeof(MONKEY));
6 m& | c+ Y9 w# Y* v s->number=i;s->flag=1;; _/ ~! |: m1 a' M# ~3 H0 U- q
s->next=head;0 q1 ~' \5 g8 ]5 Y6 X
p->next=s;p=p->next;
! s; ]" k9 k& N1 P& F" { }8 W$ v0 Z3 n1 p1 S3 r' |& a: [
p=head;- W$ ]& |& Z) J% I
for(;;)
& O9 s: t2 f4 G {if(p->flag==1)
$ I/ i( H2 P: e0 u7 ` ^; c% w& d count++;' V$ J6 ^# Z: r8 C4 s( h9 n
if(count==N)5 N9 p% _) w6 j! [" h/ O1 F% F
{p->flag=0;
% S* Y, R9 u1 }4 H count=0;& _8 K' C. p. C9 k$ P
sum++;}% C1 w4 z. h( z, E5 A+ s) B- m
if(sum==M-1)3 m1 I, [8 v4 o) M
break;
( `8 X9 q' I% X! c' N# Z p=p->next;
# X, _( } `, D& @3 y' `, } }
5 }) N- p1 j0 Q- h- ] {" T5 J; s p=
4 K$ A$ y R$ f. s7 k head;+ i$ C8 q) ]$ `7 j. l
for(i=1;i<=M;i++)
6 Y% D4 N- e0 u/ q0 q7 ~! I: O& z { if(p->flag==1). |% m% p4 c4 h! f- Y: J
printf("\t%d",p->number);
+ g s+ s7 ^$ J) a8 H2 \7 Q$ N; Y p=p->next;
6 b1 [* h( \1 ~7 V7 T% D }# [# L7 S6 ^$ g( C2 ^
3 a/ E, F+ |) ]7 Q' @( Z
# \. Q% I' f* x$ w9 ]6 R
3 i" [! K; {1 X}
1 b% Y0 @% G9 a第二种方法:数组: |) c$ s0 r$ i9 o
#include<stdio.h> V6 d: i V) Y, f2 s0 p
#define M 8: h8 D- L. A, d- F7 C& L( B, F
struct monkey
3 g* ?) w% |+ g( N4 o{int number;4 Z) h) a# O# P1 T# H& o
int nextp;
9 U( C& E7 p! b7 \) h" w0 m}link[M+1];
, x6 K3 `" C' W& S; g: }2 H3 |* c$ a) b: {+ a! |
void main()! n+ @ g# H9 `7 S
{int i,count,h;
+ p) ]$ j0 l3 |* A3 r( wfor(i=1;i<=M;i++), n* ~6 z4 A2 G3 b
{ if(i==M)
* j" Q6 |7 {& L, M link[i].nextp=1;# _0 k3 L/ i- o# Z4 s
else
' `9 t# h3 ?2 G: k9 U; s+ P& U link[i].nextp=i+1;
' [7 H) N! X H link[i].number=i;( i/ V1 b9 w5 N+ ?
}
: |0 @) u1 T& N+ s- h( S2 m/ cprintf("\n");
0 O& ]0 w% r3 O+ m5 n, fcount=0;
4 m( ?5 L; |) Jh=M;
( a2 u5 F; K |5 ~; Cprintf("依次退出的猴子: \n");. e/ i8 e) U' z7 ?2 q+ u& m9 g# t
while(count<M-1)
$ u' z% V6 v1 |" v' Y{i=0;
* k4 F, e5 g5 m& E4 s: ^3 Cwhile(i!=3): u% z( B# E( f7 m9 r1 m
{ h=link[h].nextp;1 J8 V$ a- {5 p$ x+ i
if(link[h].number)% g7 L& P( _9 K, k! a+ U
i++;}% a; Z1 W; ^2 C7 B4 i8 T: Q
: o S. S! j2 Y( }printf("%4d",link[h].number);
# M0 \5 [, M3 j ylink[h].number=0;
, l5 F- L- h3 ]) y( ?count++;
% j! i: u6 U% [! h$ o}
# Q% S1 W4 S4 v/ \6 f
8 {0 Z0 o' {" p% ^printf("\n大王是:");
* t% y p: u0 p5 w" Z* N for(i=1;i<=M;i++)
# b" i/ ?: s5 h1 z if(link[i].number)9 o* D7 |2 ]+ n5 ?6 Q
printf("%3d\n",link[i].number);& A) \3 x) M! q6 E0 i4 S) ]6 ?
q, R( R" F1 P' {
* S% ~6 ^, @5 B1 t0 j}
% {8 J2 g% T- ^7 u' L8 e) L% k0 N O第三种是普通方法for循环) f' m1 x* Q2 c+ a4 }) U+ l* i; t
#include<stdio.h>( V) g5 Q) j b
void main()% k: K% \. G9 f
{ int i,k,m,n,num[50],q,*p;
0 y3 w( H, R6 H( Q% Q! [. W9 y clrscr();# \, x4 V; d, N2 f, i
printf("input number of person: n=");2 G5 _, Q$ _- F8 Y
scanf("%d",&n);8 `% K, Y! b, q2 P
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
" E: B' b2 H' J& f' l9 n8 x scanf("%d",&q);8 }( E2 J# i( |" a. F, u
p=num;
1 a0 ~0 a0 R/ m for(i=0;i<n;i++)
2 `6 e' Y$ K0 b* S, W x, ~" b *(p+i)=i+1;( f- _' | {! l! K+ Z# R) S
i=0;
7 ]& x- J T. Y6 J k=0;3 H& \7 g7 u5 z" Q
m=0;( _& y/ P% a, t& g) j' D f6 ^7 t
while(m<n-1)
* U$ V8 W, m# z& w$ s {if(*(p+i)!=0) k++;1 F. ~1 y+ o8 x) p
if(k==q)
3 i- L3 P9 A5 Z. m4 F0 i { *(p+i)=0;
, ^* D2 S# x G! `9 W k=0;6 s9 W3 I6 X; J4 U# k* c Q
m++;% a: s4 P6 t! r9 t3 Y
}# r n. N+ d: ?1 z- l m9 C" y/ v
i++;
+ j5 C! g9 A3 ~8 y L9 E if(i==n)i=0;
) R" ?* n2 j$ M! c/ Z C9 [+ u) [ }4 u5 I3 i* d4 W: W1 E) D
while(*p==0)p++;
; F* f4 Y& x5 ]: X# [" e3 j printf("The last one is NO:%d\n",*p);" L( `+ T9 z2 |! I- v* H# `
getch();3 H2 m, R: P! y k- ?' a R0 o
0 m3 A' o/ A" k, i" h7 c- _' x
} |
|