|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!2 s9 R% |: a1 m+ n
这几天我在忙着编一个问题,我用了一种方法编出来!( k1 p/ M1 X. o! o3 O
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!1 U/ F' S1 N: d2 F2 x' d7 i
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
5 j$ L( D% t) u4 l) L6 Y- f
# p; c0 c( h! y8 e0 }! _$ l
( m( l, A2 ^0 o/ T' ? 题目& D$ _+ l+ n( e D" ?" s
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
`; D( F( d. J- x" U o& i/ r9 `第一种方法:利用循环链表
7 m+ c, I, y' {, E& v1 Y#include<stdio.h>: \' w; W4 c0 [/ |( U
#include<malloc.h>
+ z, I) A+ Q4 Z& m#define M 8 //共有8只猴子
+ r' C& g- V4 q4 E4 W* C#define N 3 //数到3只时退出第三只' r* k' G4 } U+ u
typedef struct monkey o# t! _, e2 Y! u( R- g
{int number;
5 L6 S4 e6 C: L4 H, y. K d; O1 Qint flag;
& T- W" [: R# F5 S3 o8 k) _struct monkey* next; l4 U2 X3 c t4 ]1 m9 z
}MONKEY;
1 g& R) h7 X6 P1 |) fmain()
+ C0 A9 d+ Z" Y+ e: S{ MONKEY *head=NULL,*p,*s;
7 T# Y' p4 |6 t: I int i,sum=0,count=0;
) C/ G( B4 E5 x' |7 g+ J4 C clrscr(); //清屏
' D+ k$ r" q& }6 m$ f p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存$ [; g+ u* ~4 W; J0 f% u5 l9 z
p->number=1;p->flag=1;
: d7 K6 n I- O* d9 Q% j p->next=head;
2 V2 N( N1 o4 T; L head=p;
6 m+ e5 ?, E. O& c/ z. u% s& C for(i=2;i<=M;i++)
- j7 }- s: G) g. p- v6 N/ ^ { s=(MONKEY *)malloc(sizeof(MONKEY));
* g$ k1 @$ Q8 ~! B. C+ q" Y s->number=i;s->flag=1;
2 I& b& X4 x$ n: M D5 C2 [ s->next=head;
/ k8 W7 s3 [2 T, g- B9 m p->next=s;p=p->next;+ |: Z( E: u( a. L; L9 O
}% x4 r0 C: h0 _! E9 x
p=head;1 s. D0 w; ^8 F6 E; R4 G5 O
for(;;)4 ~- j( M9 c* r" s4 E1 B& }- }: {
{if(p->flag==1)
& S! q8 \3 C* A; E+ c% b count++;" l3 i1 i3 h7 i
if(count==N)1 J; n2 V& u3 D6 _
{p->flag=0;
, x( v: n6 N7 t/ P! `( E( Q count=0;
* y! z9 c. F; y t, S sum++;}
% s4 @1 H7 R" S# S if(sum==M-1)5 M) {1 ]9 J3 w
break;4 z, B* d* L. P! \: F& |8 V
p=p->next;
/ P+ N: R. \3 F) K" Z; | W" H }
/ o$ H. c, {: E [( ?' i p=
% R# L. u) @( J head; L. ~9 b3 _2 s5 P# |2 e
for(i=1;i<=M;i++)
6 T5 t u. g7 L) d& v { if(p->flag==1)! s/ L7 _: _# i0 {
printf("\t%d",p->number);* t5 I' e/ {' b: k7 a: S$ K
p=p->next;% o" B! ^9 `- i! s
}2 r. }# n: i5 L( H, h. b
% l5 W; M% u! B: ^0 T# Y1 l Q$ ]0 } f% J
2 P" ?7 K( c' z3 ~0 Q1 t( @* g
}
) P, Q; g# p( y4 ^; T& `第二种方法:数组
% g) q' E& ~9 R; p8 J1 k. O#include<stdio.h>! u/ S) v! j+ L: O$ v w+ i, O
#define M 8
7 f. y7 Y5 V- b. K" O& `2 Kstruct monkey' d( O6 A2 l1 S+ O! H
{int number;
2 T2 h% j' a' n; y+ D- Vint nextp;7 _; P, n1 c% W- ]( m& C; F1 V
}link[M+1];* ~0 H3 t( A2 p) L2 A2 D8 a
9 I+ {$ V) l( b; Q. a% ?3 Rvoid main()
: X4 T6 h6 S# m+ t1 U7 f) f{int i,count,h;
8 ]* W" D- ]5 c; S' Q7 J+ dfor(i=1;i<=M;i++), t8 {$ S4 O0 {6 R
{ if(i==M)( ]4 S- S" K0 n$ ]- X
link[i].nextp=1;
5 Z3 y: o [* E2 w& r: x5 i7 d5 A else9 ?) u1 W# y6 U [0 t* A
link[i].nextp=i+1;5 P+ z" {6 E! o# s# F7 \+ x4 ^9 G
link[i].number=i;+ F' s& h! U, C, d; L v, @
}6 ?$ k& d6 E" j) s! `/ m! g) _6 t
printf("\n");
: {. v; G# p8 qcount=0;1 f3 p" p- B2 T0 ]
h=M;
/ |9 U& X( u+ u* L2 W _printf("依次退出的猴子: \n");8 }1 g3 X/ X& Q' s5 ^4 f7 [
while(count<M-1)8 n/ e" Z( N& ?3 |0 I6 f3 S! R% _
{i=0;4 e6 V- f* w! e( g0 `
while(i!=3)
8 O& F3 C& W" K7 t$ S9 b{ h=link[h].nextp;
7 y& e6 j% N4 O, [7 p* l2 l if(link[h].number)" U# b0 K! a1 y# q5 z H9 A$ F
i++;}
2 u. p, b' P0 ?7 F2 O4 B7 }' u
Z4 d7 b5 B8 rprintf("%4d",link[h].number);! B7 A8 ]1 }7 D4 a5 B9 v5 i9 s
link[h].number=0;( D4 V6 q. i3 M4 E m y
count++;
7 K H4 x: s" L/ a}
; f9 [: c) D5 {; r" q1 r% A$ j4 j2 r
printf("\n大王是:");
) U! ]* w6 G' H/ c& i4 j% A" d7 F( b for(i=1;i<=M;i++)
8 I! p% D" f; `" U4 L$ e if(link[i].number)) V5 ~3 k( B! }- y- u
printf("%3d\n",link[i].number);
+ ^. f8 J! J G9 x1 w" p0 u- w. {1 ]
5 R* f$ |8 ?# F* g6 X* [
} . _# E {6 m0 T* r' }
第三种是普通方法for循环
, m1 \- z/ I$ H4 R#include<stdio.h>
0 t6 h: Q D0 V, ~void main(). e* t" K/ l2 T, u& O. t
{ int i,k,m,n,num[50],q,*p;
- Y5 `0 A. ?1 u" O% t. H7 M clrscr();
4 V/ w) I; f3 {, U$ ^ printf("input number of person: n=");6 j- S( g- ?1 w: v- g5 y7 y
scanf("%d",&n);
) [; Z6 a, W0 a$ R0 R- sprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
: T$ T$ m4 _0 S) z6 f scanf("%d",&q);
$ x5 U8 x0 u1 N- a G) l; S/ k8 o8 \ p=num;/ o' Z8 ~1 P, ?4 ^
for(i=0;i<n;i++)$ m% M! E, S- k/ T
*(p+i)=i+1;
( Q5 N W8 S- @: O& P ^7 j i=0;
& H0 h- q% f t' \/ \ k=0;0 s, ^7 S5 C8 {1 ]
m=0;
0 T7 O/ }$ D; d+ ? while(m<n-1)8 R4 U2 A) y4 e, S$ p4 |
{if(*(p+i)!=0) k++;
' c! Q6 j4 O; x- s if(k==q)
' K* X4 Z5 x( P+ ?; F. B' j+ x { *(p+i)=0;
4 D% h8 Y6 V; S0 j7 E! Z0 Y& F" Q+ Y k=0;; C8 B! n; Y/ J0 Y7 |4 Z$ [" U. o
m++;7 Z( L" n4 Q8 y& F
}
) a7 e' @- Q6 r9 s i++;. M8 \" _4 W, X) Y7 X
if(i==n)i=0;
0 o% ?# P1 k( c }
: f) ?9 l$ w, b while(*p==0)p++;% N4 I1 I) L# g
printf("The last one is NO:%d\n",*p);7 Z8 u6 e4 t, t& v; f/ i5 L9 ^6 U5 q
getch();2 f3 k, ?+ _6 ]) `! g! B! n" i/ t
5 L; J, i$ x" c/ t7 w. R) L; h( n} |
|