|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!& H# U j1 m. ?6 t0 D& E ^) h* d
这几天我在忙着编一个问题,我用了一种方法编出来!/ X1 S! }" h9 O# S* M, g8 ?2 {
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!) {" ?" u2 n5 `: z
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 5 b5 P. j. G+ R0 G+ D* l( b% u
$ [: k* E. C8 \! b8 X( C
0 j/ ?! Z% c6 X" o: i
题目2 u! y, h$ A0 U3 l
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
1 Q: ]7 f. T* G2 x& v第一种方法:利用循环链表- J# {7 P# a* f6 }/ I
#include<stdio.h>( q" Q0 c" y2 C- T8 D% j0 N
#include<malloc.h>" }4 Y% O8 D3 a) U- }; d
#define M 8 //共有8只猴子' L$ k8 ^2 l" B; s9 l
#define N 3 //数到3只时退出第三只$ C0 l5 D, \: e; {; K
typedef struct monkey5 l, k2 w2 v; C3 E; @0 y# x
{int number;
% D3 o6 c K2 H2 l( @int flag;2 L8 {* `& \0 ~# R* h& V% H+ \
struct monkey* next;. C3 A" n% c. @
}MONKEY;' q8 C/ q6 ?0 }
main()
3 o- c! f0 L9 c# M3 A{ MONKEY *head=NULL,*p,*s;% u4 T' u2 I$ y
int i,sum=0,count=0;3 d; G9 L% O) Q, F" z3 g
clrscr(); //清屏6 I' }- y3 C# x/ i; \
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存% t9 z% v7 O$ g9 Y7 j" K
p->number=1;p->flag=1;
, E, T2 y4 b3 ]# z p->next=head;
2 R, ?5 V) ^5 d; f head=p;5 d; X4 V9 d9 {* G4 s/ L: W
for(i=2;i<=M;i++)
7 _+ m6 ?! m' }. ~9 z$ T! W { s=(MONKEY *)malloc(sizeof(MONKEY));
4 K: A1 U$ b5 ]: ]$ ~' g$ W s->number=i;s->flag=1;% k4 l! \$ z; T' }9 h/ v, B
s->next=head;6 l" t0 R( w B8 c3 q) K" K
p->next=s;p=p->next;, n4 h( M* Z5 c8 Q; q+ H* {
}
( ^$ J2 N4 S, S' `4 f8 B1 V5 `/ z p=head;+ Y( }0 E" ~/ ?5 Q
for(;;)7 N9 _3 @: p. i- I
{if(p->flag==1)
8 i c) q2 z( \9 z6 X1 b: {# |* @ count++; [# Q: L4 K( r( B+ P6 q+ x: _- p/ o- D
if(count==N)8 k0 S7 ?2 C2 L8 A
{p->flag=0;
3 z% @' ?6 o+ n9 ]' Z6 \ count=0;
3 y! H- m0 B/ X- Z ~1 Q( D sum++;}( h' p; K# I& X9 W
if(sum==M-1)
7 w# T( A3 l/ K/ O7 _2 C: u& ?; } break;: F4 Z; `' B3 l% \5 U
p=p->next;" L& C* G, Q3 K! F7 T7 r
}
+ Q0 X2 _2 P& a* x, p, t p=8 F. A6 ^8 n' n) z3 q# B
head;
. T( R. }: a" D for(i=1;i<=M;i++)+ M' [0 F4 X) f3 [% J+ p) ~
{ if(p->flag==1)
$ L" l7 x' m* H9 G2 j1 Q" H- }# \ printf("\t%d",p->number);) |# V1 Y8 Y$ k3 S7 m
p=p->next;
+ {/ I; D& R$ G% @% t }; x5 _" D5 d3 F) p# d1 e0 d9 H+ S
) Z4 E3 l( s% D# `; U) U: ^
' ?- q! O9 w4 e7 o/ S* H/ P- W! e7 c: E* x" m" _# T
}
1 y; b' M6 l: Y* i7 ?第二种方法:数组
; p: s: r0 g' R5 f. C: Q% ]* ?#include<stdio.h>
$ N% r: R: E% ]" x* Q) M#define M 8
" |4 o8 q% u( {: r( ^/ ~struct monkey
- {: ]0 F+ o% {9 f6 |2 ^{int number;+ b9 i3 f+ G4 N; y0 P
int nextp;9 }2 h. `5 v b2 c- _9 }- W
}link[M+1];
! v( Q. T! G/ `: ~, @5 M6 O! X& ]3 @% ^. ^; n5 J
void main()
. f4 K, _0 m# o2 c, J4 I @! f{int i,count,h;
T3 H' `) Y1 L* n; b$ x; tfor(i=1;i<=M;i++). G5 C x/ j. {# b) m: W
{ if(i==M)0 [+ \$ }' z5 S A- j" l3 Y% v4 ^
link[i].nextp=1;
! Z5 s, K9 @: u- [ else ?. |) [# b# F
link[i].nextp=i+1;3 ^* u* N' m5 [: _/ Z8 U" M
link[i].number=i;3 ]6 U5 v' B% `0 B6 P
}
# F! U8 [& p. o( e* cprintf("\n");. h# ~6 e& [: g% f4 S/ a" i
count=0;
* h9 O5 L+ f( X5 f) ch=M;
! R9 c; m6 d. C# o, y% s* ~printf("依次退出的猴子: \n");) U. H$ e. w/ f# o% d
while(count<M-1)3 x& S. c6 g, p r$ Z+ k
{i=0;
4 o; ~9 V( ^$ jwhile(i!=3)
$ K; h. I7 a8 }1 V' {9 ^( I; z{ h=link[h].nextp;9 F# J7 z9 z! \" y: F
if(link[h].number)0 i V4 |. p, G- T
i++;}; H2 U0 v N8 W) Y# Y1 E' P
( ]* q7 P( E7 ]3 Q7 \0 q7 R* O2 T9 [printf("%4d",link[h].number);; g8 c' q$ L0 M2 y" r( U) K# M6 D
link[h].number=0;
1 [% P. U1 b W( B7 Ncount++;5 i R* K3 T/ H& B8 V, X% ^5 P
}. U! n4 A5 e# z3 f7 l
0 r8 r2 g$ x4 c% Pprintf("\n大王是:");
* H) d M; d$ i; t1 ^- |/ G7 G for(i=1;i<=M;i++)
$ [* D0 e' d: i' l V1 \0 _ if(link[i].number)
) J" b5 U& f' b4 Y printf("%3d\n",link[i].number);" m$ g' [. ]8 w9 g5 e9 z9 k
2 |0 _/ U6 u) I; c Q% ^3 y
/ r6 g o( b( s; H! ]4 w/ l} - k& d$ h) A$ E1 c1 o, ~
第三种是普通方法for循环
% r; u( M! g* d/ `& U. | z5 l#include<stdio.h>8 M5 t$ ~( T* T- |: n& Q
void main() s/ v# L* \4 X1 o+ B
{ int i,k,m,n,num[50],q,*p;
, H- }: x! b2 y6 U clrscr();& R! | |6 N1 Y5 K2 M7 k
printf("input number of person: n=");
$ C y2 s/ u2 d Q scanf("%d",&n);8 k* m5 d9 o6 v& @- _/ Q0 x! F
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
. P; r: Q) i6 l; ^ scanf("%d",&q);
5 T) W, G8 L6 c p=num;% r: D1 W; P6 l/ j/ C
for(i=0;i<n;i++)' u: r- F h: Q
*(p+i)=i+1;! w! J) ?7 N2 p" I$ C# m: q
i=0;; f, c9 E. U5 ^+ ]3 r6 C
k=0;
; _1 o& c4 v$ W) e1 r2 q4 [, ~4 u m=0;* N0 X4 q9 w) a! |* q( S- ~/ o- N
while(m<n-1)$ t3 ~& H2 z2 R) Z5 X- F8 l/ y
{if(*(p+i)!=0) k++;2 C0 n) c8 I4 Y, \) R4 \
if(k==q)
- u8 c1 y" j4 G( e { *(p+i)=0;( R$ K' I; d( V; ]
k=0;# p& s Z, l' N3 }- V/ F; D
m++;& M+ H6 @ G3 o, M
}8 i* ?4 M7 E8 ]& ~+ l
i++;" \4 S7 C$ [( D& e
if(i==n)i=0;
% _' f" V1 g9 @ C, e7 `$ r5 P/ ~ }
" | B2 p) O% D" V while(*p==0)p++;; I8 I/ t6 }# h7 G ~4 s B/ C
printf("The last one is NO:%d\n",*p);
3 o; C4 }0 @! k& u9 F getch();. J9 x. U) }# k( }: s! W
8 C8 ]0 C; U2 ^} |
|