|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
1 Y7 U. L# r3 T, m( y这几天我在忙着编一个问题,我用了一种方法编出来!
- N) V' L0 F/ T' F但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
3 h3 P0 h" K7 M注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
$ ?2 I ]0 E; {* \3 n
8 n' h" \( i+ r6 M
6 a9 }( N; m1 n g 题目
4 H& j- Z# j7 D, G z9 B山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
9 y4 V( \: W$ L5 a& ~第一种方法:利用循环链表
0 I7 `( J" `. T, v4 t7 h4 Y#include<stdio.h>" j8 k( \3 Z7 ]3 p
#include<malloc.h>
; M( V0 B4 W/ O6 ~7 f% v#define M 8 //共有8只猴子
0 g) u$ `+ |6 }2 j#define N 3 //数到3只时退出第三只
8 Y7 C9 l; y9 O! U. T; Atypedef struct monkey
9 n/ I# W8 i( D% M{int number;% X+ B1 l: K2 @( i) u
int flag; S& J& o0 N5 n- `% `! l
struct monkey* next;
1 X. l3 K- X/ H2 S' D5 B}MONKEY;
% e# {4 P! r+ {) T2 ?: i) H' H# imain()
& X) r/ Z/ i- G{ MONKEY *head=NULL,*p,*s;/ |& q, _1 K' p5 n4 M
int i,sum=0,count=0;1 q5 b9 r2 y3 h. ^: |' [5 E. b: [
clrscr(); //清屏+ ?1 R: d; \% |, m
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
. o+ p$ R3 y! h! I0 s# F% `: J p->number=1;p->flag=1;
* Z4 W4 U# a( N9 c/ E% T. ~- c p->next=head;- V1 m& \; M% g
head=p;$ t; k3 l& y W' ?, m3 K
for(i=2;i<=M;i++)
1 l# B+ ] _, D: V0 M { s=(MONKEY *)malloc(sizeof(MONKEY));
* N `* B6 M4 d! |; ]. { s->number=i;s->flag=1;- b* {( ~1 I: ?6 b" m
s->next=head;+ {2 Q0 \) Q! R7 ^ v: ]2 h y
p->next=s;p=p->next;
# C/ v% T; d- k }2 c6 B0 O' h. v0 e* h" C+ Q/ ^
p=head;4 F ^/ h7 P5 d7 W1 X7 N
for(;;)
?' G8 K; }& K/ S {if(p->flag==1)6 p( k( N6 Q, @$ \ T
count++;" J4 F( t9 v' |) M- M4 ~
if(count==N); Y3 H% Y7 Z9 L1 g: R. G& t
{p->flag=0;
. m" w% ~- P1 V, O* s. P/ y9 I count=0;/ K0 H+ @6 u+ ~& s% c" W/ w( x/ k
sum++;}
' V/ q3 w/ X" c" \: s1 b if(sum==M-1)$ b: K4 r, ~& u1 j% Z7 u/ \
break;. z) K: d$ e7 j, S
p=p->next;" Z3 D1 G8 w4 |/ l, A, r, M
}7 v! W& g+ e# J6 k% ]
p=3 v" @ e- a( [& q
head;
. ~; v* T: h& n) @- D, @, O for(i=1;i<=M;i++)
2 H l3 [# q9 o2 T# B { if(p->flag==1)% Y2 m& i1 x7 c7 A% r
printf("\t%d",p->number);
; t3 i+ W/ [1 O/ [ p=p->next;
* O1 Q7 O' P, ^) j3 y7 { }
: j2 K& v$ R: Q4 q+ Q2 m& W E9 O2 H! g% ~4 t5 z
5 ?- M" [- ~1 o9 ]
2 Q6 ^' O# l3 \' u0 Q} & D% ^% y) K$ p/ l# b. p% t+ N
第二种方法:数组
% ?' Q7 u6 j: I9 c#include<stdio.h>, [0 i: Z/ m" o$ j$ f
#define M 8) d/ ~" B( v& m1 m1 S7 l! {
struct monkey4 f( a" P2 q6 L3 {# o6 v
{int number;! |" E B9 C+ h
int nextp;
: r; e; R6 }4 T9 A1 m- ]4 @( a}link[M+1];
' `4 T9 {* L7 A. T: E
" z2 f" |+ @& cvoid main()( u, K; J0 F# M+ P- j, {8 J
{int i,count,h;
\' k1 b9 V. d2 kfor(i=1;i<=M;i++); k# i3 w$ I: c! j7 t9 x* |
{ if(i==M): k' d1 o2 d) Q. R
link[i].nextp=1;; O8 z- e6 G" ?1 y/ C8 n
else5 u& N' f! W$ Y0 D" @) ~7 @
link[i].nextp=i+1;
5 s% F8 M# p, W5 j/ U link[i].number=i;$ x$ V1 M& {: u8 t
}
; _! @4 P6 `; ]3 V0 O2 z5 p" Tprintf("\n");
3 d9 ^4 I9 S) Y, i a9 B6 C; acount=0;
1 {& _2 ^: S, v3 D) C' @7 Ah=M;4 V( y, q6 s: k" U2 O6 L, B- @1 F$ t
printf("依次退出的猴子: \n");
3 V# W& \/ K- |0 A7 ], Nwhile(count<M-1)# o3 K, k9 D- [. y$ C' a9 {
{i=0;+ H' _$ `: R! i
while(i!=3)% `2 ^% L3 w& u7 z+ L4 u
{ h=link[h].nextp;( Y) z S! o Q! Y5 T P
if(link[h].number)
2 h" i+ A5 S0 P" q3 ? i++;}9 L- n7 R( v0 G: _: h; F0 C
+ e4 c5 l. `! c! w3 F
printf("%4d",link[h].number);: r6 N8 i+ P5 H! Z$ E
link[h].number=0;1 T0 f) a# T ~, l% L
count++;: l+ K6 Z- ^3 a
}
9 q" S H0 C( w9 R5 }4 Y
, y4 l$ r1 e* Lprintf("\n大王是:");
" D1 B9 P) s) X5 y% Q for(i=1;i<=M;i++)& h/ G( F( {/ [
if(link[i].number)
$ q7 L" m' A. L: J printf("%3d\n",link[i].number);5 |; c/ L! d/ H/ ~/ \/ U+ I Z/ p
- d8 v x7 `4 `1 Z; D
5 n- a: D/ b! Y1 _8 @6 b' e} 6 P* F9 I: k+ f) d
第三种是普通方法for循环
6 j$ h/ a8 F4 L#include<stdio.h># a9 ~% e7 B0 N/ B
void main()
: H' b* N; U) [% _& ?( u% e; e+ x{ int i,k,m,n,num[50],q,*p;5 e. T: C! E5 z! j' b& P* ]
clrscr();
2 Y1 a' d3 \* X5 W. p printf("input number of person: n=");% C* ?/ d# D: l$ H* G H
scanf("%d",&n);: ?' o2 w& |/ t3 C+ d/ g
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
3 o$ |* k0 q, k5 U scanf("%d",&q);+ J" V2 I$ i0 i3 {1 S, H6 P
p=num;" _5 X' l1 f) m: h0 q$ E! b+ Y; c
for(i=0;i<n;i++)
7 W/ g5 K* ~% e; d& x *(p+i)=i+1;7 ]6 _% j( m$ g. _+ Q) J4 {
i=0;
% J" u! h% z, Q3 ] k=0;
& X4 ]8 n! f& \ Z9 n m=0;
& j$ I2 n* f( Z' t/ _' t$ o while(m<n-1)1 Y4 L0 ?$ m; {
{if(*(p+i)!=0) k++;
0 H! N6 u9 C' w% Y3 j if(k==q)
8 Q1 ^+ h2 C2 G( |9 `. B+ D, C { *(p+i)=0;
1 ~: U, ` j. _) S k=0;
3 R$ A. E& g4 o; k, H: Z+ r m++;% o# e T3 ~3 D% V
}
; P7 z" i2 q7 k3 r7 [ i++;4 j7 V# b. ]2 h7 }( t) a
if(i==n)i=0;8 s8 j# m) i9 }: ^& J- ], o; A/ @; a8 }
}
1 H) h4 K4 z7 z [8 a9 O" F while(*p==0)p++;; d8 i7 [ D- X n* Z6 K
printf("The last one is NO:%d\n",*p);$ m3 K0 h: W+ D" y9 O0 K0 i7 L
getch();% u0 ]' l) Y" l6 r0 Y
# j1 N" A! v9 r. m n5 [7 L+ p0 H} |
|