|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!" W8 A) J6 b! @3 V* @
这几天我在忙着编一个问题,我用了一种方法编出来!
9 _; c; K: l9 z4 W" d但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!& ]* M( H l; i2 }
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
) K# G2 V) A! C8 G7 M+ d1 y
9 _; l# `9 ?6 _# I+ t$ c8 o
* F/ b' G3 W% n0 Q- ]( _$ ]3 T4 U 题目
t, s! B; u4 c8 p山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
7 g2 L' A) Z6 S' { z1 S第一种方法:利用循环链表2 y2 ? Z" Z$ n( O6 y
#include<stdio.h>6 Q/ l5 z/ {/ K) m. `, g
#include<malloc.h>
) d# r( ~; S/ _& u1 z( z#define M 8 //共有8只猴子
, c1 V$ O$ g" _+ K5 K#define N 3 //数到3只时退出第三只
) A$ I( P' i0 X1 U; p, ]typedef struct monkey
4 h; [3 o5 J8 e5 w" R2 q- t4 @: m{int number;
1 U0 z' a* t' v' E- Iint flag;+ q1 w( m U( e0 ?$ T# p* I
struct monkey* next;
3 N* u w. m" G. f9 x: q' X}MONKEY;& X( l/ l% b9 P: c
main()
) O9 S b' w9 T+ g# u% w; \{ MONKEY *head=NULL,*p,*s;
$ i! \) r ^. C1 [4 {2 K1 G+ R2 _ int i,sum=0,count=0;3 a9 F8 Y5 [" e8 y& ], c( p1 r( A
clrscr(); //清屏
# z0 V% s. o9 O# ~4 E p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存+ D. y! P* r2 ?. G; Q. p
p->number=1;p->flag=1;; d9 [ Z; r) ^- `
p->next=head;% O5 s- r& d2 [" l* J6 Q5 A$ l, x
head=p;. O2 [$ j& r0 m
for(i=2;i<=M;i++)$ q1 Y! z4 y q. ~* _5 G
{ s=(MONKEY *)malloc(sizeof(MONKEY));
$ y0 F" m' h2 y2 G! D0 X z s->number=i;s->flag=1;; E1 y8 Y1 K& e# y) }% a1 q6 P/ A% B
s->next=head;
1 \# [5 |; b. j/ P7 U. q p->next=s;p=p->next;% b, f& ^1 D0 T* s; @. p( _. W
}
% C. s% }8 B( h2 J$ d) S/ ^ p=head;% L4 Y/ {4 J Y) @, y! N
for(;;)0 I9 v m* a/ i9 P
{if(p->flag==1)
- B3 m g8 s- {' O- M) f" K count++;6 f: M4 O& _" ^3 i
if(count==N)
8 p+ \ h: ^& e9 e {p->flag=0;
B1 V" |) b; o' d2 @ count=0;
/ O3 i4 s& i& D/ Q sum++;}
! ~, K- _ r3 e9 U5 d if(sum==M-1)$ y: a1 s* M V0 J1 S ~' e
break;
1 [) o+ O6 K7 `8 q p=p->next;
. N7 ?% E" E0 ` z+ l" N+ t }7 a/ j6 l4 A1 p/ V. D
p=
W3 T% ^7 V4 j& q0 ]% y) L head;" F4 I% U1 s$ p
for(i=1;i<=M;i++)
4 W3 z2 ?4 A! x0 {5 A" k8 z7 p( C { if(p->flag==1)
# d: o- p+ |- g) O printf("\t%d",p->number);
7 C) V) V& Q: L+ \2 f p=p->next;" B* \* J1 K8 d+ ^6 ? X! Z5 a
}, `9 d4 n8 F; Z1 [% v$ t* t
a0 H# H( w- \" n2 \
; ~5 d& o o6 S) \. ^8 \6 f
8 h" z/ L" D# O} ( S7 }5 W. {1 P$ E& I5 z
第二种方法:数组
/ O# v% l8 i$ E' _6 y5 C#include<stdio.h>
0 ]3 H. d3 l6 _. R2 C#define M 8( W7 s: i2 V0 E) N. ]
struct monkey) f' e' [, j P2 |
{int number;
! [1 t0 U+ g I3 }' Gint nextp;, O2 Z% W9 a, I( T
}link[M+1];6 }* ^$ j1 T) N" U
) p+ A9 W/ S0 ?! P1 j6 r- C$ x4 ?
void main()0 B7 }6 t# G5 S
{int i,count,h;6 z: b$ Y! H9 D0 P+ ^
for(i=1;i<=M;i++)7 e9 u% E A- E- K+ _. G& B% w% F
{ if(i==M)
' k; v* ~- P' Y M3 w' V6 E1 \6 k link[i].nextp=1;
; S9 o& z8 x4 \, }8 E' `1 o else% Y. }' F7 h, R( V
link[i].nextp=i+1;! l( c5 F7 E2 f' I4 Q' f
link[i].number=i;! f) c- k: B% U) |0 ~: R% I
}
) v* ]0 r* \6 o8 _ N$ \4 \6 _9 oprintf("\n");
6 s; R0 V0 W* v, `& P* xcount=0;; V# _5 B3 O: Y% U
h=M;/ k# V7 I& w1 p" ]9 a" b3 e! t
printf("依次退出的猴子: \n");
; `: n. R9 p# A. Bwhile(count<M-1), {9 ]0 b9 Z% P7 z" X
{i=0;1 v1 N3 m5 K8 P A) X# w" Q
while(i!=3)
9 ]* c% H7 U$ ^# `2 b% [{ h=link[h].nextp;, ~& Y0 w; }4 [* U
if(link[h].number)
3 l. `, Y8 Q. t5 v, `: L3 ` J" ?( S i++;}
9 f2 [4 F4 U# H7 U' m9 F0 t2 [9 n( v+ Y1 Q1 f
printf("%4d",link[h].number);
' _( s& t0 d2 ]7 J9 P' y- Blink[h].number=0;
% E [2 E$ h0 j' n; Z; r3 ]/ xcount++;0 G/ O, p# Y/ _
}* E. ~/ c+ @2 a C
& @5 t3 s7 c' d$ |$ V) m
printf("\n大王是:");
8 J5 I$ S! P/ T: C/ `6 N3 O" a* e for(i=1;i<=M;i++)
& c8 d O( e8 P N( ^ if(link[i].number)
5 Z# v+ M0 C0 n+ A( a9 p printf("%3d\n",link[i].number);
2 V0 J) a }' Y1 _2 [3 ?9 ?0 w
8 n# }9 T) }7 C& X, J, X( S2 \. L' ~' A3 `2 q o% d& y
} 8 ^. X7 `! E: i4 W. H7 o
第三种是普通方法for循环1 x0 G5 g% T$ N1 T% {) C \2 g2 n
#include<stdio.h>, `' Q0 V J/ Z( y5 C
void main()# \4 u ?! ] }& e" V
{ int i,k,m,n,num[50],q,*p;
) y; X: x/ M; t# @' n clrscr();
+ V6 E' e% \/ o2 Y" H2 ? printf("input number of person: n=");
$ G$ x5 E) m2 V4 y! v scanf("%d",&n);' D w2 S! K7 B& P
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
0 s) Y1 }- i% l scanf("%d",&q);
# @2 [& n& r! o8 @0 w0 @ p=num;
( v8 _3 K- |5 _7 t0 |4 s for(i=0;i<n;i++)
. {6 m0 \0 G( C *(p+i)=i+1;" G: L8 S5 j5 k6 h: |
i=0;1 Z J3 B9 f; B' C+ ?% l
k=0;3 |) H+ H% {; Z2 u
m=0;% Q5 P/ F6 i$ E2 r& s
while(m<n-1)5 n. X" s+ I- p
{if(*(p+i)!=0) k++;
& K/ F) F" b9 g& | if(k==q)4 |; C2 T; s2 j! w* v2 L9 ?
{ *(p+i)=0;
9 n$ n+ j5 f+ w k=0;
0 [& n m) W) o% K/ S+ g' x8 y m++;- y& P! l! c- D: n8 \
}/ m, ?1 o( H( B" y7 t% S
i++;: v8 s7 e% H' V% P
if(i==n)i=0;5 f0 m0 W; V( b8 Y" @2 n7 h3 v
}' W/ O g: V* k* n3 L! G
while(*p==0)p++;
' M- G0 B! e" s7 k printf("The last one is NO:%d\n",*p);$ m3 z$ i, h9 W! A4 }7 T }; h
getch();# K/ B4 A$ w3 _* ^
5 }" C9 B5 w1 U" l$ V
} |
|