|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
5 W1 k6 T) e3 N& R% c# y这几天我在忙着编一个问题,我用了一种方法编出来!' x6 L, T1 X: P. s
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
& }' Y5 h6 i$ r! I$ A( F6 k" I4 J注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 , W! ^ Z$ ~7 q9 G2 ?: F
" F) P) S t. @4 P. b/ R: Z+ t0 O' i6 F+ K2 P9 k% T
题目
6 p8 j, l) ^8 @) m2 N; R8 ^山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。 [2 b( a7 ]5 d* |( ]- _. @" [1 Z% L
第一种方法:利用循环链表$ { Q' X- S% U/ a! |
#include<stdio.h>, X9 \2 X* Y/ z/ {/ j" m
#include<malloc.h>% T, f! A! N$ I9 q0 i
#define M 8 //共有8只猴子
! f# e7 S7 T0 w# R#define N 3 //数到3只时退出第三只% N4 ~& O8 _) Q* P7 g
typedef struct monkey
+ g; i" [. A4 x% b4 v7 z8 Y3 s{int number;
$ p& c4 {2 _* e! l8 }) Fint flag;
/ p4 R8 j9 d q& F7 Z6 E; ustruct monkey* next;2 W1 h5 d0 i) S/ g8 t. T
}MONKEY;! d: d2 G4 w1 w8 p1 g
main()
% U+ n0 h3 Z2 t7 F N{ MONKEY *head=NULL,*p,*s;9 d$ U: T, ~0 f) \6 A; M
int i,sum=0,count=0;; P. z3 d1 `4 D6 J/ I
clrscr(); //清屏
0 f8 u( k: ~- p p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
/ I; o" N- V4 O! @, U4 U p->number=1;p->flag=1;
# @* e' `5 p1 B p->next=head;" Q3 A+ O4 I$ T+ L6 p
head=p;* w: V3 t( {0 b: N- F( v
for(i=2;i<=M;i++)
6 T" s- A1 N* X! g { s=(MONKEY *)malloc(sizeof(MONKEY));. Y: o; T7 v7 v* J7 ~5 J0 @
s->number=i;s->flag=1;1 [" R9 w# t- @
s->next=head;
4 t& ^) \6 B% w: W$ k p->next=s;p=p->next;5 g5 l) \/ Y: F+ e$ J" O
}
8 z: ]6 ?+ w7 J- r$ Q p=head;
- J4 x S& z7 O+ k for(;;)' N4 E- y' b1 j. `6 _& `
{if(p->flag==1)! w* a3 O% c3 i6 h9 v s8 ~
count++;* G. q4 D! |" R
if(count==N)
2 f6 J- E7 n+ m1 H {p->flag=0;, w1 {* N1 B( b2 l: S$ g ?: E
count=0;
( Z* f7 ?1 t5 [ sum++;}, n. |& p5 s# F" b% j
if(sum==M-1)' o1 Q- o" @0 ]1 T7 Q: N! O
break; D s! x% J N1 \
p=p->next;. b$ j3 c) t" R/ A" _1 K! S) o- t
}
* |. A, c, E, S2 K" X/ t p=) n/ n, t5 Y4 f) n
head;8 p( _% V$ d3 j; ~% r) U. H
for(i=1;i<=M;i++)) x7 D* _/ n6 }- }1 _/ ~) l2 O
{ if(p->flag==1)
o) I1 U" v7 l* w O printf("\t%d",p->number);
* ~/ }" w; s: I0 P5 H- t( I, f) A p=p->next;
$ q, I5 F. {$ w/ K7 ]- k }& I8 G: }% v- q/ W& @3 R
6 c- }( f% T3 E0 ~) _
" y1 l1 {1 N/ C4 H" ?/ P
6 X) J/ R/ u0 k1 z. V, @} " t" K' N$ X) }1 D
第二种方法:数组
$ _6 i3 R" t$ q: n6 ~8 j#include<stdio.h>. f" M/ W: b4 B K4 E+ E# s
#define M 8
! Y o5 I* _" \+ Y! m: Bstruct monkey
/ s: p: I8 k# z) b; l{int number;
7 X3 U. N& {" z* v" ~0 `int nextp;
/ Q7 `. u$ o4 I}link[M+1];! J' M4 u2 t$ G. q2 t S
8 e2 i* C& Y4 {7 `: ?2 n% o8 c3 o0 R
void main()
( @8 }# P6 {" _! g( \{int i,count,h;
% }9 c" } _8 |7 Q" r$ M% ofor(i=1;i<=M;i++)$ ]9 [1 }. I7 O; ]3 K: {
{ if(i==M)4 s' A9 T& e5 U# ?
link[i].nextp=1;$ A% V% W' i. K" Y
else3 x3 Q% D4 c7 u* X/ _3 }& _
link[i].nextp=i+1;
1 g+ D/ A% C4 H" ?6 g! [ link[i].number=i;
% e. C2 }/ j8 }* ]- T% Z4 m}
# ?- N. _9 L/ v1 Xprintf("\n");# I8 \1 B J( | H
count=0;. ~5 ~: w) D/ L! _
h=M;* z8 X: V# \& Z8 Z
printf("依次退出的猴子: \n");
1 F, s+ F; d0 T' T4 G, T+ ?# mwhile(count<M-1)
1 k9 o# k3 S0 X4 J2 }( C{i=0;) ]# }5 h# G: m$ f' W# Z
while(i!=3)0 v8 |0 @" {& Q1 g! G8 G
{ h=link[h].nextp;1 W) W( ]" i6 c+ E) s6 p- U& [2 x
if(link[h].number)% s4 I9 \: N! j- G
i++;}
+ I# B$ e# ]% B4 n" ]; W
8 @: ?- s$ [' p' i+ M5 J% s$ oprintf("%4d",link[h].number);7 {6 a# Q& [$ _) g* B
link[h].number=0;; i/ j3 N; _& D
count++;% F6 X- N0 N$ }. ^5 j6 J8 m
}
2 ~1 \' b5 v& p0 r' g1 M
" D& G! j0 ^4 j# {9 P, F6 x- U$ Uprintf("\n大王是:");6 @# L2 f( x4 i# W- E7 D
for(i=1;i<=M;i++)
( V. x7 E8 R$ `) p1 f8 R if(link[i].number)
% o- ~% [& A% A printf("%3d\n",link[i].number);# L: V5 \7 N |; I9 z
( C( M! o9 `- W( t( \- i- \; K# f
- m* a6 \: @0 g; U& f" t2 h! `}
( d& z( m% @1 I7 `第三种是普通方法for循环
2 _- W t: a( C z6 Q#include<stdio.h>* h2 }( `& f& Y8 L0 f# }& F5 d {
void main()3 t& e) s+ I2 U- ^/ {5 Z" L
{ int i,k,m,n,num[50],q,*p;8 A: v* n0 t7 t: {( q$ D0 h
clrscr();
: |* ~' c, g' q2 t$ \ printf("input number of person: n=");
* B. h9 K1 r" C) b scanf("%d",&n);3 W; c9 u" p; `7 E: `$ r1 j# x# A6 I
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
7 @+ S% G7 |/ |0 _3 c scanf("%d",&q);+ Z. x" v- B) i1 A+ e6 k
p=num;/ E T! p% w3 b d# E+ P
for(i=0;i<n;i++)
* G+ S* K% l. p' s& q; | *(p+i)=i+1;
; X. ?- f0 H9 X1 G" \0 {3 U/ K( |: ~ i=0;) \5 C$ v4 [( t) K, a( A `
k=0;
, m4 o5 D# n) }4 ~; { m=0;: ^4 ^% g% K4 Z g; n; q, d
while(m<n-1)! B' R) [: I! m/ @- a, d3 e
{if(*(p+i)!=0) k++;* S$ s9 Q' S( S# Z% t& _" h
if(k==q)
, D) |" ^* l6 O. T { *(p+i)=0;
+ d' Q0 E" V$ Z k=0;
* L$ S) R: d4 U9 S m++;
7 O0 Q# N5 G c) z5 |- i" X }
9 e5 x+ P+ f! A6 A5 r# R) b i++;3 p* ~8 t- V; _/ y& P1 o8 _
if(i==n)i=0; \# u( K8 R c) g, \5 }
}
4 q; x6 ^8 @5 r4 t while(*p==0)p++;
# [7 T% l, N% `3 E. J printf("The last one is NO:%d\n",*p);
/ E+ `& Z3 @6 `# k getch();: n: M3 y8 ^3 I' p X
6 M# f# n6 @& f
} |
|