|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
K' u* T( g. s! n, ]# ^# s这几天我在忙着编一个问题,我用了一种方法编出来!& J2 l2 V' W+ _# A. d- y* j
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!! W7 |2 P9 g; P: S/ G
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 : N4 [9 Q" n" `) t# ?
' w8 G8 F4 s% P* v! L
/ r: X6 x4 ?) ^- W% L* Y) U
题目; ~* ]" p3 R/ x8 J* {# Y) g
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
- F. p p5 Y. P3 R- f第一种方法:利用循环链表( U1 e9 u0 ?% C7 l: V7 P
#include<stdio.h>
4 {' |$ u6 W; y. Q& S; F#include<malloc.h>1 t q# @8 G% l
#define M 8 //共有8只猴子
2 Q( V( ]# [+ B#define N 3 //数到3只时退出第三只( |! L* U0 |' P
typedef struct monkey
. i' ]* T; r, ]& [# F+ P{int number;4 N* p& W9 {! R9 G* M4 V( e
int flag;* T e7 t, T# M0 x( T4 a# r
struct monkey* next;
# g3 G2 q& I/ [* b, Z3 g}MONKEY;# p! n1 |! \9 O$ X& a3 L
main()5 q& r! w. u$ G7 {6 w [& p$ R
{ MONKEY *head=NULL,*p,*s;- @" ~+ X' U5 p7 |2 K
int i,sum=0,count=0;
+ c# y8 l$ t, Q. Y4 B clrscr(); //清屏2 Y9 r8 k( j; K
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
5 f2 z+ V* f2 U4 C7 o- _/ ~ X& b) v p->number=1;p->flag=1;. E3 b+ z1 f* a9 }4 w0 i* \
p->next=head;4 L* z; Q6 K+ f3 }8 ^
head=p;7 t, X) T- A1 i. H
for(i=2;i<=M;i++)
* D7 p2 z6 W3 A$ i5 _& V# ?' X; ? { s=(MONKEY *)malloc(sizeof(MONKEY));. @ v+ r6 l6 Q( }
s->number=i;s->flag=1;" Q6 q2 x+ F! Z! L6 L1 R$ J: T5 y
s->next=head;- `/ o7 t* \% Z/ v: {! L- T; ^& q
p->next=s;p=p->next;0 E' }( m; G4 g; |$ Z2 o4 P9 n
}
2 U- u" _' p! x' n& W" P p=head;" I9 n+ t0 h% ~9 r* W
for(;;)
; Y5 \$ Z7 ~( |) ` {if(p->flag==1)4 e2 F+ i% j2 `1 V9 j% g) p/ h3 h
count++;7 q: B1 f% e% V$ e4 q
if(count==N)$ ~5 A7 C* `8 ?5 M% d- [" w
{p->flag=0;
5 d. K% K$ q. o7 _ count=0;( [# O& c6 C, _5 l- M
sum++;}9 Z* P! t/ i3 O- z( b5 p! X
if(sum==M-1)$ b% N( r) n$ Q c$ x! r- J
break;
# }1 O8 X( b) j6 [2 E. c p=p->next;
& x/ v, F, r; H, t7 x6 I% D }( O6 |# y' @6 [4 v+ p- x
p=+ X( W; |- D! F: V, T1 Z
head;4 ?$ j! _. X; m: m: ~7 g
for(i=1;i<=M;i++)
4 x5 x$ H% b- }3 m$ u! Z3 q6 f( X: l { if(p->flag==1)' L, O$ d3 F1 t; `
printf("\t%d",p->number);
6 q" i4 M& O6 J8 c1 J' x. g- j p=p->next;8 z2 p8 I, \8 t. {
}
* O6 R4 h. A+ V! G7 s/ [0 x
7 B4 o. R" t4 B
6 [+ F( Q. P) I9 k# C
: F# X: H- J4 I, s} # _2 i! W1 F8 |7 H3 H
第二种方法:数组
. u! t: N7 T: e. n0 f4 T1 g#include<stdio.h>
a1 `: q/ r+ d" y4 i8 [#define M 8) ?& v+ y. G% N2 k% N, ]
struct monkey
' n6 H, Y( A! p$ Y+ w* }, `+ G{int number;
3 h/ T U' ]! x7 dint nextp;4 H2 X: g2 r7 F4 d3 i
}link[M+1];
& n, y! k$ W: X, {3 l4 k& L7 e6 D7 J
void main()
! R# k6 A- g2 ]2 a4 _{int i,count,h;
2 c7 Z, L8 v$ E9 O% T& d' W3 ?for(i=1;i<=M;i++)
4 s2 D" n8 f4 |$ b6 h) w, O{ if(i==M)
3 N5 K9 \, X1 I" l+ Z0 q link[i].nextp=1;
4 e+ `5 ~$ V1 q else
, V9 D) L4 F' q U+ j& q link[i].nextp=i+1;9 l, s- x, D# t' K/ P& O6 \7 C6 i+ t
link[i].number=i;2 {6 o4 ~( M" A: a0 \
}1 q5 W3 o0 E8 S* {
printf("\n");+ h- f' l" F: n0 ]( U
count=0;
7 k8 q( _, Z7 R Dh=M;
' x& C' t* s$ m& n' h2 T% W$ [printf("依次退出的猴子: \n");; _% B( V0 V# j7 [
while(count<M-1)
, ]1 {! }7 v% z3 R{i=0;/ ]+ g- N" i j
while(i!=3)2 V% A# h B- `2 @) ?
{ h=link[h].nextp;( B! h. U0 w% S$ _' P. ^
if(link[h].number)7 K% [. K8 v( o& M
i++;}
- P4 i: ^- r! ^- ?$ b6 `/ ~+ e- N9 J9 l' d5 |
printf("%4d",link[h].number);
: ~! A2 Z: \/ M; X- E" [" v7 g) Dlink[h].number=0;" A& T; Z4 K: u% d" m! v8 | `
count++;! x Y# W: H& p6 c0 r
}
$ R1 |) e3 S' r, P/ t
. c2 D% m. ]- K9 q- Zprintf("\n大王是:");/ j' @5 h) L" n+ j5 x. M/ Q
for(i=1;i<=M;i++)3 b# m k) A5 v! H1 V" w
if(link[i].number): x8 Q# d) ]# B0 M3 g
printf("%3d\n",link[i].number);
$ f7 V, n6 @5 q. O0 V: s6 ~' U$ R. C0 Y& |1 }8 j" N! U. |
* G- n' T5 x( U5 c4 S. d0 x}
- E: u( \/ a7 z- R, r, ~第三种是普通方法for循环
! J9 y) S- C& W#include<stdio.h>
( g' S5 H! Z) q* e* [( v! Evoid main()
% ~8 t; `9 C0 @8 [" d0 a/ O{ int i,k,m,n,num[50],q,*p;/ T( q z" Q s1 R
clrscr();
7 t S# J4 O; F2 C) g; g$ C0 H4 p printf("input number of person: n=");- Y" F. i5 H* b4 l/ Q
scanf("%d",&n);+ `+ k5 {8 x8 D
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
6 `" b* p- z2 a1 r M5 ~6 w6 I( C scanf("%d",&q);$ T( \5 u: ~6 I0 s/ X& e; M
p=num;
3 t& u- P: k3 Q" J for(i=0;i<n;i++)
- [1 E$ V* M% }& h: {0 o$ a *(p+i)=i+1;
3 ^6 ^: e, ]0 K: K i=0;8 x: w. h: `& I5 p0 F
k=0;
F6 o; d3 `1 U" a, Q4 e m=0;
" R1 H8 [+ N( _* e/ M while(m<n-1)9 i% }6 z8 ^. G- q
{if(*(p+i)!=0) k++;
4 U- E& J5 p; { if(k==q)
2 C' ?+ q5 F/ R1 K. b. F% ]5 j { *(p+i)=0;
" f" r1 b ?1 A1 { k=0;
) I: r: \5 X' r" o( u m++;
" R( g$ k( z& _ } ^5 K' d; \2 M/ ~
i++;
8 x N0 ^1 c1 b if(i==n)i=0;
) X2 G! V9 k* m" l4 i4 l# I( D }
: K! S: b! ] O' x; B while(*p==0)p++;: j- X" ]/ i4 r* T- r* P0 _* |
printf("The last one is NO:%d\n",*p);; B" N8 e- ?# V; F' K
getch();
7 I3 M: r8 S# U7 p2 l/ o% a( E/ E8 K; k9 \7 w
} |
|