|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
4 W. @* ^5 }( u7 z4 ]2 r这几天我在忙着编一个问题,我用了一种方法编出来!
& c1 }, K" H3 L4 d6 J但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!6 _. E% P+ ?% [1 o
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ) m/ }# S# n' |$ @5 L
' V0 M+ g6 g6 U( D7 E, ~' C
9 L( z7 B' B/ _8 m7 a, } B8 t+ A( T 题目/ }8 {. [# m: E5 d x6 j+ D
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。0 K7 ? { Y' J7 w- ]0 M- y0 u
第一种方法:利用循环链表" n5 r1 ~: {3 Z! o7 b6 P8 ^
#include<stdio.h>% p. ?) W& e/ G3 N. o" J _) M
#include<malloc.h>, q1 t/ @1 M# t8 \1 |6 _
#define M 8 //共有8只猴子) ^1 Z+ h: W _$ O0 S( G
#define N 3 //数到3只时退出第三只) E, d0 y8 n& @/ t9 [' R- v, E' }( k! B
typedef struct monkey
9 S2 d; k" e+ n# }! K: M1 N{int number;
a, H6 Z0 d' \% }) ]3 @- Bint flag;! e) R' {" l0 n9 f+ _
struct monkey* next;
9 `- \% ~$ b Q/ K7 {& k0 M! r5 I}MONKEY;9 I' q0 }" c0 E, Z& u9 n
main()
- B" j9 C9 g( v. b7 z! T4 O{ MONKEY *head=NULL,*p,*s;
\2 R$ y/ d% }4 Z' g int i,sum=0,count=0;* m. h6 x# x0 |; Z7 G( R/ y) A
clrscr(); //清屏
2 i* l( O8 S2 ]& L* o p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
' O# R: b- Z0 w! |4 G: R( d( ~ p->number=1;p->flag=1;0 s2 f9 M6 O* b" Q7 I7 \3 q, v
p->next=head;
0 G! O" C: J+ D2 `% b9 @5 | head=p;
5 |4 e: G) Z6 L for(i=2;i<=M;i++)
8 B3 A2 \' Z( c3 @) F+ { { s=(MONKEY *)malloc(sizeof(MONKEY));
" F( v @% m+ M s->number=i;s->flag=1;
/ l0 H* i0 k- T8 Z6 g s->next=head;
- [) K! J* D& v$ R2 r% x p->next=s;p=p->next;, f: T/ j8 X9 ^( V8 Q8 G* _; p
}! g. ]. i& @# [* n3 ?+ c# N
p=head;5 }" V* N" e3 u, n. Z
for(;;)6 f& a$ X4 a, ^
{if(p->flag==1)# w" G+ o# d( R) _
count++;
3 J: k, [& s5 F7 S( e1 J if(count==N)
6 u6 u& R* F! m' t8 m/ r {p->flag=0;
( p# h3 M! Q1 [) h- L! z' [" P) j0 @ count=0;
4 e! R; J) i0 Y* z1 }9 Z( F sum++;}
3 [# ]3 X( Y# q" ^3 ?+ a4 w if(sum==M-1)
% R3 q( J, ^8 y! O N% ^ break;
; H: I a5 J$ |6 Q' [/ k$ i& w p=p->next;
/ q/ y8 u" o% N4 _( i }/ l7 o" Y! K- O1 c% ~2 v B9 A
p=' D4 S7 p6 Z6 H c2 X% {/ R2 a
head;& k$ m8 Q* |9 G4 I- C- s0 ?$ P3 |
for(i=1;i<=M;i++)0 F: o$ q0 ]/ f1 u0 w
{ if(p->flag==1)0 \& r9 \2 m: a; w# M. I/ D& V
printf("\t%d",p->number);
% l5 Z) o- m8 O9 J* H9 H p=p->next;
" L8 x1 p( Y9 S/ U) J+ k }2 _+ Q$ C! R$ |4 C2 f
& b1 ? ~0 b# }) ^! O, _: f5 T, _0 U4 v1 |1 ]5 \
7 Q+ a4 P6 U1 D$ V* O6 C! g- u} * ~8 ^: N; n% z) n$ f) w
第二种方法:数组
8 K% y( Q- K5 b# J4 g3 F#include<stdio.h>
" d9 L/ x2 F' O; b o U#define M 8+ N- ]! F8 @5 M" z& ~% R r
struct monkey2 e' z5 C2 g' a+ n
{int number;
9 M* R" ?5 E6 K( X1 pint nextp;( s2 ?) U: b: T$ ^' \' L+ @
}link[M+1];( C9 z# t% s! m7 Z5 D
3 t9 J2 ]7 z8 J% ^void main()
" v- f# s, b- b5 f- P* F{int i,count,h;
8 ] W6 p2 H5 j: T8 w! z5 N9 afor(i=1;i<=M;i++)
4 b' Q- Z( K0 d{ if(i==M)* _6 W$ Q1 ^2 U* ]- G! s8 `
link[i].nextp=1;4 @/ |- ?5 c/ [
else: N9 {: N0 ?; A5 i8 w
link[i].nextp=i+1;& S4 n' u, X4 g: V3 B. p8 Y
link[i].number=i;" R4 H) t* f' Y4 W& j6 G! I
}
+ F3 k+ X: {, U$ T) wprintf("\n");
2 N' S$ k# O+ {! K4 V$ Z$ Y7 gcount=0;1 X1 k4 H e& t) o. P# N+ D
h=M;
, |# w& K+ f! B6 mprintf("依次退出的猴子: \n");
5 H! x# X3 P8 T2 Zwhile(count<M-1)
5 G+ x. Y! \' q( W. J# [{i=0;0 l( f7 n* A* a( d4 Z
while(i!=3)& J! o$ @% I" V
{ h=link[h].nextp;
7 }. E9 I' M6 R if(link[h].number)% N7 H% Y+ p) K7 L Y7 T
i++;}* }9 F, O" T. _2 c- i" N( Z
1 i( U0 _5 N$ }1 h9 Z
printf("%4d",link[h].number);
) y* w: V9 F4 j' F! |link[h].number=0;/ @$ u6 Z+ k2 a o) f
count++;
9 ? r* \9 B/ V" n8 k, @& a. A5 j}
0 v5 ]' `3 n) b5 ]" N( m& a( D. \: ^. |( d0 {5 |% O* N
printf("\n大王是:");" J+ h" t) M7 V+ F: c
for(i=1;i<=M;i++)
3 `# r; D* o( v6 B/ V if(link[i].number)
, _( l! I. c# y7 F& P3 W$ W4 K printf("%3d\n",link[i].number);8 D9 [! H7 W3 Q9 V5 ?/ a- j
E0 C2 @- h6 Q* F7 ?) {7 A/ T. K- ?) J; t
}
0 g- `1 G+ ~2 b2 r, B& i第三种是普通方法for循环2 _* X6 c5 v" Z7 [' D
#include<stdio.h>2 A( M1 Y; ]8 P: _, c3 m( q
void main()
M' H! U) z. d5 J& m" Q$ J{ int i,k,m,n,num[50],q,*p;& W' m5 p. j9 I0 F
clrscr();
5 R" t' M5 {, d printf("input number of person: n=");
3 W) Y4 ?" Z2 l4 r3 M scanf("%d",&n);' l& L; c! W( Y/ v! k# O
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
) A. ]4 }5 u2 [9 Y scanf("%d",&q);
9 M& e/ F+ j# R$ F, B p=num;
/ u* J/ E: \- E" K3 w for(i=0;i<n;i++); s9 ~: f) G! X2 R9 t
*(p+i)=i+1;/ t2 A1 ?& K9 e$ _
i=0;
2 W b. h/ Y/ G/ y% r0 I+ V k=0;
* A) h! e! r" Z& P3 P9 { m=0;
3 { D# S' M- Q7 [ while(m<n-1)9 L: I# o* |7 X0 m
{if(*(p+i)!=0) k++;1 S2 W, r$ X. A9 p' V
if(k==q)4 m, X% N* q3 `% A) t
{ *(p+i)=0;
; `+ s& _: C( m; U! [$ P$ Q& q! l k=0;& @# s+ f) [1 F4 L9 T: i- M/ _
m++;
5 d5 R9 Q* K1 g' a0 E% V$ m' U) J }! |: w! A/ B1 T, V1 H/ `
i++;2 }0 [; P. z. ]/ D
if(i==n)i=0;$ i. R& V( s# s
}
' H+ B$ Z5 @* i. V g" T while(*p==0)p++;
+ q$ V! t& |4 ^ printf("The last one is NO:%d\n",*p);
/ d$ F# P% {+ }# Y0 ^; w9 N getch();) T& C/ W& r+ a/ a
: e9 g' g8 ^: S# ]. T3 F# Y. l$ U
} |
|