|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
7 M" \5 [+ ]1 g# a$ H; g& [这几天我在忙着编一个问题,我用了一种方法编出来!* p1 C8 x0 z3 s& q3 Q
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!) r Y, w- R! Q8 Y
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
# n; ?. i6 z) _* j5 H: J0 N8 @
# [: [2 D5 K# Q# w: z+ {4 Y. j6 d; P! e [( Z9 U$ H5 L! ?# M
题目/ \- ]% C* u, l
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。) u. f O6 i. r4 d, Q
第一种方法:利用循环链表
" R/ J- T% t$ P0 ^8 X0 J9 Z#include<stdio.h>. [" Z2 @9 s8 s" i" b& Y+ K
#include<malloc.h>8 v; u# m9 g) \+ m1 w K5 ?9 l
#define M 8 //共有8只猴子& S( r% u$ {. y) d+ m
#define N 3 //数到3只时退出第三只8 m" v8 l: I$ U! [3 }
typedef struct monkey
+ m, M- i u6 A{int number;
$ s2 U9 N, ]! zint flag;
' N) s& F* F! T4 [# ~+ [struct monkey* next;
' O; s8 B8 Q% G7 g6 J}MONKEY;% R7 F4 d% E B+ }$ w& g h
main()
K9 `5 d1 Y8 ~{ MONKEY *head=NULL,*p,*s;
/ t% [( Q. E4 f' b* z: j3 o7 b int i,sum=0,count=0;& I- `. s% A4 S( Y
clrscr(); //清屏' P$ e% b/ k' S1 n8 E
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
% ~" Q! e' P- c" P6 P* P p->number=1;p->flag=1;1 {& I8 W- u$ W$ Z0 V" K: B6 \
p->next=head;0 P% n2 e" A$ x/ t& Q4 [
head=p;
8 ~2 ?8 c0 I. A. }4 ]- M: c for(i=2;i<=M;i++)
* Y, k6 \# h8 ~' Z+ { { s=(MONKEY *)malloc(sizeof(MONKEY));& g$ N* }( D6 H" {" p
s->number=i;s->flag=1;9 z- E# K( g: L% r
s->next=head;) r! R( G, W" V2 b( j0 s$ Q
p->next=s;p=p->next;/ G3 R- v8 R8 ~7 b7 `: W8 T+ w! R
}* z) ^. z( `2 E S( R
p=head;; Z0 W' s* m2 E
for(;;)
4 u% s# w2 K: U# n3 ]% | {if(p->flag==1)) d9 B8 X2 L! W/ u+ j6 j
count++;% Y/ O" n9 M: k' d) T- N7 Z- p+ x+ h
if(count==N)
& g( ^/ n( t) e {p->flag=0;
8 h. M2 a u* p4 T f/ Y/ Q count=0;2 h7 q; v' d( o5 o* K
sum++;}
3 p/ M! C- U3 c, P, y6 D+ A$ l9 i if(sum==M-1)
6 A( [/ g, O4 p5 L2 ^ e break;" p) k0 H; F; w( @5 }7 @) ^
p=p->next;
3 R8 @; q# s- L }, `9 R \9 w8 G! ]
p=
. q7 w; u/ l( b& b2 u4 J head;( ^" D) ?: l2 b+ f
for(i=1;i<=M;i++)7 i; {/ L8 r+ F$ s( i# Y7 E
{ if(p->flag==1)
$ x# ~# R) A# c% u7 w) c printf("\t%d",p->number);
& u) L/ A' c9 q8 C: M/ O p=p->next;
2 T6 K( K# L7 ~: T g% _/ @2 ~+ ? }* _; J. y8 z v3 f1 _8 b
) ?, p( c1 b$ |7 } C1 J1 N- J. e
% u. u" K$ E; Y- `. o' d H+ _* k}
, x, W7 P. L& n$ y9 t( M3 f第二种方法:数组
( |1 C9 N9 t. H a" ]5 p#include<stdio.h>
) [. S5 C) T2 {! @5 C4 S#define M 8- u a. k1 N0 D6 O/ S
struct monkey4 V! V h' @' B% o$ P5 @3 R7 K. @
{int number;. b% B% c3 A0 ]2 |: W5 }
int nextp;0 a: i1 ^- ^* f, \( i5 V3 [ P8 X
}link[M+1];' `# D. }) P# W% }/ M! j
@# p7 D! C; J7 X5 b5 d
void main()
0 I) J2 E" q$ [9 U/ @- c{int i,count,h;/ T' c- l2 C- z- B: z$ {
for(i=1;i<=M;i++)0 U/ m3 ~) X8 p9 v% v0 o! {2 C
{ if(i==M)2 s! Q+ Y% T. l& b. W# { G' H6 U
link[i].nextp=1;
* w6 P) K6 h& m# F$ G& t, _4 M4 p else
6 ?7 Z8 @* q* o8 J# q6 [ link[i].nextp=i+1;
: P, g/ z" q- G) s9 H( p- c0 e: s# M link[i].number=i;
" f2 H, R# N4 s, ~}/ T+ ]% B H5 L6 u* ~# N
printf("\n");
# I7 \: I0 U$ r( Z; I% K, g7 @ ycount=0;
( j$ u( f, T j+ V+ G9 K0 y! n0 kh=M;6 n0 w6 Z0 K3 a' {
printf("依次退出的猴子: \n");" q: X% A# w$ v
while(count<M-1)
% N7 I/ \2 y" {6 s& @{i=0;
. M. p7 ]& |" } X/ V' X& Iwhile(i!=3)7 b* a7 k8 i: ^, A
{ h=link[h].nextp;7 k0 @& r- N/ K
if(link[h].number)
% \. E- f% I, J7 T. N i++;}. S' i# j) ]. P4 K( V$ l# {+ j2 w
6 i0 c5 K2 ] zprintf("%4d",link[h].number);
' x. Q6 A# ?# ^3 U) jlink[h].number=0;4 K2 M, v8 I. e& n4 s# ]; ]
count++;
T) Z- k: D8 l# ?1 U}' D7 }) \; L" M0 K( _2 G( g' @8 o
! a! W$ P( \) s! Y5 B: x' eprintf("\n大王是:");7 {# K5 Q; ~; H+ c; B J! K
for(i=1;i<=M;i++)3 g t* k& G! p, F
if(link[i].number)
/ r( B" H3 A) ]! C, s- X4 K printf("%3d\n",link[i].number);" ~ S* E: }8 D9 D# o
- z9 u+ J; q" m
$ ]; b4 `" H4 k2 ^; t6 f} - Y; Z/ \7 Q8 m* v
第三种是普通方法for循环; ~, c: @1 _/ p8 Z3 H8 n/ C- h2 t* D
#include<stdio.h>* l; P; L* J/ @" F W
void main() ~5 S+ m1 r# i' L2 s9 x
{ int i,k,m,n,num[50],q,*p;) ~6 k! N. c+ R2 }6 d" M
clrscr();: n( z' l7 d* g2 l6 _. z' R
printf("input number of person: n=");
, z) d) s. w0 s& X4 {( q5 j; L u scanf("%d",&n);) E6 L( G \. k& J c2 ^. f6 P
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只) Y8 \+ f) M/ c p, `
scanf("%d",&q);
2 I' I7 y& h# U: w2 _ p=num;
5 v1 r+ j' w! @2 L7 N6 y for(i=0;i<n;i++)+ N- S- l) |, p) ~9 x9 Z# F
*(p+i)=i+1;
# `- |) _# b2 g1 e) h& o i=0;+ z3 u; r/ g2 @& t6 s# l3 @
k=0;0 F# B9 T% p9 m2 X/ m) V
m=0;
7 A$ c3 U! D0 _$ D while(m<n-1); `) S% P$ c3 s( E6 B4 }* r
{if(*(p+i)!=0) k++;% k; _% P K4 p- ^. H$ k
if(k==q); O f0 I# t$ W) G: R/ n5 r
{ *(p+i)=0;
5 b/ k2 `# W2 S5 I& P; p- J/ ] k=0;4 ] R0 _% w3 Q& X" s
m++;
9 K$ u6 h# b6 w% a }
7 v7 D7 P; C% {" r) K; k0 d4 N i++;2 d' C- b. X4 ? W3 t1 ?
if(i==n)i=0;& D2 E4 Y0 R1 ^, b$ V" E' |
}
: T. K$ [0 Q$ B8 w, k8 |- K while(*p==0)p++;
; y1 m7 e4 T" I A printf("The last one is NO:%d\n",*p);, Z/ a; l; X, k
getch();
% E! I1 x0 h# A( c
; V+ |2 z( g. E, F5 J; |* y} |
|