|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
' a- S$ L* Q( Q6 X, S2 L8 M这几天我在忙着编一个问题,我用了一种方法编出来!
6 g1 F6 X6 M5 I) ~9 I, H但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
7 B5 n7 B! \' y h2 v/ M; x9 P. e注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
7 ]( s- M1 c7 L$ A. t3 w: c# N/ v& O' e0 N
: L2 H: T! Z, P2 y& g- [- e, M
题目
' f, D4 C# |; o山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。* d" N' ]; D8 H5 _( Q% A
第一种方法:利用循环链表' w7 [/ T8 F! O- I- x; |: ~
#include<stdio.h>
1 p0 @8 H0 J! L( Y#include<malloc.h>" R/ [! h, {1 Y& Y
#define M 8 //共有8只猴子; a% ^2 x4 e. e ]. I: O# W& x
#define N 3 //数到3只时退出第三只
0 P" i. r$ Z9 e- Z# ]typedef struct monkey: Q5 \* X; @5 W3 ~) ?- k: W ~9 I
{int number;
/ h1 ?, D M: D3 J) F7 ?2 w* Cint flag;
2 n% E9 u8 k3 B- s' X1 i8 ~struct monkey* next;
2 `2 y. b9 A* Y& i( l& s}MONKEY;% a6 D6 n4 J9 D! F! x
main()6 z% f0 V( b/ V' l! l8 y X4 P
{ MONKEY *head=NULL,*p,*s;/ P4 W" i7 _7 O* A6 Q0 [
int i,sum=0,count=0;
# v' u7 t- u- R* n0 u2 [& [/ ] clrscr(); //清屏
4 n" ]8 e5 ~6 u: ^6 x6 i5 f p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
. g" C( Y* `) T$ _8 | p->number=1;p->flag=1;
& h9 Y1 e4 g) S4 F$ O p->next=head;/ s. P$ R7 ?, V2 N
head=p;8 b5 u, F9 W9 x3 d5 q7 x) \
for(i=2;i<=M;i++)
- b- ]$ c- d7 A: {) @ { s=(MONKEY *)malloc(sizeof(MONKEY));
' y) }# ], h" w, x! X ?2 l s->number=i;s->flag=1;
& |. F/ @7 F2 y( r o( k s->next=head;! Z4 B4 h' Y8 \. q
p->next=s;p=p->next;
0 d0 w& t/ a5 M0 T }
& C) J) y5 ?) C" Y. |) x* Q' t p=head;0 q! j( F) r& G( z
for(;;)
) e6 C+ p: S: h3 N( v# D; T/ _( W {if(p->flag==1)
: e b$ F+ g4 `" M- ?; J5 v( G. l3 F count++;
6 }$ C# z8 k! M. H+ |# g if(count==N)9 \. ]& h- s K: E% I. n/ y& M
{p->flag=0;+ c( R# q& }4 s3 E s3 q7 F
count=0;( x7 ? j9 z2 [' g1 h. J( F. O
sum++;}
4 Z! r) ]/ W6 D6 {* j3 d if(sum==M-1)
% B9 S5 n4 r6 S break;" V- Q, c0 A4 \) }: i9 e
p=p->next;0 \( C3 b) J, o# x
}
. H/ R, [) l% p7 u9 Z/ \2 d/ y p=
# w( @1 ^3 W* C% U0 y0 B head;/ }' D6 [- c+ d1 m& i+ W
for(i=1;i<=M;i++)
- ^8 R1 ~7 o% |- R$ [ { if(p->flag==1)
) r; i2 t& e5 U" `6 r printf("\t%d",p->number);
' D+ f# v* l" x {" S p=p->next;$ j/ b1 c2 H2 e/ X8 a4 h2 R7 T
}
" v3 y) V9 u& L$ q) m+ m1 D- h7 E* Y1 F' r, T
: X, x1 B) h m9 i% U
- Z8 d# E, g% r: l8 B} 8 Z3 s s, D( [5 U3 G
第二种方法:数组- i) _3 q- y% ~2 k: m+ Z7 r) Y
#include<stdio.h>2 |, o$ s- G S2 D2 H: b0 T5 H
#define M 8' p6 N" W$ p" z( ]+ V4 _* T
struct monkey
1 \+ V3 B# h' l5 j; ]+ j* N+ @ u{int number;
; S% P, L& M8 tint nextp;' M3 [6 g" {; n6 Q6 N/ P
}link[M+1];
9 @4 y# q7 i" L! ?. h8 V, B. Q$ z
$ `* T8 Q2 j/ G0 `- ?2 b3 E7 R$ k! dvoid main()/ v! ?2 G* \4 J6 X1 s
{int i,count,h;
3 H% k0 |( [* dfor(i=1;i<=M;i++)
. w, L' S5 b: x2 _{ if(i==M)+ L9 c3 ~; m$ D! @2 W2 ~* T1 w9 J
link[i].nextp=1;
+ F% v3 t8 N ], c2 D; T6 ~8 u; x else1 |' `* X6 F4 R
link[i].nextp=i+1;6 P& r) u+ c2 h6 I' g
link[i].number=i;
, h- F1 ] w2 D" N, M}
+ t, f& N! j: M* Tprintf("\n");
, s, k* J/ U3 v4 O* n* Mcount=0;, ?" Q$ \ Q; r# ^0 Y# d5 {
h=M;9 _/ v% m- ?- y. I
printf("依次退出的猴子: \n");
2 E u* z% e, Z! K" Q! T6 Fwhile(count<M-1)$ T: c/ v: I6 C9 p2 A! u
{i=0;% a8 [* |5 J. P3 I9 o+ N e
while(i!=3)
+ Z' b8 z0 q* `+ w7 ~) {{ h=link[h].nextp;
2 K+ t/ e% a! \; w v if(link[h].number)( H* G4 P6 H$ ]! C* S* S* c& r
i++;}" M/ \3 o9 V, b1 @6 b2 O, R
4 } I, V+ I0 R- q
printf("%4d",link[h].number);
" q- ~+ {) ?5 Y& Rlink[h].number=0;
6 ?8 k$ s+ e0 I a! k6 F4 _count++;
# B& L% w0 z$ c; v7 `5 W+ O6 p}# w! ~# d7 [$ @) D/ Z, ]
5 R" k+ k; U& Y: N1 ^printf("\n大王是:");
. M0 e, W0 ]5 Q" j1 W. c# ? for(i=1;i<=M;i++)
! I6 x& ^3 N' } if(link[i].number)2 U( _2 B# ?" N# c$ Y k3 E
printf("%3d\n",link[i].number);
/ k! T5 r1 I4 s9 n
: U% E+ c( u: b/ q) G7 R
8 J/ s) l( t5 a3 \}
, P( R( o c0 y b# z第三种是普通方法for循环4 F2 l: v& {) }* j* o- S
#include<stdio.h>
9 `9 B! I: v: Rvoid main()2 F# Q# q% r* ~1 s: s3 S0 M
{ int i,k,m,n,num[50],q,*p;! U$ Z* X, v6 W- M
clrscr();
/ H* A4 E( c! I' L% y( W9 X. d printf("input number of person: n=");
- n* f' ^& |' K( r6 z$ G3 R scanf("%d",&n);8 z( J- f E3 r3 X6 v& L
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
4 h2 }4 K) \0 k, _ scanf("%d",&q);
9 H0 A; c R P2 x, r& d p=num;
- ?$ f1 ?" X2 \" C for(i=0;i<n;i++)( q/ J" [$ _% X- f7 _* }
*(p+i)=i+1;6 C5 Y8 u2 U5 _4 b
i=0;7 [1 z' a, L& f& a
k=0;# t5 P( W: i* V( r) V2 F
m=0;
; s1 g( ]$ u' r2 ?6 T% t8 I. p while(m<n-1)2 n( C% |! \& Y, ^" X* h
{if(*(p+i)!=0) k++;7 ` T4 r7 g9 Q
if(k==q)+ f& J; r% H, b7 P# [2 I6 m
{ *(p+i)=0;* ?; Q% l. x F5 `9 V
k=0;
- a8 w2 e/ V+ c, c( p" i m++;0 }9 j6 |2 }! g# N$ [
}" d0 a! W8 ~) ^% X ], d: W `# e
i++;0 F$ e! @9 O6 ~9 w* T
if(i==n)i=0;
s. d. Q6 j P }9 G5 J& R K* I1 z8 A. [
while(*p==0)p++;
8 D5 A/ }2 Z( @$ O9 }, ^% @/ z printf("The last one is NO:%d\n",*p);
% G+ T, P# q, k5 t getch();4 h6 W8 A- ]* X$ j$ m
' b3 D7 m( P0 S
} |
|