|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
* B) @% M [5 s7 C; u" [这几天我在忙着编一个问题,我用了一种方法编出来!
( P8 A. d2 I; y但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!7 K- n- Y8 o+ Y& L9 p, |3 E
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
8 J6 G, x6 M. _: |, }# o% t& L) y7 z& f8 ?/ Q* w
4 D+ O, g# Z! n& T
题目
4 U2 [$ I; H1 P山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
$ W [# Z" I' x' l" r% @* C第一种方法:利用循环链表
: @3 o* k6 b/ N2 y) }' B$ y#include<stdio.h>; t5 ^: {0 p8 x0 G( C0 o1 k
#include<malloc.h>
- h1 R7 O( ?8 }: o0 c#define M 8 //共有8只猴子
% q0 t# I- t% G, n) B+ r: u' J#define N 3 //数到3只时退出第三只
, \2 J0 ^: z3 q/ O% x2 \typedef struct monkey
$ c5 d0 m* |8 A- Q i2 I2 {& k- ~{int number;% U' }6 C2 k2 M. X9 ~! [/ {6 @
int flag;
$ C7 ]- s1 j+ R5 m" `1 z" i3 `, vstruct monkey* next;( C7 S1 _# ^2 `3 N, x% O3 T; ?
}MONKEY;
1 W; T7 u3 z5 W! D$ e& Lmain()# [) q( K, i! b. [
{ MONKEY *head=NULL,*p,*s;
6 _* s }8 q" L7 W6 r int i,sum=0,count=0;
" ?9 G5 o- h, F" i- w" S1 E% T# M clrscr(); //清屏" f" @# n9 J3 r
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
! Y9 J1 Y( a8 g) T9 s1 G! G p->number=1;p->flag=1;+ `( v7 i) E9 U+ }4 R3 _. ~
p->next=head;# [! N( ^' _% C4 d: B2 q; _# T
head=p;
, G$ |% u' Y5 q, h for(i=2;i<=M;i++)( G6 d! k1 u# B% f, m
{ s=(MONKEY *)malloc(sizeof(MONKEY));
& W3 z. q y/ Z! _3 O8 \4 I s->number=i;s->flag=1;
. t" _7 {5 L# M' S- [2 R+ Z6 e8 a K s->next=head;
, e( V2 ?4 g2 a O1 b6 y- r4 X p->next=s;p=p->next;( Q/ W& C) A# d# x8 |
}
" t6 W; U& _; s/ z8 [" E p=head;9 f' g$ u- V& F" I+ {
for(;;)
% ~2 g! a2 A0 F {if(p->flag==1)
* _3 e7 } C4 m* y5 z1 s count++;
1 Y3 T* h5 D4 O7 `3 W7 Q if(count==N)9 F6 j% W3 i1 V( k
{p->flag=0;! Z( ?0 N X1 U2 x% V* T! W% Q
count=0;1 k; m0 r# V; l
sum++;}
3 j4 S7 c& t% }) C if(sum==M-1)
4 I, s" D9 }7 ]* U break;
( ]' v$ b3 i0 r" C. w" @: Q' g p=p->next;
# E! a. j3 }2 W" w4 |# q! k }1 ~* S4 n# D0 g: L& W, D# D" W' y
p=! a4 Q/ L }, E/ o( y
head;
0 J, o' K0 x$ _- K2 E! i. Q3 e6 G: I for(i=1;i<=M;i++)# d) _+ e2 T/ a" z( @' n. J/ s
{ if(p->flag==1)
! i% X+ d# R) o printf("\t%d",p->number);
4 a4 Q2 n& w" _7 P4 S8 f p=p->next;
9 v9 a! n* e' q* G& ]3 G6 ~ }1 k& @3 y0 x$ T; [' R
: N ~+ Q% m( h9 c
( X) {; F) r z
- E F% a3 M* h6 u- P} 2 S5 d7 {, c: N- V# i& o* D7 e: E
第二种方法:数组- ?; Q' ` t' Q& ~6 y" w# \ K
#include<stdio.h>
/ y! M: E9 T3 B" A8 T7 L#define M 86 e3 J. O6 ?: P
struct monkey2 N" N/ i4 s" c+ \
{int number;+ t5 {2 y/ ~- {+ d$ ]$ b
int nextp;0 [8 ~8 O0 Q5 C& H' i
}link[M+1];
/ P2 ^/ s/ J* n' j1 E4 [' D" Y2 `" I4 o, g
void main()
# o6 @8 L8 A. t# g) w/ N{int i,count,h;5 X! M/ i! ^+ d3 o
for(i=1;i<=M;i++)2 \0 B3 t! A, m# }7 H9 Z) J; L
{ if(i==M)
: }6 {; s/ \9 P( n9 h1 b& A link[i].nextp=1;3 |! g- o \8 ], y, f$ n, N
else
! z6 V+ |5 H* m: i# \: ?1 W link[i].nextp=i+1;
3 S0 g+ ?0 t7 Y6 R% h link[i].number=i;, v, E3 S; |9 ?. w% B. J
}9 E1 J' c1 G9 Y* l+ q
printf("\n");
' S+ ^ n) l% D4 [+ q* n1 fcount=0;
- i7 |" R/ U) u) |h=M;& n8 {+ b5 \9 G7 D5 r
printf("依次退出的猴子: \n");
1 z$ U4 q+ M' q8 N6 @, p5 Owhile(count<M-1)8 n1 V2 z. `3 c& }4 F1 _
{i=0;6 G: \, u' R7 s* |* _5 I9 [
while(i!=3). C# A# u/ t3 b. h- {8 H5 X
{ h=link[h].nextp;2 {4 {! J' d+ Y1 c
if(link[h].number)
* R" x# D* ]8 w$ c i++;}
2 l& W# C; u8 P& X* k+ e K1 d
8 S7 ?9 q8 c6 P* j- s5 wprintf("%4d",link[h].number);! y: E" U; h, G) y0 ^
link[h].number=0; j7 `) j/ E. i% e/ n( U7 b3 L
count++;" T) N5 c# J: O- @* v. \: D; {
}
+ H3 _2 U8 ~* e# |/ t |9 i
r& n6 B9 O# R1 n- B, Z3 Aprintf("\n大王是:");
4 L+ N9 B) K, S2 T: G1 r, R for(i=1;i<=M;i++)
$ w' r2 P1 F+ G0 r if(link[i].number)
o( F2 J0 k; x+ L printf("%3d\n",link[i].number);
) o9 d1 d' }- d. `! R5 e- g2 Y6 Z
x! A+ k& X+ ?/ A( N# l# s9 G. e9 ^9 m6 N5 \6 @# P; g2 x# K
} & H% e H; Y. Q" p n
第三种是普通方法for循环8 r- l! f5 Z B4 ?
#include<stdio.h>7 }4 Q. |* h% I7 m5 s7 y
void main()( Y6 N* A( H& I" G7 ~ N# H$ A* l' C8 q
{ int i,k,m,n,num[50],q,*p;/ D' Q: e8 y9 v0 [
clrscr();
' b5 A, V- y0 F6 M printf("input number of person: n=");' U3 s" l9 ^- Z1 p% [9 T2 e
scanf("%d",&n);$ k% F' Y1 |/ M- y' f5 m9 }7 X
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
8 L! d- q! t# r3 _& A scanf("%d",&q);
0 @3 v1 o' S) K; | p=num;3 t! \. {* _5 z- ~2 N
for(i=0;i<n;i++)- K/ p: b$ C: R$ @. A, z2 U! ?, p/ C2 P
*(p+i)=i+1;
* n \, k& g: j9 H0 d i=0;
K7 o" a. K; c' I1 \# O1 m5 l k=0;
6 \7 {6 y7 m$ u! H$ I' L/ Q m=0;
0 \1 W( \; h" a8 D" _; P9 ] while(m<n-1)
7 H1 K2 z2 g% t: I {if(*(p+i)!=0) k++;
' ?) h" G3 H0 F% R7 z0 \: }2 | if(k==q)- U: C& K, \4 D4 z3 D$ X' c8 d
{ *(p+i)=0;
) J0 `) B, p- P) Z( b/ F) t# _ k=0;
: s) k/ M* d4 K* F' s: B m++;0 L+ |- e3 O; X9 W
}# ?9 N$ H# w5 b7 b+ ]
i++;) N6 d6 Z# `. o% _" t, }
if(i==n)i=0;: _' e+ ?; Z- t" B% [. o7 q3 m* s" J- B
}$ ?) ]& s' l" u! l3 b! q1 s
while(*p==0)p++;& y9 b& Q, `/ \$ o1 ~( z
printf("The last one is NO:%d\n",*p);% S* z k: J' }
getch();
" O& k7 Y/ A e7 R8 d
0 I2 Z/ g+ P+ E8 g9 d} |
|