|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
: y: C, e) t# Z8 V这几天我在忙着编一个问题,我用了一种方法编出来!
" X: N6 e% w, K; x1 \; X* j* |但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
- o* f0 Z) ]1 {注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
( T8 s' T" q8 F W8 x
' V8 D2 y4 s/ R$ \# i9 C! w9 i9 y5 M; I2 r7 {) A( g! M
题目
; Y! t+ b$ i% f `2 G& X G山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
" p+ p: g% y, P& F第一种方法:利用循环链表
4 [- W7 I3 Z! b. ` @. B2 p8 K/ z#include<stdio.h>
1 F$ |2 X: `6 @#include<malloc.h>
) A4 q, g C' ]5 q5 G#define M 8 //共有8只猴子
) w- Q( w4 `1 r" u2 ~, [#define N 3 //数到3只时退出第三只
7 y# O# n5 x2 C4 htypedef struct monkey+ ]2 t4 [9 S! ~% r
{int number;5 t: a; f; _9 c& g" |& K; M
int flag;
* u& ]# k0 u- Q. ]) Ustruct monkey* next;% o9 Y" V+ l# E
}MONKEY;
9 e, k, w4 T$ n1 j* }( umain()5 a- B4 x/ L2 U7 I, h5 M/ }6 b
{ MONKEY *head=NULL,*p,*s;
& I! D% |) o4 f# ^2 L3 K int i,sum=0,count=0;
" D+ J$ G/ a* T4 H. {8 z$ ~1 P clrscr(); //清屏
* K3 _' T; S7 Y* p* \ p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
- m, u, f% a! `* l5 z3 V p->number=1;p->flag=1;
% O. s+ N, F; ]' _* h: O p->next=head;
0 N- z) {- }1 b2 l head=p;
0 ?( y' m. |! L- m" c for(i=2;i<=M;i++)4 ~% g5 b* X! @& C) u0 j! O
{ s=(MONKEY *)malloc(sizeof(MONKEY));
& R$ R+ I; t% x; f& R* v1 O s->number=i;s->flag=1;
+ r5 c9 X5 U% G s->next=head;
* l3 i8 z: j q& p4 Z) G p->next=s;p=p->next;6 `# N, N' x. o
} F/ w1 n( Z8 p$ [2 l* |/ s
p=head;
5 L9 C( {0 f, @8 A9 u for(;;)7 d" R' L4 S7 u/ _8 R. O
{if(p->flag==1)% B* j T9 W- w N& I; D+ W
count++;
& U! E# k2 k) g7 }! W0 @ if(count==N). V# J* k1 [: H( e- {- k8 e
{p->flag=0;) Z" } u/ Y* h/ o H b, y9 h
count=0;
2 a T& m( ?" c& H% N) t sum++;}
( z/ V: M9 }* c if(sum==M-1)3 ^# q+ Q w$ F0 J* U: v1 ?
break;' F0 P- h' e" W- M% t1 R- e, l" c
p=p->next;
7 x& b- h9 W4 l# E8 d }
' i# @" d- n/ x4 @ p=4 Z5 J+ R% l# ^ M7 J
head;
$ p- M& A1 O. y( h @ for(i=1;i<=M;i++)0 M4 i4 S' Q& v( z+ E$ b
{ if(p->flag==1)
( P; z- m; U; S: w0 J( i printf("\t%d",p->number);: U$ r( [5 F2 w1 u. `* r
p=p->next;
1 A3 l* Q7 W/ ?, Q/ T }
! W; b0 I7 W7 w& g: ?
* \# t0 ^* Z- v3 N: B7 Q
3 {- M; Q# i$ t& o d$ h, a# G
' ^, X: s* B: j8 n} 4 b1 w1 q$ Z" U3 }# H
第二种方法:数组+ j4 A% l+ ~) {6 B3 F4 Z
#include<stdio.h>! l8 O8 e2 v4 P0 w2 O
#define M 8
. L, ^" h# |' e! rstruct monkey2 v: Y! F4 e" s* e
{int number;
4 k& t! ?" E8 m1 Sint nextp;: D& E" |+ z/ [" ~: G
}link[M+1];5 i8 s, P! Y0 Z
9 a9 E+ L3 @* m7 Hvoid main()
4 v2 J, `/ j9 c( s0 ]3 K; J{int i,count,h;% i! }1 ]7 ^$ `. d1 Q
for(i=1;i<=M;i++)3 P D2 w$ Y& {9 S b8 D
{ if(i==M)
: [) D1 {8 H2 n7 K; k link[i].nextp=1;
4 Z @: V7 ^1 X2 L else0 |- z% H7 u, q. r3 `
link[i].nextp=i+1;
9 m/ T+ ?: ^' }) a- x7 K% Z6 d% t link[i].number=i;8 n" a( s" t" y6 b& k" B
}
; L5 X9 k& e: hprintf("\n");
! {# A4 ^9 Y: R, k8 W7 `. _count=0;
& X7 @5 G2 C# Y, Ph=M;
) M0 v$ {6 K. h7 k; ]7 Lprintf("依次退出的猴子: \n");
0 w: V R) n' r1 E" V, Rwhile(count<M-1)
( n" q; Y" {. z6 b3 M{i=0;) P8 E" ~' T) q, R, N' N
while(i!=3)
+ N/ I5 ?/ X$ Y# t# H( S' l" H{ h=link[h].nextp;- u. q, ^5 K! n8 e' R
if(link[h].number)% h- X4 u. \, N' |% _, p$ {/ ?
i++;}
7 |: P! T: j# d0 X- m# D/ q) P
9 p$ l( g4 G4 f& G" L- F& I2 Yprintf("%4d",link[h].number);+ C" z! X. Y! V6 W. D; u2 ~4 c! g
link[h].number=0;
7 A$ Y# w0 e$ ^count++;
* R# c& J# D2 v! s}% ?9 w( L7 P* L* O, |; d5 ]* {
4 H" W( P1 ~5 ~2 ^ I& Z) X) sprintf("\n大王是:");3 |% z- v% X; Y) O0 M
for(i=1;i<=M;i++)' d0 L# r2 \: @0 E" f5 p$ C- a
if(link[i].number)
/ f7 l6 A8 }9 m! V; Z printf("%3d\n",link[i].number);
7 Z" L4 Q5 _4 P- n- \/ ]6 v: o6 I& Z+ D6 S. `7 m( c: n; _/ r
5 y7 Y. }8 Y9 L, N2 ?} ' M2 C9 h9 A7 B8 F
第三种是普通方法for循环
: z. Y4 M' ^# t- _2 H5 z#include<stdio.h>4 o% ]9 j) q3 B
void main()
3 p# L* J' }. U$ r{ int i,k,m,n,num[50],q,*p;
\* x0 K+ L, [5 H* Y8 ^* M x5 P; z clrscr();
# x% `# M+ ^; j" I3 U printf("input number of person: n=");3 K& M; R) B) U' c5 B, H% U
scanf("%d",&n);* P6 r s3 k( c; e( D, }) {
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
' b2 E- b5 O0 L, }; t scanf("%d",&q);2 Y- M* X# I9 C+ h
p=num;, ~4 V- F+ a9 _' \
for(i=0;i<n;i++): t( O/ n/ E: L7 E* K; W8 y2 T# @! P
*(p+i)=i+1;
5 @6 n: B z2 H* B i=0;" o1 J, I" f" z& p6 h
k=0;( @5 j( r1 q+ r a
m=0;
% L1 e+ u5 t, {! h" S6 f while(m<n-1)6 \% B) t+ U1 X9 ~! H
{if(*(p+i)!=0) k++;
/ ]7 ~* ]- p1 I: A" }1 W. q* r if(k==q)
! {' a) G; N9 V$ l& L c/ ]- Z { *(p+i)=0;+ w( N" x, g7 F& i, R5 o% z
k=0;
: R) K9 Z5 d/ m& Y s W m++;' W8 |8 m6 ~; P+ B3 o
}+ j, T( Z% `) m. u
i++;+ }3 [4 X3 Q$ l" R
if(i==n)i=0;+ A1 q p6 D, H- R1 F
}
& j, f# l8 }% q* F' j while(*p==0)p++;
$ |# u# D" z3 K) E x printf("The last one is NO:%d\n",*p);
# ]# h# L8 x& D getch();
4 d0 z" T; e- x" n5 W9 f3 M
/ B) {) ] {6 u& w* P6 [; L5 Q3 l} |
|