|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
; t) e s- U) t6 S1 |8 M: {这几天我在忙着编一个问题,我用了一种方法编出来!
. [. u$ @8 T* c0 \. u( P但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
* B: y) U3 f4 ^6 C( P) I, @注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 4 m' c1 h. m) _! W
' Y; M" v( J9 U# ]) n/ z% r2 c5 N# P7 q8 J
题目
$ a, [0 M2 W+ t; f; i: o) O5 p! _! @山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。" d. @2 M6 d3 x+ C( ]; Y
第一种方法:利用循环链表
& z1 w6 [) p3 W. {8 E4 @#include<stdio.h>
5 B! ^! _$ g+ u$ x% E* t8 y1 X/ L#include<malloc.h>- U2 y& `1 S; H+ M7 m/ J+ n
#define M 8 //共有8只猴子
% q( a# B/ T/ z# A: t#define N 3 //数到3只时退出第三只
( O$ s1 O8 r8 t0 v+ s2 ktypedef struct monkey- n9 R4 @' J* d' L _, T \; L
{int number;
: ~ Y: W k8 pint flag;
& i2 r5 X; T( g2 T2 _# o0 H( dstruct monkey* next;- u8 ^7 G9 a3 g* O1 a. V7 b3 b
}MONKEY;
7 w0 C3 ~# B( n) T) h ?( c1 qmain(). |' z( D, u' d9 v
{ MONKEY *head=NULL,*p,*s;
/ t7 H6 h+ ]5 u% x7 d: ] int i,sum=0,count=0;" U$ \6 `& K" j9 ~% h
clrscr(); //清屏" N9 j" O4 g$ U' s# G, f. i
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存. W( i* i4 F1 c2 m4 i! X
p->number=1;p->flag=1;
' ]. l" q) W( o p->next=head;0 J4 H- O8 o/ L. h' ~( t! A
head=p;9 q, v8 ?8 {% C7 H J/ @& |
for(i=2;i<=M;i++): w( ^" }/ z" a
{ s=(MONKEY *)malloc(sizeof(MONKEY));0 A# Z( g \" ]6 r
s->number=i;s->flag=1;. D3 {' I3 i% e) n
s->next=head;. {2 o" T+ {$ U# P! i" O
p->next=s;p=p->next;- b" j j/ K1 o* q' I
}% l6 `1 T9 W, j
p=head;
# \1 E- ?7 p# T3 o3 M3 o' N for(;;)% i, ? B. t! _# D) A
{if(p->flag==1)& o6 e" Z* p& I+ M3 y! V# ~" h
count++;0 {- D& m% f% N5 T3 |
if(count==N)9 l( j: L$ ]8 _8 ^9 Q4 c2 w4 V, F& u' H
{p->flag=0;" e" u& ]* p/ ]$ Y- I9 u
count=0;
* [- D7 ^0 i5 W- m" ] sum++;}. m# f' `* y" U' M+ f
if(sum==M-1)
5 q: F' V$ T- H- |( p8 w) r break;8 V. |' h) y2 R3 A: d. N9 E
p=p->next;
+ h) S j% W7 v& h% X0 D }
7 m4 J# ? o' v5 X1 o% l p=$ U& m( }8 U) o- k% K% F
head;$ t8 P& e% D9 q9 O. c( j6 w0 n
for(i=1;i<=M;i++)1 g0 V/ \3 z( O* o; m" U! I
{ if(p->flag==1)
2 X# X. [1 _ f printf("\t%d",p->number);
# h @1 O) S0 j! { p=p->next;
1 g! \8 [7 b& u } f1 r5 K4 N8 S( ?6 n
% q" s; v( K3 Z
3 {4 P9 ^0 W8 @. M/ I2 R
4 @- ]9 v7 Z% q) Z8 [} & }& r& W e. O7 n* Y
第二种方法:数组$ |' F" [" ]. t# i
#include<stdio.h>! R9 a! v1 W. E& [+ H" `" }6 e; C% U: g
#define M 8
- o- x9 @+ u; S) }/ Z, [. Z- Istruct monkey
' W# b K" Y7 [ d4 ?{int number;- i" ^" U$ ~+ b& v! s
int nextp;$ W ~+ e$ f' P( L% l6 R0 d* n
}link[M+1];
$ P# ^* I7 C8 o3 t
, g6 z/ x9 ]6 S6 Z, tvoid main()* @0 ~ G% v6 I8 P
{int i,count,h;
4 U/ u" l' C6 t$ v# Y+ Afor(i=1;i<=M;i++)
7 ]! J$ {$ p1 v/ @{ if(i==M)6 Q+ M: ?1 b$ D
link[i].nextp=1;
+ Q# r: C8 c! s! M else' d E8 }7 C3 X' \/ K
link[i].nextp=i+1;& C' K. ?/ X9 u! u2 H7 i+ ?' W
link[i].number=i;
$ G: t4 O; H" v3 V# Y5 a}
4 J0 x5 n f) y$ @. `9 Eprintf("\n");6 G' Q7 _ Z, j4 ~6 a# f
count=0;( P( U+ f- R4 n. Q( P+ Y
h=M;
4 T9 \/ b: y' s- y+ }printf("依次退出的猴子: \n");
9 H: Y+ F$ y+ Z: gwhile(count<M-1)3 s3 @! p: M9 x9 L& i& O {
{i=0;
$ ?4 ^; g3 |, v6 k, w# Vwhile(i!=3)
7 ]8 u- r; I, s$ K$ d1 U, h, k{ h=link[h].nextp;* E# \! b* P9 P8 A, L' m5 Y$ n7 T
if(link[h].number)0 ]' K) T1 g% P( r
i++;}
6 v$ [1 L$ }& ], L; d9 e& N0 t4 [7 Z3 Q* t4 h7 O
printf("%4d",link[h].number);9 `/ L# p6 Y5 Z# W+ k
link[h].number=0;* a: C" V' N, H4 L' E2 Z) O) ]
count++;1 p7 U6 n" w; y; @2 _$ X
}
; X5 R; Q; C' Y4 Q
: x& ^5 P8 P% ]( u( Q' u8 d/ w* N$ I( L- Qprintf("\n大王是:");" G* W- ]4 {3 s! F: S
for(i=1;i<=M;i++)
4 | F# T8 V# y7 g5 S if(link[i].number)
) s9 n9 ?( q# X# } { printf("%3d\n",link[i].number);" R- a4 _- R9 |7 ?# B. C. \
! }( d0 D5 Y1 U: Q
3 l1 K, j* O; A" s2 x: V( K$ N
}
" Z: ]5 Q4 s6 l. r+ N第三种是普通方法for循环8 n$ a% g# J1 ?. K( `
#include<stdio.h> ]8 N* w+ k# f! B- @0 Z4 F/ s2 x4 b5 w5 n
void main()
9 |6 O& |0 P* i7 r( \2 p{ int i,k,m,n,num[50],q,*p;
+ w6 C0 h1 [1 E9 C% H% M. f: o" k clrscr();& I7 b) h; A- U% P
printf("input number of person: n=");
; u, ?4 }8 o" w3 y scanf("%d",&n);
$ k9 V( C7 `2 x/ X4 {printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只0 }" Y* ]5 Q' e/ s2 Y) s
scanf("%d",&q);" ]9 k R: X, ]- f
p=num;
& c- O6 m! M5 c# }. u! t for(i=0;i<n;i++)- z6 Y9 E- @- z; O
*(p+i)=i+1;
( T3 B& Z- M% z% u$ W n( q+ T i=0;/ E7 v: T b( ~6 B' y3 U% b. t7 I
k=0;
- h$ }6 b+ b8 E; H m=0;
W, _, U8 ^: r1 h# Q+ q while(m<n-1)+ X L+ \+ f+ e1 V# |
{if(*(p+i)!=0) k++;
! ~5 @' `- t5 o if(k==q)2 U: q5 f0 H5 T: | C( F
{ *(p+i)=0;
" l6 K+ {( o& ?0 s k=0;% L/ M t6 e6 s% t
m++;* f( v" G, `- W6 q @ R9 J
}, V: [7 @" P7 T% e- b* G* S( {
i++;8 J# W$ R/ j6 U& m+ o
if(i==n)i=0;
" C. J2 ?. M, V" t* `: [( T }0 _& _ d0 c9 b0 g* y! M, b( c
while(*p==0)p++;
4 A; c4 B, Y9 f. O6 c+ c* J' W9 R) M printf("The last one is NO:%d\n",*p);( |6 P3 p7 f# ^% m0 A+ a
getch();
7 o9 g7 [. r3 w
$ b0 j! ~: ^! u: A( v9 k3 K9 I& c} |
|