|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!) F E, }" C7 E1 _ F
这几天我在忙着编一个问题,我用了一种方法编出来!
" ^4 q9 ?8 [' g' s7 U' [但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
$ a' _" p# l0 t, Q注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
6 @! g8 s3 O; S% N, C5 w/ Y8 L( g/ W1 [# l, _' B! l- r2 j
6 m4 J* P- I) F9 N" \. x# }% B$ M; f
题目& c3 @' L9 F" G' h
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。( D {5 v6 V4 R, F1 Z+ h& ]
第一种方法:利用循环链表
( K5 ]3 V. v4 J+ G7 v, V#include<stdio.h>. N+ n& `3 a' X# h F
#include<malloc.h>8 J9 D8 h9 p' m |* \+ a# y
#define M 8 //共有8只猴子
6 ~' H: l6 ?0 K3 h% V3 v1 r2 x9 f#define N 3 //数到3只时退出第三只4 B' W1 i' l! X- \; g. Z3 O
typedef struct monkey
7 D% M. l" }% z. D{int number;5 @$ [4 p' |7 Q& Z3 Z
int flag;+ e( h' b4 S! H: _+ \0 k
struct monkey* next;( R8 U2 s" `! n5 u
}MONKEY;8 M1 i4 B6 L: j+ q% T
main()% y% _. X+ ?& C! Y& s# R
{ MONKEY *head=NULL,*p,*s; X) v% z+ H) o$ C r, n' k
int i,sum=0,count=0;7 F1 d) O: V0 t" W
clrscr(); //清屏4 w; A! n! z. L% |9 z P
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存- e2 Z8 k9 q6 f" i. X
p->number=1;p->flag=1;* Z* Q. }4 N" u; j
p->next=head;
9 O0 J$ |# u) l6 A" s* M head=p;9 C# b1 c8 d) h2 G4 t t M
for(i=2;i<=M;i++)* A" k2 G1 z( g: ?$ G7 M: s3 U/ ^
{ s=(MONKEY *)malloc(sizeof(MONKEY));. \5 u9 s, ~* A0 L w& L" R. x
s->number=i;s->flag=1;; g. V% @" {7 ]' \
s->next=head;, S' a0 N a- I) q, s- h+ n
p->next=s;p=p->next;
+ g; Y+ M' R% s }* y% y. P: H5 u9 x R' t& W( E
p=head;
+ ]# C% L. Y6 x; {$ u% S9 {6 B for(;;)
5 E9 q, e( u5 T$ M# b& a* z {if(p->flag==1). q8 [: v& l( n. i% u
count++;; [! J* y$ F0 Z v# u; M
if(count==N)' ]& d4 M& D ^9 B! @1 G- d5 A# ~. E
{p->flag=0;3 q: m4 c. h4 E5 L" {
count=0;) Y% N7 k3 K- ~ l9 g) J
sum++;}
: Y# I6 j4 `- `3 v ^' K! z if(sum==M-1)
" B' P9 O. M; D% ^: f+ _9 |9 U+ M break;
! T% f- u6 g: ?3 i9 @ p=p->next;, Y1 h5 {$ l$ z( v. R
}) ~# f: h6 w/ p$ Z& z, h9 M- Z7 p
p=* g! _# _6 T9 k$ \$ {% e2 d
head;2 x* U) d3 h) ~9 P% }8 C
for(i=1;i<=M;i++)
u- ]* ~" A) X! j; q { if(p->flag==1)
; n) |' V# A5 G* _* Z% J+ f0 Z printf("\t%d",p->number);
, m; ?, b8 j2 o! y p=p->next;
, {9 G0 Y4 z8 ~' c; N }
9 L3 ]2 V* C3 u7 H" b, O
' ]$ l) e6 J4 ?4 H; V* V- N& D# o: _% y9 {4 f: E/ h0 k) d0 G
, B- D) G; z$ P# B( g4 ~9 H
}
! b9 C) u: p# w- s# C4 X* L0 P( _第二种方法:数组
8 l' Q8 h1 c9 J" \( e#include<stdio.h>. t$ Y3 Z3 u% C
#define M 8
9 ]7 a0 p- l- c& Nstruct monkey) }; V( M g0 J4 x
{int number;
9 V) N3 P% {; ]int nextp;
2 f. w" w% P' g( P, J: x# X}link[M+1];
" {! p" A& o" i: T, J' @/ m* z
void main()
) o {3 w- Z8 {! E) G* M8 c{int i,count,h;
1 m$ `& e1 k1 t, L2 Yfor(i=1;i<=M;i++)+ M$ q+ x/ v) ]& [, G. h9 R
{ if(i==M)+ N' k+ r' `0 a# o& c! D( N3 X
link[i].nextp=1;
6 E9 o! U; q, {& f" x0 ], }+ {, o else
1 g( u+ C' L' l- t" W# s link[i].nextp=i+1;
" F6 ]; G- H% |) x* { link[i].number=i;
, v( p" M& i& A' R& r+ N, L- _}
6 A1 k+ i- N; Y) J3 h; \7 |printf("\n");- R! z8 o6 |4 t5 _' W, r: ?
count=0;4 u& L) n2 f# c8 K# `4 I% l6 L
h=M;
4 A L- f% n3 R/ }; c" g" b; M8 Cprintf("依次退出的猴子: \n");
4 J& L3 i; P. i0 C. @while(count<M-1)
( n7 m/ @+ `) X7 a( `# x{i=0;! j- j, R& J. F7 n1 J
while(i!=3)
3 h7 O x6 V1 T3 D: X) O+ O{ h=link[h].nextp;
( i4 @% S7 K @ if(link[h].number)
5 n3 C+ [( K* q6 r* W k8 K0 D, U6 z: Z! @ i++;}6 `$ P& P, c2 f
$ Q1 D% m$ O* F4 [printf("%4d",link[h].number);
& E w) x' `3 f' k Llink[h].number=0;
2 {+ i6 v0 j( E# `. f- [count++;' W) K6 M. n$ ]! u; w& e! }$ c2 y
}
' Y/ e' r0 o% e
, Q# ~& t9 i) `; n' V* }9 ^3 f, Vprintf("\n大王是:"); }. w3 ~/ X% b5 z
for(i=1;i<=M;i++). t0 g5 [; ?/ u# G! U: X
if(link[i].number)
$ ^3 \7 S. T4 J7 d- ~ printf("%3d\n",link[i].number);
# K+ O. J2 S3 a- H e2 B- |5 v/ L8 U. N2 O; n& q0 n+ {1 J/ d
. N `" J/ W& K0 F3 u7 d k( O
} / t$ Z% [: y4 F, ~1 S- }/ C1 E
第三种是普通方法for循环& R6 m1 j- ?0 |2 S( I4 {
#include<stdio.h>, Z4 v* v9 ^! D9 l {! l. F! u- o; Y
void main()
+ ]1 v2 h8 N3 {* o) M{ int i,k,m,n,num[50],q,*p;
8 `1 C8 \# Z# \9 ?9 m clrscr();
; ^! m" f4 i6 e4 g+ j5 u7 p1 n printf("input number of person: n=");
* d' Y7 T% K3 u scanf("%d",&n);
6 e+ J0 n! X+ D i+ L( _printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
/ r7 ^) D; l1 p& e: g l scanf("%d",&q);
# X; w9 m1 H t/ T$ i' B: V# a p=num;
$ y8 Y3 X3 Z$ u3 T" }, P for(i=0;i<n;i++)
- ? y, y& ]$ X" a8 X- f0 o3 k7 y *(p+i)=i+1;1 V- T& X6 X" B Z0 Q1 D% O
i=0;
* a9 P. u% ?* u& R k=0;3 W* s' O! W E7 y' `. U
m=0;
& m$ y- P( c& V" a( {6 d1 t while(m<n-1), D4 Y2 \& M+ T" x# m! x2 I* u
{if(*(p+i)!=0) k++;
7 f; w- J4 o( a7 F if(k==q)) D; j6 ?1 [8 h% |$ h/ O
{ *(p+i)=0;+ j% M$ \: Z4 @% e) U
k=0;
. d; M, C# n7 s m++;# k+ p$ _) k9 q" O& u# i9 a: ~
}. C( Z( D' @: _, F# d: s
i++;
S+ K8 R' h7 V if(i==n)i=0;
" ~! J" G0 K0 x# @- j/ y }+ Z: }' Q R4 l2 ]- L3 ]4 |& Y" a8 T
while(*p==0)p++;9 r* c5 O+ f$ G, N% D3 d% q, P
printf("The last one is NO:%d\n",*p);
, e) ~9 [0 E- h) g" [ getch();
: B0 N( v) Y* J8 h6 p3 f; u" A3 p$ j
} |
|