|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!1 Y; C! g# {1 n5 I N# z
这几天我在忙着编一个问题,我用了一种方法编出来!
5 e6 K: _) j4 `1 l但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
9 c: a5 l6 h& l/ l注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 " n9 {- i3 f, N# `' T p. h" B0 Z
4 M& J- |. F, e/ U& ?
; ^2 Z8 m9 W# U 题目
- v$ K. L. a9 v" }5 F/ i( z山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
0 c( J6 g3 c" X1 P" a第一种方法:利用循环链表
8 \, A) F l( ]. P0 q( Q% s#include<stdio.h>
1 m, f8 r4 Y- X) ^1 P5 q8 V$ }5 F#include<malloc.h>
9 I, X% r% s( n( o#define M 8 //共有8只猴子
4 Y6 C$ [, h- q) N# o- b. i#define N 3 //数到3只时退出第三只
9 ?+ ^3 R% E3 o5 |typedef struct monkey
. T) Q- o! A$ F( a, s; O6 i{int number;
. T) X5 |7 I4 e D+ dint flag;
' n+ q, M$ I/ Z. Wstruct monkey* next;
+ i0 o! J% E$ m}MONKEY;' m' b9 V; o7 K# K
main()
* s# u% n! I+ U# f) C/ I' c4 t{ MONKEY *head=NULL,*p,*s;
$ T; N- p+ _# `1 q0 K int i,sum=0,count=0;- w& {- ?8 z" M1 |) [" h9 R! f) A* y, G
clrscr(); //清屏
2 |- I% ?) ? p' K3 E% K/ p% B" @: T0 S8 f p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存1 q, n/ R1 a& X, w2 H- G
p->number=1;p->flag=1;8 `, ?+ k' X3 C% |: d: n x
p->next=head;
: h( @5 Z w# Z3 E- j9 n# [ head=p;
( J& P7 G! J, g6 I for(i=2;i<=M;i++)! E# z. f8 T5 w% S* B5 ?
{ s=(MONKEY *)malloc(sizeof(MONKEY));
: f1 `% @3 B% P& W3 Q s->number=i;s->flag=1;+ X/ G& J3 U5 N& T: K
s->next=head;. F# K: Q, v; E
p->next=s;p=p->next;
/ N1 I& O) o% V1 U }2 ~; ]4 Z6 |$ _, `4 Y3 L
p=head;' Y1 e9 f2 s' L; H
for(;;)! j! j3 R: d* x b8 {
{if(p->flag==1)
2 @0 o) ~7 I& ?- S1 h) R count++;3 Q: b; ? `6 D3 Y* n% t
if(count==N): ?! T8 L, S9 B* ^
{p->flag=0;5 \( ]: |& u/ v, B y
count=0;+ U9 V$ V* v! n' u2 I6 v' L
sum++;}: B3 `* G. H/ S1 e
if(sum==M-1)1 d6 u( A! r# X) [
break;9 o9 D1 D: K1 r
p=p->next;# d4 E8 E' C# y
}
7 w3 F0 H' X- o' E p=
. L$ `! Z8 d! _: o# P8 z# D head;9 A# c7 ]. e& `8 I* C/ N& q
for(i=1;i<=M;i++)- |; ~9 E, J# i. F1 {& v/ }* l
{ if(p->flag==1)3 I4 C# ?, V7 ^0 N1 z/ L
printf("\t%d",p->number);
3 E+ E! m+ j; F: R2 X$ X' N1 b& k p=p->next;
0 W! D9 r6 f, z! u }
' M( B1 x" u7 Z" P5 s* X7 R% V& H7 O! c7 q- c
$ e5 A* D) S; ?# S. m4 m# A) Z* [4 M) R7 n
}
6 c; J& Y$ K7 W3 P第二种方法:数组
6 f+ y. Y" i! C0 y6 |1 t8 _5 o#include<stdio.h> F5 V' ` ]' f. _. W
#define M 8% Y) Y% M. j! O8 |: z2 q) s
struct monkey
. h" X8 o9 j) _{int number;
0 [) }( i- q% b; s4 A* m; f \int nextp;9 F" S* }4 g2 m7 Y" C7 v" v
}link[M+1];
% @* f3 E" O0 \/ o( c% K& }
+ `; I5 W& c( |7 [void main()$ F/ @# P7 v# F1 J- H) d
{int i,count,h;4 F( M* I( w3 Y2 m+ |( `3 p
for(i=1;i<=M;i++)* N; |0 j/ \( j7 g$ x+ o
{ if(i==M)5 s7 y7 |: U5 q' f0 {* A* S- \
link[i].nextp=1;
; j9 U6 k/ I4 J8 m5 d6 B else
' `4 r) ~+ }% c% T! W) ^ link[i].nextp=i+1;% ^' f' u' ~/ B- y& H6 M+ a
link[i].number=i;
# ^% z3 n# }; Q6 I0 p! @}
+ `, V5 j1 {% H" z+ u! n8 ~" pprintf("\n");6 H6 J7 i3 M+ r
count=0;
! f4 X8 Z/ E; U0 E+ s" sh=M;
' e3 N2 \7 B! f8 x# K) t! Eprintf("依次退出的猴子: \n");1 p1 S! x m" ?+ A. ]9 K# [; m
while(count<M-1)
( @0 C- \/ Z) t6 ^{i=0;
' F9 W2 R$ h; V3 O' Mwhile(i!=3)
! K+ H! [7 H/ A! e{ h=link[h].nextp;: j/ X6 C! G( [0 U9 H8 c
if(link[h].number)9 _/ [; {& Z/ y: W/ r. E, D$ t
i++;}
- T) O( R3 N5 S/ b3 d2 M. I5 c
: ]8 H- k" E. O! O) s! @" Y, aprintf("%4d",link[h].number);, v2 ]* l8 a1 ~2 @8 s
link[h].number=0;
5 p+ A' ]% ^4 g- s/ wcount++;0 ]; p4 s$ Y5 L! k1 }
}
/ @. N. o. ~! O2 L) X" A
- Y. z7 K# m2 v3 W1 P qprintf("\n大王是:");
9 ^ `) K: T+ |2 H- p4 r# Z0 x for(i=1;i<=M;i++)
R% y& P4 r( D, a; v: i if(link[i].number)' X1 ?1 E( [. x9 G5 f: Z% P9 E
printf("%3d\n",link[i].number);# W0 X) v5 v5 d1 L3 e4 r( D
! O1 [9 s4 j y( _& g
5 w6 A! f, s$ u+ g! o3 J} $ _: a7 l- s% L# i# U
第三种是普通方法for循环$ l6 k: N r2 Q* A) c: x# ?
#include<stdio.h>* t0 M: j. j4 O1 o! l: }
void main()$ ^# O+ d0 ?# K" f
{ int i,k,m,n,num[50],q,*p;
# k: ?. r8 o A! F clrscr();
& Z8 Y, l2 z" h& i. a( M$ V1 w printf("input number of person: n=");
6 z$ h+ O \& t' S6 S9 j8 N scanf("%d",&n);
. l0 H# L! i% R4 o0 r4 b: c: T3 Fprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
0 K; z: J5 o3 c$ x' [- v scanf("%d",&q);
# { o! K; n1 h T9 g( d p=num;
h2 H+ ^( n" H2 b2 h1 Z2 v6 p0 [# V for(i=0;i<n;i++)
, i: h+ R" h7 `1 r. T; t a6 I *(p+i)=i+1; n+ b. ^0 c3 M
i=0;
) \; [: U4 B n k=0;7 Y& ?; R6 f! X
m=0;
' s% Z! v4 D. P& ~3 e while(m<n-1)
% Z) S, U. c5 Y0 [ {if(*(p+i)!=0) k++;
# I( f' A+ w0 W0 F8 @+ l6 M4 | if(k==q)
) b- Q2 o9 R5 A X+ Q8 k0 d) H6 y8 N! B0 H { *(p+i)=0;5 P# U% X5 K, B2 J
k=0;
+ G* V% X3 {" k m++;
! Y: L T$ X& i9 T- ^ }
( f: h/ t+ w. e3 G; T i++;( a5 S" H& k# @0 K) |
if(i==n)i=0;, d* x# Q0 q! H% w
}! e) W# s9 g @# ^/ }3 ?, y
while(*p==0)p++;
2 m9 V* ?- c& W2 G# q printf("The last one is NO:%d\n",*p);7 \7 L3 |3 K( _6 g$ z
getch();
& C* f7 b. b9 w* D1 k4 N: H* o5 A- j) p, N q" r
} |
|