|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
. }" j& B; b0 J& Q( }这几天我在忙着编一个问题,我用了一种方法编出来!
/ I$ s* s4 m4 ~# o& K; |但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
" `5 w" x& L* H- w, E. v9 J注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
; V/ p v) c, o5 d5 [8 R3 {0 n" y3 r
" V) w) q" q+ ?. Z) i
题目+ Q& E. b, e2 f& J7 g
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
0 i# Y; t0 H4 h第一种方法:利用循环链表
( v+ r9 R5 H' P; F, U#include<stdio.h>+ `& G W6 t* C7 i- ]% r
#include<malloc.h>
Z% Z; V, t; ^1 |/ [4 s4 B4 h( O8 i- m#define M 8 //共有8只猴子6 \" a* S7 s: A$ _# O6 A
#define N 3 //数到3只时退出第三只4 O, f* o! @# w9 k
typedef struct monkey$ W- c5 k$ x3 C6 N6 |2 H+ W
{int number;
+ A) D/ O: t! i. `1 F1 Eint flag;
, y) q/ a- L" Z& w7 m7 {struct monkey* next;* \- K; F$ h3 I. N8 A) ^4 |
}MONKEY;
; R' E, G0 G: t" A4 M: w# ?& Lmain()( Z" b( }- |) `6 N7 ~/ T
{ MONKEY *head=NULL,*p,*s;) q0 _5 h1 U6 V5 Z( v7 h3 a& l
int i,sum=0,count=0;
9 d2 M% J# K8 O6 O) F+ @' n clrscr(); //清屏5 J `( @1 |% E( U. ]
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存# Q, H4 z+ ~/ K, Y% i2 ?- e2 l
p->number=1;p->flag=1;7 ]! k( f$ I. D4 n
p->next=head;/ M0 ]0 ^/ W2 P
head=p;0 S/ h1 [5 B7 u& B& r$ Y: y
for(i=2;i<=M;i++)! h! G5 F5 `, [' |3 H, m/ ^
{ s=(MONKEY *)malloc(sizeof(MONKEY));2 r6 S; s, C) o2 e8 b/ X+ v! d2 {
s->number=i;s->flag=1;
! ]- a# x0 o; q9 p: y2 b s->next=head;* W$ H0 ]" B' O( i: H5 w2 X9 j2 K( E
p->next=s;p=p->next;2 r, B/ m& z) T9 Q/ R
}
0 s0 i/ D/ j, e! d% l# p p=head;6 X( ~6 a, t! S8 I# `0 w. j
for(;;)
$ q8 {/ t5 U' C; N7 z: I y {if(p->flag==1)
% ^8 v, k* ^$ t; V; ?. X! O, U count++;8 e# G2 P* Q8 Y' B! ~
if(count==N)" I8 j0 k1 ]' f; j1 _
{p->flag=0;
& c3 L0 h3 B* T count=0;
9 x& H% h! u7 q( B sum++;}
6 j: H: Z6 v/ G3 t, ]6 X" Z$ b if(sum==M-1)* x- L& i8 v0 b. Y6 x8 Z/ [4 G" B
break;
0 ~$ ]' |0 F( S4 t6 Y$ s" B/ ]- D p=p->next;6 l/ E- \$ z+ l
}
9 b6 v$ {! T! X p=
4 H: k# o7 }/ ]. W) f1 T/ M" [* e% g& d head;
, u: U* x* W( Z' R' X for(i=1;i<=M;i++)5 r5 E! V2 h0 e
{ if(p->flag==1)
+ q. h2 P; k D/ a1 Q2 T printf("\t%d",p->number);
! |8 A' e8 b! J9 A p=p->next;
& Y. ?; @7 o2 D2 q4 Y+ O8 \0 p) h }& L3 n- B$ p; C. o6 A& N& _
+ v4 o. s* \5 p1 G5 t3 z3 d* M7 S" i& U) V6 h2 }7 M1 K
4 s+ w0 T# |; M
} 0 ~& _% ^4 C, @
第二种方法:数组+ v7 M4 E4 ]0 u2 ?0 h
#include<stdio.h>+ y/ K6 f, v( n- F
#define M 8: z: d7 H. ^& A
struct monkey
! V; T6 ]- h2 d$ _, `5 u4 t( l{int number;
& x p* l1 c6 T8 n3 k7 C! ]: j+ tint nextp;: i, V$ @4 |# ~" X
}link[M+1];
0 c0 F3 ^" O0 p: X+ [ O) X! C Q& R* y" H& F3 t; ]
void main(): E, X% }5 z G9 s' O
{int i,count,h;! |# p' O5 L0 s. m7 s
for(i=1;i<=M;i++)# c% j9 V5 I% L& p9 M' L
{ if(i==M)
% F! }& A/ }# L; t W/ X link[i].nextp=1;4 @, |8 E( M& y7 t* x( @) G: z
else
; E6 J( P+ C/ F6 q link[i].nextp=i+1;
6 y4 Z, x) q+ x0 P6 e, b link[i].number=i;
" d: I7 j. p: R# I$ O}
: J- l$ |. y/ H4 r* A5 E" _9 gprintf("\n");# Q7 _5 J5 H. ^5 O: y3 [- U7 R
count=0;! N, b- P( S. r
h=M;, y5 S, a" ^$ F# O
printf("依次退出的猴子: \n"); v3 e& S4 V& m+ l% {
while(count<M-1)$ N/ H8 B4 f( b: R, A% d& k
{i=0;
% g4 ?: V" B6 @! m; k3 W8 v5 twhile(i!=3): |9 D0 z# L$ b' `
{ h=link[h].nextp;; c& |+ u# F, S$ ^
if(link[h].number)1 `- J0 V$ |/ T! H( a
i++;}4 u9 n. P5 j0 `+ o3 D
/ ~. W. [# Q4 C+ m; kprintf("%4d",link[h].number);7 \4 n" }- U; P0 [
link[h].number=0; u6 [" j! @$ c' [4 D# G, W% d
count++;
- d& j3 o: D0 E; @3 Q}
( R k: a) g( Z. K* v, v8 d" D2 H, t% I! O$ V. ]
printf("\n大王是:");
" R4 z4 ^* a, q X for(i=1;i<=M;i++)
* t0 J7 S3 ]: Q$ H+ F if(link[i].number)% ^8 `0 G9 U: x) s& @8 ^1 S' ~
printf("%3d\n",link[i].number);
) e8 }. U, u9 S* I
! {0 H. b2 J; d; f% x2 x+ ~) l+ J/ M; a% v
}
) z5 F" J$ V$ G% A第三种是普通方法for循环" t& ?+ y' A6 ?6 \& q, T) ~
#include<stdio.h>& L7 n7 D* m( a7 S G: I) A
void main()
+ B. _; [' g+ X$ p& ~{ int i,k,m,n,num[50],q,*p;
* `' _. x. W$ [* c7 i clrscr();+ t- s4 d) O0 a; e
printf("input number of person: n=");
/ q. V' U& @9 [0 |4 i1 k0 ?# o) j4 g- E scanf("%d",&n);
3 r* _) i' X' H; O" l2 s6 D jprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只2 L m) Q% a7 H; j
scanf("%d",&q);- v0 i5 p) g7 Z/ J1 C
p=num;( W/ V5 ^2 [( T' E
for(i=0;i<n;i++)
( w1 ^0 f6 [& z0 j; l/ c *(p+i)=i+1;
! H, ]/ \8 p! t9 N$ P i=0;
& y" L. \$ X5 N k=0;4 M" i! s/ Y0 r" R! k
m=0;+ n* U8 D6 U8 ~* }9 y
while(m<n-1)4 A5 M& y6 ^! A
{if(*(p+i)!=0) k++;$ Z2 A2 a$ Q9 l# m/ n, g
if(k==q)* R2 M( M) q; U& [- r0 {5 z3 m
{ *(p+i)=0;
% v8 [; G% [; ?$ A) ^, | k=0;% k5 ]2 P8 x, t
m++;% v3 }. [! _5 a% k5 Z5 |: F
}
+ o6 v& G4 g& X8 h( v5 @ i++;
* `0 [; V% n1 _$ i% t if(i==n)i=0;
( ~ X" ~: @4 m& l1 H$ b }4 Z+ M) K( d$ ~, T+ X, d
while(*p==0)p++;+ p8 L: g/ e& p* D( Q$ w9 K9 j
printf("The last one is NO:%d\n",*p);9 V5 |8 H$ Y" } l1 y: k0 }' H: F& E1 S# X
getch();' @, g% G2 i( f" \/ u2 {
/ Y) o. a" U y- |- n M} |
|