|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!5 b! a9 A! _8 o5 c
这几天我在忙着编一个问题,我用了一种方法编出来!
; B5 i) e( z: ^* y$ f但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
/ F# x. K+ [) @# w% v; T注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 4 l) t; B- k7 e! H; ] _4 i. Z4 m
' i3 {$ l% [" {; \# {# v- ]
: _( [7 K& A# v O. p L) k+ ` 题目, S0 v# W8 @7 f
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。1 \: X- k' e' k% z4 R5 U
第一种方法:利用循环链表
& e/ t" L8 C0 E; a x( Y#include<stdio.h>
; X' H' b1 z X& a#include<malloc.h>
9 n& S* @* P8 q& Z, [1 w$ x1 x#define M 8 //共有8只猴子: t: y# N% l# d
#define N 3 //数到3只时退出第三只
: _8 ^( K7 O: P5 R. V7 otypedef struct monkey- f6 f+ s' z+ P5 Y$ F; Q
{int number;, Q0 b* A) v4 a; z( f1 I; Q
int flag;
- Z% r& R+ E9 M6 `( V: Y3 Jstruct monkey* next;
& Q0 R; X" l1 T5 l# v4 _}MONKEY;4 `; d( h) M* Y( `! ]
main()9 j) X$ o/ `+ M1 B+ U: {1 B" X
{ MONKEY *head=NULL,*p,*s;# D: R9 f% [9 C+ u5 [
int i,sum=0,count=0;
2 x% j6 I3 I% I Z) C clrscr(); //清屏
3 I! ]! x7 k7 q; r! v p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
5 g1 H( ]8 G( `& [" P4 j' E+ v, m p->number=1;p->flag=1;
) U2 {, E0 J; |+ }' f p->next=head;, P0 _; E4 L; Z. D- l# ?
head=p;# y! s& ] b! i/ s3 ^8 K
for(i=2;i<=M;i++)8 Q. y- ]1 `- \0 M7 V
{ s=(MONKEY *)malloc(sizeof(MONKEY));
$ e7 G8 B# ~" _ s->number=i;s->flag=1;
' T6 z3 E. v- \0 ]" f4 O s->next=head;& \ \" F" I4 v6 b
p->next=s;p=p->next;
. S* |, s% ~9 F; ~. c# o }: u3 K9 F t: s) B& f+ `
p=head;
* t$ s- d1 J* g T9 C2 {: a for(;;)3 |9 ], E0 N+ }$ v$ r7 e
{if(p->flag==1)
0 x6 G$ O1 o: V$ w5 H0 k* H* q count++;
& D9 M9 T k: ]& a( T H# J if(count==N)* F9 l% ^& B7 b$ G
{p->flag=0;2 t2 e- L: r1 h- k9 F
count=0;
9 [* Z8 U' a5 q8 l' Q; x sum++;} y% `7 I* j0 `7 S
if(sum==M-1) y+ ~& W: {. }( i' u% t
break;9 Y4 r' Y ~6 c1 c2 R- L- M w
p=p->next;9 x/ D* s3 C6 |3 C8 W6 n9 u: `0 x5 @
}& s6 ]# C* V$ U8 H* |& ?
p=4 [6 k+ |( I0 w% k5 ]- P; U G2 Y
head;
7 r! B/ q" B4 @, _5 e for(i=1;i<=M;i++)0 w3 \3 r% T- S) n( @
{ if(p->flag==1)
; O9 v5 }2 U; y B5 d1 G7 Y printf("\t%d",p->number);* c8 }0 D t0 d O' ?5 \3 Y8 I
p=p->next;
4 V4 G2 v: R9 e5 Z1 d$ H! V }( n7 L+ J( _, L7 M( c
) f! S: \0 B, q3 B% N; r8 x- l+ M2 M8 ]6 M! {' W5 y5 r2 @* k! b# x# C6 d! y
; R8 J( y# e# P. b}
6 K/ @0 e) u( O, Q第二种方法:数组
8 d3 w! s0 j/ O& n#include<stdio.h>; _" x) }% H5 C
#define M 8/ r. Z0 i9 d1 k
struct monkey
. g7 v7 O9 w' ~/ w( @{int number;; N& R. b- F) U* g$ K; |# z
int nextp;
5 x6 B& K# r8 P! Q( I6 H4 s}link[M+1];
# T6 D1 B0 e' T7 z
. J* O! L: _' a4 d: C' i8 Yvoid main()# D$ d5 ?3 E0 U: K; P0 I. p3 {
{int i,count,h;
) M5 u6 u+ W R: w8 Jfor(i=1;i<=M;i++)
+ y1 C" k9 y" a: _( [- M' `- _: Y' l{ if(i==M)
- M# A8 ~- Z Q! J0 w link[i].nextp=1;
6 U# T7 Q' @1 ^$ f+ J7 }; } else
. B" ~9 J( M* W- Q4 r% f( B1 H1 B link[i].nextp=i+1;6 d$ u+ h6 |* U* e+ d8 t+ l; I
link[i].number=i;
4 A4 N9 J1 N( t/ S# }- o4 b}
+ B, \7 q# M: m4 aprintf("\n");
* g$ \' b, x6 Ucount=0;: V) q; [( m- `3 h: p3 v
h=M;
; j0 y' i4 ?$ _printf("依次退出的猴子: \n");( Z0 p2 l/ S1 k7 |- _6 D& |
while(count<M-1)6 e! i, t2 r+ z& v: [
{i=0;
1 C4 I! j* R1 ]6 l6 U5 o- kwhile(i!=3)5 ~, ^* L& K5 K1 O" b+ t+ F
{ h=link[h].nextp;
- R& k) C$ X0 x: `7 `4 \! n if(link[h].number)) y% h- O$ S# a
i++;}
1 k2 x9 G" F9 r. ?- Y3 _( U! I, {. w
' }% ^. k& A! v L6 D: n5 u- xprintf("%4d",link[h].number);
$ `, Y; o% B/ t7 ~' tlink[h].number=0;
; p4 z# U+ c( n4 g" I( D+ |count++;
8 J4 q4 T5 q) l* N' C}7 a! N4 l& J% e4 b: E8 D
- E% t' n- Q h; z2 X* d1 s6 T
printf("\n大王是:");, H) x% q5 I2 q3 A% P: b0 b! v
for(i=1;i<=M;i++)
6 }4 @ A; r8 e if(link[i].number)
0 J* i n* P. l$ Y* c G) R printf("%3d\n",link[i].number);% z' D* E( M# K
* z* G8 d( s4 j
- n' Q5 B, `* D& U} ) d- F3 E$ d/ i- r; ]
第三种是普通方法for循环
% ~; O: \* F: q+ ?( L% A#include<stdio.h>
; r+ M3 o- J- d; l5 X' A" pvoid main()
7 Z9 \1 F" w+ V, f# F{ int i,k,m,n,num[50],q,*p;
' `1 M: m- Z9 m+ n clrscr();2 J( H0 H, K) Y
printf("input number of person: n=");
9 p$ e" D9 x& Y6 G scanf("%d",&n);
% f7 ^! T b, |printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
& R4 A& ]2 r+ f) C% j8 D$ O. w/ K4 y scanf("%d",&q);4 K" G4 b0 i3 V- {$ }: v
p=num;
4 s" G, V7 I4 L) w for(i=0;i<n;i++)& x& K' m4 Q; Q \% @
*(p+i)=i+1;2 V* z5 ~5 `) r) z ^ Z8 g% ]
i=0;4 \/ A3 p8 |- J& d
k=0;
; A% Z9 \9 X+ O b m=0;
$ r8 l) g. C% V' P( [+ B while(m<n-1)0 I8 e$ f& l" l _7 u7 ^
{if(*(p+i)!=0) k++;2 J! [% H9 E8 f' |) v+ H3 }
if(k==q)0 u1 `8 ]- k0 `
{ *(p+i)=0;
' a( C# I* w" S: Y* J0 u k=0;* p1 q; [& v h, P d
m++;3 A5 D5 `; y+ s9 O' W
}
! F# o, L! _1 `7 D i++;
( C9 W$ T e5 p; i- Z if(i==n)i=0;
) _/ L. I) _/ y. `; s }+ o$ l0 n4 _+ X: {! r
while(*p==0)p++;: f8 e5 D8 y3 X2 \# a
printf("The last one is NO:%d\n",*p);
4 U% ]9 g5 E# k4 T) N; d+ Y, ~ getch();6 {$ T( k6 _9 D' S
) ~1 G& a, z' y" l9 J} |
|