|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!0 \. i, Z8 X2 j' r3 S
这几天我在忙着编一个问题,我用了一种方法编出来!
1 r$ k% f) o5 F1 ^但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!$ p6 @' K6 x% U0 r2 g# O! N
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
, ]3 T0 Y4 G7 n0 u0 }9 B G5 D- d8 ~: u3 {& c3 D
# c3 A7 G1 F* |3 l8 a: f& Q3 B
题目. C+ G$ v+ X/ l% b! f) g) u
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
4 w. u7 e5 y1 |, b第一种方法:利用循环链表+ b* C8 ^3 H5 v& [7 m
#include<stdio.h>
' Z Z/ p, e8 i4 ^3 `! p+ j#include<malloc.h>
7 x3 B' F7 l1 X' Y' M+ a6 `0 ]#define M 8 //共有8只猴子8 Q. X4 X+ F. A9 M( H1 O) P
#define N 3 //数到3只时退出第三只
8 q, s$ j; Z! x* J2 @typedef struct monkey
. P8 f/ m1 x" o7 M1 V{int number;0 P: r) ]& u; z/ @# W
int flag;: |% C6 D7 k( ]
struct monkey* next;' ~0 ~- H) a; V8 g. g8 j5 M; W
}MONKEY;
( q } a/ x/ e, `) `main()
" W. {) \8 ~6 O, Q8 T{ MONKEY *head=NULL,*p,*s;
7 X! y' U8 C" u int i,sum=0,count=0;1 W U+ [1 O+ E4 o( E+ s! r
clrscr(); //清屏* j- M f0 {* n( O& l# c& R# I
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
( o# H7 I0 H- |$ B2 a p->number=1;p->flag=1;# y) L0 n2 y9 p1 [% u7 H
p->next=head;
9 W5 G k& m$ g: O5 x head=p;
/ P6 X) w4 _' m% y4 U8 N1 ]" j for(i=2;i<=M;i++)
* `' s% O$ q& g% a7 t8 c { s=(MONKEY *)malloc(sizeof(MONKEY));
+ ?+ @0 Q0 U* u3 Y9 j) K s->number=i;s->flag=1;
9 T! Y3 P! }% N! q" ?! P5 [5 l s->next=head;
, C5 a% N2 X/ J0 i& C) n) y& U p->next=s;p=p->next;0 C: A( b; A& {
}
; V8 B" z" @; y& C. K p=head;/ h; t3 }: }6 P
for(;;)
* |3 _- q7 [# A" R2 I4 C# _ {if(p->flag==1)
% L! z8 y( L ^% G% t* _ count++;
5 f4 d* T" T1 j: H if(count==N)
9 P5 S. q$ m" Q. |/ G {p->flag=0;
2 t6 f4 S) F: M' n, ~) W3 ] | count=0;
, Q0 I4 B+ x4 y2 ^- }8 d* L: l, L sum++;}
0 R4 [7 k0 Z! W6 Q if(sum==M-1)
4 e4 n( Q' {+ `$ N' | break;
2 U+ O7 D/ Q3 E6 G3 O p=p->next;
3 g. v9 f$ j' X. K+ ^ }
* s9 w9 V( S: H9 e6 H9 J5 K p=: I y" G5 z2 I/ [
head;7 r0 w4 x8 t* c
for(i=1;i<=M;i++); v2 A- G8 K* j9 l1 Q: H( u2 c
{ if(p->flag==1)! P t& l1 u. O# |) `/ V
printf("\t%d",p->number);
. \) ^6 B k+ z7 @7 V5 f p=p->next;2 H/ _5 a" P$ v& m
}4 g2 ]+ p" a/ G* W
d+ e0 D' j. k( f) U+ W) { D Y, |1 P( v6 s5 H
( w- V. \+ I1 ~% p
}
8 U1 l# u4 v2 w: @9 t& {6 Q; D0 ?% d% a! \第二种方法:数组
) o1 x/ ?% n/ V8 [: ]#include<stdio.h>, z, T* X1 F! \ U) Y
#define M 8
7 n# U% v5 ?& i! o7 {7 zstruct monkey7 i$ _: Z5 e7 q2 i
{int number;2 a! t3 ?* s; i' R
int nextp;
+ E3 E7 y- M- ?) _7 d F9 |$ `}link[M+1];) R7 m" x6 f3 K5 R$ m1 d- s
3 q6 b! m }, P3 l7 E- `: S
void main()- w% I2 y6 ^. p! j
{int i,count,h;2 n- A/ U6 e6 [, i( D
for(i=1;i<=M;i++)5 E1 U! M5 F- B A" v$ E
{ if(i==M)
0 |% X, s6 X- o' n' A link[i].nextp=1;: y: R& v9 e$ r, R Q
else
: e! p5 j7 W3 v, _ link[i].nextp=i+1;0 L- {3 f* ^! I# ]4 ?
link[i].number=i;
- }. S+ d; @% B7 q- Q, z}
+ U" T% [+ |% q. Nprintf("\n");
/ I$ g9 e9 a: F2 O e y% }count=0;) A0 c* Y# E$ l$ c7 u Y& [* d+ Q, o
h=M;9 M4 n4 P. l, W9 ]7 K: i5 Z
printf("依次退出的猴子: \n");2 F7 |% [0 n( O( H0 s
while(count<M-1)5 h7 T. S& y" B& [! C
{i=0;) O) u9 ^3 ~. n7 n4 i# ~
while(i!=3)4 K" ?" {$ i% u1 E
{ h=link[h].nextp;
2 N! B6 g5 z D3 `2 z4 N) X if(link[h].number)& I7 i3 n5 x! Z/ Z, \
i++;} Y$ s- d' I6 G3 c$ M
S3 Z0 F5 S- C: \0 o9 wprintf("%4d",link[h].number);
0 d( m) P% Q, X1 Q* Ylink[h].number=0; K/ H% U) J0 K; c
count++;4 [- i) l9 s8 _- v0 O" Z
}3 a2 t! g0 F' _( x1 ~' ^
( R2 X' O9 N! a6 ^1 l
printf("\n大王是:");" H/ p% {# t- X9 M" p3 q5 G" \; e
for(i=1;i<=M;i++)
5 _3 w9 X- H8 |" }8 b9 k" ^$ K" h+ V if(link[i].number)
/ A' D; Y3 g6 g/ f5 z1 m printf("%3d\n",link[i].number);
0 v( R( Z' N- X6 v) E b9 X0 I. ~4 x1 \/ v/ _
( F0 ~( f' {$ X+ q9 @) l/ H* }$ f
} 2 V8 g! e. {- |# M- Z* L
第三种是普通方法for循环" E6 I. c7 f# H/ o1 H; z
#include<stdio.h>
' F/ q8 n! E% h! ]void main()
8 a2 f: @& K, k) Q# {- x7 ?{ int i,k,m,n,num[50],q,*p;: d9 ]4 u( Z& T
clrscr();3 I$ l+ `$ Z/ ^* R0 G6 N( ]
printf("input number of person: n=");
! y! ~3 P' [3 v, f" V n3 A$ w scanf("%d",&n);
6 z. X2 D1 m. G+ Fprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
" e8 Q4 K7 u# x" Q/ \ scanf("%d",&q);2 L( g6 ] i# P6 H. I5 k
p=num;7 z- e9 {) L) j) H4 b
for(i=0;i<n;i++)
1 ~ m" U$ Y# x( L' I *(p+i)=i+1;
2 L5 }/ T( l2 x) G: g4 }* l i=0;
0 ^4 a0 i- Z1 z/ J% k- [- y# Q k=0;2 i7 F5 E a& E; E
m=0;8 T0 Q8 t; N/ H3 m; P
while(m<n-1)
6 O2 K: q5 C# w; [$ _1 m7 }8 X {if(*(p+i)!=0) k++;
* F/ D1 Y, W' b( b if(k==q)+ ]* B7 r6 M9 w3 O( U: s: C2 P
{ *(p+i)=0;
* U: A: V q y' o9 x) O k=0;
5 M: Y( q- ~* @ m++;! e3 C% a' s1 K+ P& d
}' ^( y) V1 D* C& T% j8 {& M
i++;
$ j u$ P; X% G# d if(i==n)i=0;
G! I' b( ^* S) M p8 V }
9 p# F7 O1 q# i while(*p==0)p++;$ K# B5 M6 P, I$ Y% H4 v9 I
printf("The last one is NO:%d\n",*p);
# [$ s4 b5 _3 t1 V4 B1 | getch();
2 ~( Q) g3 o; l/ w" ~) T1 W" F) e8 |- b! D& D
} |
|