|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
7 i+ x2 M, q6 _这几天我在忙着编一个问题,我用了一种方法编出来!
6 M* l6 j$ i/ e, N3 j1 l但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
! M6 \ M$ l) S; x, L注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
) z4 e, y4 h) w8 C
8 h" y4 r! @& Q1 {* b& n5 u* ^5 @) b+ h
题目
" y6 p8 d. p1 R' I$ e山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
+ E) P+ q* }5 K8 j/ o3 b- ?2 K8 B! x第一种方法:利用循环链表: p* r z7 I% W
#include<stdio.h>
/ z* @+ E& }) F$ P6 U8 O+ g4 [/ d#include<malloc.h>8 s, K- i4 y6 k8 o: R: `
#define M 8 //共有8只猴子0 ~) [4 O: v/ Z( B
#define N 3 //数到3只时退出第三只& x# f5 B! E. K' a
typedef struct monkey
: n2 B* T5 R) f0 O7 T{int number;
A y, _" [6 O% J5 O' ]" k3 K' m5 j1 ~int flag;
- G# {7 i1 J/ P, p2 Kstruct monkey* next;, g6 }7 g: Y* k4 M [. L1 N2 Q/ o
}MONKEY;9 B% L. P* Y3 i1 x" V3 L" n
main()) N! i9 u0 J3 O7 G4 U7 m* i
{ MONKEY *head=NULL,*p,*s;
& t; O, y6 ~: |* ]- @ int i,sum=0,count=0;
- U. N' i5 H" I+ z' P1 a! T clrscr(); //清屏
8 k+ i9 o0 B K* f6 f) C, H p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
) ^8 R& @- B0 v1 i' T" h: d p->number=1;p->flag=1;) j# m, w4 s8 _3 d# S5 i
p->next=head;
; R6 q+ L9 ]% v/ c0 S, P head=p;, c9 Y. ~# Z" n' b& X) D1 [
for(i=2;i<=M;i++)
, \* d3 P3 ?! ^% @- A" U; J# ? { s=(MONKEY *)malloc(sizeof(MONKEY));- f5 ] \' J! J- h" y
s->number=i;s->flag=1;
6 n* N1 I: M7 h8 u9 r s->next=head;' X& }6 }" @% E9 J/ w
p->next=s;p=p->next;
, \# r3 K* l* `5 _, r' S2 U1 l }
1 h, `4 e; g8 X) }: e9 n9 ?3 d9 Z p=head;! \0 b- g; _) ]5 Q% F, p
for(;;)$ D" K# \* M) @, W4 }
{if(p->flag==1)' T4 X; @! O6 \% S% F
count++;
* G; g# R0 R$ K# Y' H6 p if(count==N)
+ k6 G B* A# V; m {p->flag=0;
1 A7 Z) J0 _; X% u count=0;! l D1 U* N& z) ~9 I
sum++;}9 r1 p8 y6 W- e) f! V6 Z4 w
if(sum==M-1)
# x9 |% m: O' q break;' z) }, C% S. f* u% j
p=p->next;
1 J' a$ D0 w8 R, n$ e" \2 Y: z- a9 X/ q }! z2 |% k, K% E& j3 L4 O/ A
p=! q3 Y. P8 o$ `, Y
head;4 e \- A6 ]4 P3 l
for(i=1;i<=M;i++)( s2 H% S! B: l3 p y2 y/ T
{ if(p->flag==1)3 c d& \0 w* j+ k
printf("\t%d",p->number);( e) b, `+ D# q/ x5 t! c/ e; F* s$ s5 K
p=p->next;, U6 x8 ^4 D$ k: K. o0 i$ w
}
: P9 i7 c& }9 W
5 ?% L+ s9 I: [: i0 d- t
! [* C, M4 u, p+ }/ v& T
0 p+ O# L: F- b: u6 d}
" |0 c7 g- [' x/ k1 ]8 ?2 Q第二种方法:数组
2 O8 g2 K; `% Y( q4 T8 Y#include<stdio.h>
" b v" e3 r* }5 ^* l& I2 _#define M 8
- q+ Y$ _/ \5 Estruct monkey
) W& h, \; v2 {. m5 V4 a{int number;, K. p( }; ^ v" ?. W/ o
int nextp;8 b% w, J3 r" D6 |
}link[M+1];
7 Z: |9 C; Q1 b5 s" F. y# k" d. F4 T V* P. a
void main()
0 T5 q+ G9 k: a8 `{int i,count,h;
# e! ^% _, }; \8 w; Z: C1 y2 I* Dfor(i=1;i<=M;i++)% H0 f& J# `+ q. D: z% \
{ if(i==M), T# b/ \/ c6 C8 ]' w7 M
link[i].nextp=1;
6 m# s9 g/ K: h1 C, Y9 C else
# r& E, Q# V6 b link[i].nextp=i+1;7 o! i* ?# n& V3 ~
link[i].number=i;
2 o( [( [+ l: `9 C, i* P}$ x; k: A9 ] ]
printf("\n");! f; @/ g. O- c* _
count=0;6 I; B% y+ z4 E5 H# d0 \8 k3 t! k
h=M;4 ?9 k4 P" M# O6 o2 H$ L
printf("依次退出的猴子: \n");
/ m' H7 j9 N6 n( y' a) P' }6 Fwhile(count<M-1)
7 j" |! \0 [0 G. A{i=0;
* y' E3 H y# c9 z5 iwhile(i!=3)
* F! }+ }% c' R* |2 G( v8 n{ h=link[h].nextp;
$ |( g: p: R$ q/ @6 K' Y- q/ S if(link[h].number); ^/ T4 `4 D. t( f2 F' M& l9 M
i++;}9 F4 Q8 `) h* t2 [% T: M
$ a. Q) v0 y# P0 s5 J! i0 j
printf("%4d",link[h].number);
8 c _# R2 H3 S4 Zlink[h].number=0;
$ H4 n* R3 [" o. n' x, g+ ocount++;
! d1 ?5 t* x# {( P}
" n. @: e. w0 V8 ]6 ^& R7 G- a. `. B. {7 z7 P' @/ y
printf("\n大王是:");
; M( _3 ]& s+ @% P( F3 [ for(i=1;i<=M;i++)
0 P2 B# A8 s2 W' a8 U( b6 j | if(link[i].number)* c4 U. @1 K3 E) I6 u+ i
printf("%3d\n",link[i].number);
: R9 e5 I: m- W4 _
( l; y( o+ m" J1 L# \1 p; |1 ~. b5 B
} 3 |% }& l, C" z2 Q% q1 v- ^
第三种是普通方法for循环& M5 F( T9 I$ x. `0 P' M
#include<stdio.h>, u d f8 ~ U: D/ V/ n3 j
void main()
8 E2 J% U0 { a) ]; C; |{ int i,k,m,n,num[50],q,*p;
, y* {# M- w# M! B+ w0 P clrscr();
4 f: ~! t* Y& ]) g1 G( I4 r printf("input number of person: n=");" [3 F2 u* b6 Y! e! a) O/ Y$ y" P
scanf("%d",&n);, K0 v+ |1 D+ `3 f& B$ O# R
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
( ~+ n& ?" Q* K7 w3 G5 y scanf("%d",&q);
4 p8 K0 p$ o/ }: d8 G1 l* V p=num;
3 I1 u$ Q- m- `( T2 H for(i=0;i<n;i++)7 i9 d& l) u. L; b+ }( o
*(p+i)=i+1;
" K: B3 Z1 E; n: s3 I" J i=0;
4 S* p" Z/ q% } k=0;6 T; Z9 N: d7 o; e, B$ D
m=0;
3 c! E p# p/ S% W# ?- n while(m<n-1)+ K1 X% {: C. h9 j" b9 c3 M
{if(*(p+i)!=0) k++;
" T3 ~) {' L* E, i' z if(k==q)* Q- f4 H: {. ^, t
{ *(p+i)=0;7 T9 d* ~6 e/ l* F# d
k=0;1 e& J e$ ?, {; ~( @+ Y3 j( U/ N
m++;
# P1 c0 Z3 b+ t+ {& }) n$ M6 [ }
/ F1 S, m2 s" x+ v. q# |& r i++;8 f& Q- f/ r, z+ ?
if(i==n)i=0;, ^0 g+ w i) i" }8 l# s
}
" A7 u# v- a& ^! m6 e$ K! Y7 B while(*p==0)p++;
+ M0 y- c! G7 U; W g3 |; n, c printf("The last one is NO:%d\n",*p);
, E4 S. O; z$ Z4 D. g getch();
+ m9 c0 I9 D. H, c; k- L# H
4 I7 u: }1 i# N4 o* U} |
|