|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!* ]2 Q9 ^% o- T
这几天我在忙着编一个问题,我用了一种方法编出来!7 A- k' w* h f& A" X( [
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!( F. J$ b7 {5 F {7 J
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
; x2 u, G% f& @. m2 Q4 a$ h* \$ O8 A3 w5 g& q$ `* {
8 V# Q- o# u8 ~5 ^! k
题目
, z( ^" @( t3 n3 d- q+ {& w山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
, ^1 h$ l. X5 n5 _! g5 N第一种方法:利用循环链表
9 h2 T+ l9 c. B3 q4 w8 Y#include<stdio.h>& B! q. }; T9 O0 u6 l0 M' \, P" A3 `
#include<malloc.h>! q8 s! K6 @8 \1 H4 |* d
#define M 8 //共有8只猴子2 d% u4 j3 q, ~! y
#define N 3 //数到3只时退出第三只: |7 A" A1 Z, G9 O
typedef struct monkey& h- Y, D( M: E. x- i
{int number;
& f& h. X1 _, J9 W b/ Rint flag;
: |' C# G% p- ]5 }struct monkey* next;
4 S6 H) |& E: o, ?}MONKEY;
) y1 S; I5 |- @8 B2 _main()
}5 c( I$ q2 y3 z7 d- i{ MONKEY *head=NULL,*p,*s;
8 e) f4 D7 l& } int i,sum=0,count=0;4 n- ]' K* g! t! K
clrscr(); //清屏
4 n5 a# L- F3 \8 j8 ^0 ~ p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
& _. ]! f8 P) e p->number=1;p->flag=1;2 t; F3 w+ {" D: G; x
p->next=head;8 G% `4 P- z' c- f) S2 W- @
head=p;+ b9 w# b }5 ]7 z" i
for(i=2;i<=M;i++)% q& B/ g X9 T A* w' c: K
{ s=(MONKEY *)malloc(sizeof(MONKEY));
) F" P4 U& d, A2 I# k s->number=i;s->flag=1;7 q. @ r/ j5 [0 S2 p; f g6 p4 G/ N
s->next=head;
; ^8 W, g* c2 \* d- h6 ~ p->next=s;p=p->next;) \) u3 {- y; `* b- w
}
3 b. ^1 D A" T8 B5 E7 A# U& i p=head;
: m2 d6 S4 g5 A/ w for(;;)
! g6 \/ V* P0 `4 k5 ]( E% B {if(p->flag==1)
! \: |8 H% h& S" D9 J; G/ D, ] count++;7 e0 C3 r5 U3 G5 V" f* F4 r. Y
if(count==N); B1 I5 Z9 f& m# z, ]
{p->flag=0;1 j( o* G% Z" t1 J6 t) c* ?5 g5 e6 z
count=0;% A$ `4 l! O; S7 F! r; O
sum++;}
G. b2 t+ X' ~" ]/ n/ \ if(sum==M-1)' ^6 J8 v8 |0 i& _; ~
break;
- e3 A& C' V) o p=p->next;4 w3 G9 R" O* q4 _0 j. A
}: x5 M: f! E9 A2 Z% Q) b" A
p=
" |' D. k/ g0 P9 ^. d6 k head;
+ ?- m9 A9 I. e+ e7 U for(i=1;i<=M;i++)2 J6 _7 `9 c$ `1 z* ^
{ if(p->flag==1)
- o( e' B) M* P- \/ e printf("\t%d",p->number);
5 Y1 Y c B, g; P$ [ \ p=p->next;- c, B/ W1 C% }! A0 E6 t6 v
}
6 }" X0 X+ z) F6 `% x$ C- a+ P1 v) `6 s7 {9 _
3 P9 o! ]- M. d1 N/ U! @7 ?
8 o4 ]5 D$ V, F: g, z+ B9 ~2 w4 U, w} : j/ G- M+ D/ M: x- a% @5 b
第二种方法:数组+ G8 ^! z: y' F3 x: P1 R' h
#include<stdio.h>
% |% f; w) N6 h, v" u/ q5 T7 L" x0 s#define M 8
& P) W, E( Q( k" s3 i; Astruct monkey
0 [2 y9 I, n$ m6 b( g{int number;
, ?( ^& ?! I! ]/ u# _int nextp;
; H- A5 d. D) R6 p! M' b}link[M+1];1 L+ n, T3 Z; p2 @
6 I/ v3 L* G( ]1 g
void main(), G q0 |$ |. m5 }7 c; f6 x7 r' `
{int i,count,h;
+ w" k% A) r) [. U0 u8 `for(i=1;i<=M;i++)) b& _# n7 @6 u3 v+ X& a: h
{ if(i==M)4 L$ o% J( C. D2 ~
link[i].nextp=1;" |3 | \, s" e9 }
else7 [6 ]% ~ q" \% s7 {
link[i].nextp=i+1;2 J5 M& p y4 G. Z8 U! I
link[i].number=i;
% O$ P6 l9 ~: N5 I3 R' w} G% t, @9 P# w8 w
printf("\n");
1 {" G$ J) y3 Qcount=0;2 Z5 `# B( z$ L+ {0 s' ^4 D
h=M;
* _6 [, j, J, {2 B: D: Y- {& | n+ Oprintf("依次退出的猴子: \n");2 Y( x# U# t8 j* J2 Q
while(count<M-1)3 @; @3 s' X* [& ~ D4 q# o
{i=0;
. B# Z* m. |# z% t# L2 z0 a( D# Uwhile(i!=3)
2 o" T7 C! Z# \' j7 l{ h=link[h].nextp;% e" E% ] S9 W; l$ p$ K, U
if(link[h].number)
$ _3 `# T( u1 |1 e! H i++;}- z" \+ f3 Y2 I8 L! d: P9 J; [
9 d; s1 z8 g& E6 H
printf("%4d",link[h].number);% c2 [+ u9 _! s: h
link[h].number=0;' @. i; D# |9 g0 R) K3 @
count++;
6 W* ~: R$ d; p}
! @ n# S6 k: y3 e7 J; }$ q
/ u! }) e( u$ x" zprintf("\n大王是:");
( G0 R0 ?: K& m1 t$ S) e for(i=1;i<=M;i++)
1 y! ^% a$ ~& R) |; J; p if(link[i].number)# Y' t/ h% O- C3 J) s" |
printf("%3d\n",link[i].number);# r- U% m# b4 A" T* X
; w# M" h) |: ^2 I" M: }/ S! K1 u$ x7 s4 i6 J0 X
} . Z) j8 }7 i1 k! w
第三种是普通方法for循环
/ |2 n+ m O3 v#include<stdio.h>) A4 P' W+ `5 l
void main()& t7 u- i: ?$ `2 O7 }3 w- |5 _
{ int i,k,m,n,num[50],q,*p;
' T! f; P( | s. e) ^0 E- M clrscr();
5 R3 F' ^$ v) @# a/ |, E printf("input number of person: n=");
$ N8 J6 z' \5 Q& A `5 e2 L# O5 z scanf("%d",&n);
l$ e' M% F+ { s8 \ c z% B5 |printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
' S7 M* K( o+ L u scanf("%d",&q);4 ]' K4 p/ t+ o, F$ i5 E
p=num;
8 L* G. [' y6 s* K9 p for(i=0;i<n;i++)
/ {1 x9 N* [ t- s% M$ B, g *(p+i)=i+1;
* `8 ]; x8 y1 J+ p9 X9 x; V* z" V7 r i=0;+ J8 I n: A' g g
k=0;
5 y% L! d; D* Y m=0;
8 h- o' ? O. v+ X; _/ Z; h, g while(m<n-1)9 A2 U, B" E9 Q J
{if(*(p+i)!=0) k++;
% _; y( U/ X: S if(k==q)
: z# l J" m! w$ Q4 {4 b { *(p+i)=0;
- ~! |) h5 H7 O k=0;
( C2 ?2 K+ Q# V5 Y+ F& q m++;
8 v) ^; C* {- [6 {" Y" V( O; y }7 h# s! o7 z7 ]
i++;* U/ }& L6 n0 R' Q( P5 G( F
if(i==n)i=0;
! q, Z; @! `* E* S3 T* s }7 Q I$ T z5 J
while(*p==0)p++;6 l6 O- F! ?' p
printf("The last one is NO:%d\n",*p);
3 ]. T& [& a7 R5 H4 l u! d: p+ r2 i getch();
5 ?6 w7 P3 {/ y V
+ G, q+ _4 t" ]% G/ d/ ?5 |} |
|