|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
2 ]' B [# S' Y, {这几天我在忙着编一个问题,我用了一种方法编出来!
2 F2 O1 e, a. _( p4 y8 ~但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
5 H4 z) @ v5 w, w, k$ D注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 % `8 |' i" S- p
& H! e4 G: O2 u! \ W) A4 Q7 x# E3 b% h( h4 z3 s+ }
题目
' c7 [, R9 k- G& Y& l. D3 ~山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
% L# t: f: k# M, \第一种方法:利用循环链表- r, \$ x. W# b- ~! d, Q9 D" Q! V( n: v
#include<stdio.h>
1 D4 c: ?0 ~! g" t L' x#include<malloc.h>
+ b% G1 w) f ?5 u0 \, l#define M 8 //共有8只猴子
* z( v% q9 x o3 N- Y$ D7 Q#define N 3 //数到3只时退出第三只. R9 o+ {: r' ?+ a, B
typedef struct monkey% `. ~$ A% s" k+ r+ O* a
{int number;
, D, C$ o0 l* O- g$ Yint flag;
$ p. W- V; J, ]9 H7 b5 l- Vstruct monkey* next;5 m, s' J7 S& L5 H$ i' p
}MONKEY;
) p5 K% [3 @) ?8 ]5 N' ~4 Y/ Ymain()
; t7 V; F# l5 e, d9 i9 ^. `{ MONKEY *head=NULL,*p,*s;# l( k8 n, o; j4 j, }9 Q( C* O
int i,sum=0,count=0;
# a: v0 |4 }+ U* e1 f# | clrscr(); //清屏
( i2 G t# J4 a5 l" ?4 a: r p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
3 T `" f0 R: } T p->number=1;p->flag=1;
* k* j1 Z& o( Q! s B$ T& `( o p->next=head;
8 u+ ]& y0 ?' h) l" x head=p;) Y7 P* K' o2 R/ `6 T" S' n
for(i=2;i<=M;i++), d/ c/ T3 I* [
{ s=(MONKEY *)malloc(sizeof(MONKEY)); q) \/ H. @" q7 ~" }
s->number=i;s->flag=1;
1 ?; Y9 N5 j1 P1 \% A: R9 d N* s s->next=head;
1 U6 {$ }2 k6 y! i* G- Q p->next=s;p=p->next;' p' x: c7 S* L5 n! z
}2 ?5 F) w/ b; a8 E) H
p=head;# u7 N3 ^$ k, {* {1 [
for(;;)* @; D% P: e" H" J6 a K
{if(p->flag==1)( I9 W8 F& B, q
count++;
; |7 z) o+ j* T7 j if(count==N)4 J/ h1 [- ?2 O" n3 U: R6 M
{p->flag=0;4 ]6 V4 [2 q( t/ _% S g$ Q
count=0;% X* w! e) _8 h# G$ ~
sum++;}
/ s0 a( S2 Y0 [: L G if(sum==M-1)# Y+ |7 @1 o! D* j0 P
break;
6 _' `; K/ z7 _) D- @; I p=p->next;
; P) i4 h4 G% ]6 z8 z& r( u8 o }1 B4 h8 D+ W$ V, @# N
p=
7 l, w( T1 D( }0 z7 T9 G: d head;
/ E& w- I# X4 t, M! T. r$ a for(i=1;i<=M;i++)& r3 I; x5 }- K7 [# V; u$ j; w
{ if(p->flag==1)
) y+ g' i: E9 j0 l printf("\t%d",p->number);
3 h' I. T' e) S5 a5 R6 B p=p->next;3 u0 g5 c: K& F% V2 J+ z$ z! B4 q
}* I6 w4 r8 c4 J; F; `2 {+ i
& j$ o P. S, L2 e& K: d% m2 R1 e# M# s9 ?
3 e% h4 j$ H' U X! g8 @} K5 E) K. a. j& s" G
第二种方法:数组! J; H! Q2 k8 |/ M2 F
#include<stdio.h>
, _5 b$ G. x ^6 x" i#define M 8
6 u2 y+ p5 c# k+ G; v3 cstruct monkey
! K: n' e/ W4 f7 S9 p) k3 K) u' Z{int number;
( S) I; R5 d/ P2 O4 v9 h& zint nextp;1 H( i& ]5 v3 s; S4 P5 ]: M2 x3 `
}link[M+1];) D3 W: X) I, N7 v
# I1 m2 R4 Z6 [- t$ q3 n. ~* \
void main()4 M2 B* U6 u, L2 F3 K
{int i,count,h;
3 d! V: {# P% u; k8 o1 Ufor(i=1;i<=M;i++); B+ ]6 x3 j5 g) V7 A) T |( @1 N
{ if(i==M)) b8 O" I6 y7 k$ e) p# C. {& ]
link[i].nextp=1;3 [4 J3 m3 j7 p. h
else4 m$ P( ^$ X Y! {5 b4 l
link[i].nextp=i+1;, [' }$ I2 z+ Y6 A# v
link[i].number=i;
: N$ v+ v* r$ T" ~! f* D}2 |8 ^& O4 Y3 p& c
printf("\n");
7 \& x3 m& z, B: tcount=0;
% |" x( T" `: m; P4 Y: w9 Gh=M;. C- `2 I$ L. U; P' h
printf("依次退出的猴子: \n");2 ^ d9 x& m1 x# Q1 V0 Y
while(count<M-1)
: c [4 I4 C: m+ \* y0 U' R6 r{i=0;
# D/ x3 u% m7 M; iwhile(i!=3)
; W3 V8 h; ?3 ^7 H; E: I& d{ h=link[h].nextp;
- |, W$ J' z& }7 [ if(link[h].number)
`. I& d1 ` r. c. N4 { i++;}5 t. L3 U7 \% s% ~/ Q. J$ o) q3 B
! W( `. f8 A# pprintf("%4d",link[h].number);9 _6 O* a8 h+ A/ `
link[h].number=0;
% u$ h! P1 g. {+ q4 X( Dcount++;
5 A& _! I+ D! G. k; @, A}
" m; Q3 r! F( G, f3 I9 x
$ _/ B" P4 f3 n m, c7 E6 }printf("\n大王是:");* r: u0 X) ?) \) N: H
for(i=1;i<=M;i++)
K2 K4 L3 z+ I9 m: B if(link[i].number), @0 N( M* T; x: ?4 n& f
printf("%3d\n",link[i].number);: l- i z5 ?6 h% Z& s( C
+ l3 D( m2 a: k7 @
2 J" ?3 e$ e- W6 R# b5 k} , m' Y* r% B/ t! }: b2 w
第三种是普通方法for循环
: _: h' U, A8 @( f$ `* {6 T. `#include<stdio.h>
' I4 f2 q3 \, b! n6 svoid main()6 m! f3 O' z0 M1 [% @
{ int i,k,m,n,num[50],q,*p;
/ O, M! @& P* i. h/ g- n8 o3 s clrscr();
; I; }0 |/ U1 l% [: I; p) D/ R# F printf("input number of person: n=");( `/ r& L* X$ o
scanf("%d",&n);1 e4 \4 b# N9 g4 g
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只: B2 E K# A9 u8 t
scanf("%d",&q);
- n4 L) h& j+ O p=num;' L" E8 c! _+ V4 i# g
for(i=0;i<n;i++)
- w( J. o: B3 j2 N! {1 M5 L/ @3 q *(p+i)=i+1;
- }+ k- G: w; f/ C i=0;% a# Y; E1 M3 y# h# i7 m
k=0;
8 z L! Z- m) W+ m K m=0;- h. R3 p' _8 l Y, k
while(m<n-1)6 L, D8 E2 o7 e+ @* E
{if(*(p+i)!=0) k++;
. U* G1 r8 c* Q8 }& _- I3 h if(k==q)0 p* t. e- w6 G
{ *(p+i)=0;
% S6 H) a" N; e$ }6 K2 H E k=0;/ e! f: C& d9 B; N( e+ H) |9 B! a
m++;
3 V, I5 S# }/ i3 M }
3 z9 N5 f. u% ^$ g i++;# m/ A! Q O% f: m
if(i==n)i=0;6 A, J. U! A2 z2 b1 o. x( i! I# R, j
}* o9 R* R+ @. N( [, x
while(*p==0)p++;
. Y, `4 f2 ^" Q( ?9 U$ @ printf("The last one is NO:%d\n",*p);
2 ` I, `, ?/ W4 i8 e4 J+ \) N7 ?" K getch();
( [5 G" H2 J5 H, a9 X8 j0 e$ v) L7 W5 H
} |
|