|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!0 ?2 L9 X6 W3 j9 |/ U+ h# C
这几天我在忙着编一个问题,我用了一种方法编出来!
# _- N8 Z- B7 Y/ q8 R# Q但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
; { A) `" u3 U( Z0 c注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
3 |5 r- Z1 r8 W5 l
6 y/ O$ h, q& A1 F! X5 s
& S$ d6 C1 |/ D6 y0 O 题目4 M. v+ `( z2 c6 d) ^3 a" {% q! Q' \
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。* }% \9 Y8 s4 e# Q1 C
第一种方法:利用循环链表
+ l( ~2 @4 P4 T( V* z5 U' A7 ~% f#include<stdio.h>
. C* |7 {; C% c! I#include<malloc.h>
, N) u) n; c' P9 c- \, Y#define M 8 //共有8只猴子4 V. N5 k, c- h8 ]
#define N 3 //数到3只时退出第三只% W% L* H9 S: |, k$ i4 V
typedef struct monkey
" Z6 W4 z( F: u0 l0 E d{int number;1 _1 ?, l4 G8 q/ P
int flag;
& |0 c8 n% g2 Z% mstruct monkey* next; h) r: c N$ I, n4 c. L6 F% ^4 \9 v- U% h
}MONKEY;
6 ^$ q1 \' {0 ]& Cmain()& t2 M" y9 i1 z; p
{ MONKEY *head=NULL,*p,*s;
5 f! v& S, N$ u# Y& ` int i,sum=0,count=0;8 D5 z; X8 b7 u% C$ _
clrscr(); //清屏
% K8 v; z: X" C4 K3 c W8 h' p p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
0 D* R4 Y0 I4 L( T+ I/ }; f3 { p->number=1;p->flag=1;
6 l6 I2 ~ E! Z B0 ?. S p->next=head;
" s" w9 o4 b. c/ x6 R/ l+ @+ A head=p;9 ~6 j4 v" y P
for(i=2;i<=M;i++)1 S2 Z2 ^; b* k6 g9 z
{ s=(MONKEY *)malloc(sizeof(MONKEY));
$ w. J- E5 f& z8 I' N3 I. B s->number=i;s->flag=1;! s) @+ L% @5 _2 Q3 h7 R
s->next=head;
, Y# o, V5 }# N9 `0 V8 @, K6 W p->next=s;p=p->next;. _/ p; S) P; T( F4 H) B
}
- p" N+ A) _* k0 U) G0 X" I% I1 F p=head;% \$ [: B6 f* v J9 k
for(;;)
. A) J: i0 X! ^( B- s6 J4 _ {if(p->flag==1)% d z# a' ]" s3 r) x. ?) x
count++;
" C, P% M3 W/ Q) i! e' O+ m if(count==N)
) P0 y! k- g2 ] {p->flag=0;
& a3 I5 e" ^! U# ^ count=0;
( F5 P5 ]% L, p! J0 u sum++;}1 a- S! ]( f" T2 x- \) z0 Q
if(sum==M-1)
2 e9 Y) x: @! q* O% `) w* ^* _; G break;& K( q5 Z5 B. g- d K* n9 ?
p=p->next;% `8 D; i, k8 J5 S
}& H" {% d" U8 g
p=
4 a$ c ?: u, F5 t head;
; e4 n$ X$ Y8 r for(i=1;i<=M;i++)
' a- ~2 r* { z { if(p->flag==1)- d, M [- l2 b4 ^- K( z
printf("\t%d",p->number);/ [) F1 f) x7 W! v2 Q& A; f7 D. q0 u3 o
p=p->next;) B! `/ K) q l5 y8 _- w2 O
}
/ q' ^' N5 d) N* F
( O- [ v6 c9 ~3 m
) t5 a- w4 M: H2 L( j' Q
$ V, |+ W4 U9 {% p$ a+ Q1 b8 U$ _} 1 q z: A. L* }$ u7 G) n; C
第二种方法:数组
& x& ^& i% T: `0 ~! U, `4 f#include<stdio.h>
5 N; d5 G3 C+ L+ |#define M 8
* i" B0 y* Y, @; |1 e4 R# F# }struct monkey' A6 x- W$ e0 j; ?- Q
{int number;
. [: H) T( e+ I1 x" Q* _) s4 mint nextp;
; k# N& V. |, E7 k, j}link[M+1];
! T' M( b: [" N% j$ I5 _; w6 H4 u& h9 M1 _3 ]: F4 U; P
void main() L: P$ s! s6 S$ i
{int i,count,h;( j( h0 h6 G0 J4 L
for(i=1;i<=M;i++)' U" [" O+ N- W. H. p$ _
{ if(i==M)
3 A' M5 [" p( B5 v( V link[i].nextp=1;
1 p- _ g# f2 j# y( u e! M& u7 F else
. u4 h$ X/ |/ g- R/ W- L9 X, A link[i].nextp=i+1;
( F7 ]! r _# I0 I( x link[i].number=i;
' s( `8 H5 P" S" N: N6 v}
- Q# y0 L/ y. W7 {2 w8 x/ rprintf("\n");
2 u0 t0 U; i1 h! p( ~ e s) q" Bcount=0;
/ X* B" V) D" M# ^/ jh=M;
1 {7 R/ I) _/ ~+ J5 S4 K6 N; hprintf("依次退出的猴子: \n");( d5 B/ W7 e2 p. X4 H
while(count<M-1)$ O* M3 X0 `: z5 ^ p
{i=0;0 ?2 ?+ u, w, {9 w1 x& x6 n e
while(i!=3)$ @2 P3 j/ y1 B9 I6 Q* S
{ h=link[h].nextp;( Y! g9 l8 a6 v' t. \& q
if(link[h].number)# f- f4 T2 u6 K/ f# A
i++;}
& q" W" O# r2 }6 N8 I% I9 A0 Y+ v: }: b4 w
printf("%4d",link[h].number);* F% W, m5 _3 q( x" |
link[h].number=0;5 [' d7 a/ Q, ]$ q" s% m
count++;+ |& \' t' w. G+ ^3 F6 l( E( D
}
3 I0 M' L2 [# k9 D+ W. j* Q4 y' ]9 I$ a/ ]6 `) I
printf("\n大王是:");3 ]+ m! B1 Z% E: ?6 |
for(i=1;i<=M;i++)
' U+ n! d4 ]2 K7 `& L if(link[i].number)2 \ {3 d% A6 r% h9 ?$ H4 \
printf("%3d\n",link[i].number);
# _0 T8 O4 y+ h4 F2 I
% ~7 R% _, r8 G7 S) `" R) b
6 n- L5 h3 c+ [+ a c- X S}
$ ]1 K2 a0 j2 X( K9 c- A第三种是普通方法for循环" K( z; {& e" J, `* |. p+ d( w& P
#include<stdio.h>
: k8 T8 _' ?3 e M! a2 S4 x$ [$ j9 gvoid main()
0 Q1 T- v9 N9 _/ I; W: y- y{ int i,k,m,n,num[50],q,*p;
% S/ r- h' z4 s5 d9 ^" |8 k5 Q* @ clrscr();9 R, n9 V& h! A
printf("input number of person: n=");
4 c# d: t- J! `' P+ O scanf("%d",&n);
+ r- q2 B9 N; b+ ~* u& \4 L0 [3 aprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
/ O1 k$ \/ m# G9 W scanf("%d",&q);
5 P1 ~% i0 D& L) e p=num;( t7 h ?3 p2 C( S: p4 X
for(i=0;i<n;i++)
' K" T1 B/ g: K8 [ *(p+i)=i+1;/ ?; m+ N, d2 F. j4 v" A, f' x
i=0;" k( Q8 J" ?3 n3 \
k=0;
0 j0 W% { j6 }9 y9 f3 { m=0;
2 i) C5 j' f5 N( m: Q2 }7 T2 D while(m<n-1)! d/ A2 ^' \2 e- I2 G
{if(*(p+i)!=0) k++;/ `! M" |9 v+ Z, o& A' n8 R' f& J
if(k==q)
/ b" M- y, A3 n, G { *(p+i)=0;" O& }7 v' G# P& a
k=0;
& B+ P8 f/ C, E; o8 o, J m++;6 Q8 e) r8 a* G9 F p
}- N5 @; B" l' x- x% L% |$ K* B
i++;8 F9 a; l. w4 c. }5 L6 X2 ?
if(i==n)i=0;
! X, _& X1 }' [: G! \2 z }
~$ c7 c! B e O4 p$ y5 O- ]5 n while(*p==0)p++;
- d7 G8 X% I. h# V printf("The last one is NO:%d\n",*p);
7 m) _' X; z+ X3 r1 }# T8 c getch();% S6 B; T e1 G- d+ S
+ ` G: K5 r' N) X+ W, \3 m
} |
|