|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!! }9 R. s% Z. w7 n, A3 c3 L
这几天我在忙着编一个问题,我用了一种方法编出来!; _; v: f8 K3 U
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!) |# W8 V5 X2 Q# c y
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
4 ?$ Y E4 L7 y3 A# x3 G- h: \) z
6 Q! h9 Q; H; @2 D0 m 题目8 Q. U9 ~: ~7 }/ \2 ~
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。+ O( Q3 N0 {3 b+ l5 g, e, j+ f
第一种方法:利用循环链表
/ h$ X4 q2 P# l) }#include<stdio.h>
- \# ?8 E/ h2 {# t) |#include<malloc.h>
7 [. c; K- ]! m2 B#define M 8 //共有8只猴子4 `: ~# u O. N5 o& R- K
#define N 3 //数到3只时退出第三只% W+ B) ]5 G: K0 Y# Z/ W! b
typedef struct monkey
0 A0 s- w5 H$ Z) @% i) c9 t( X{int number;- p* m; w. L* K
int flag;
8 T/ w+ w& b/ ^8 o5 C0 |' G% N* |" Zstruct monkey* next;
9 n- D7 D$ y" d( y% R}MONKEY;+ `5 B5 D5 c8 Q# H
main(); m+ a" Y. S; F1 o5 h
{ MONKEY *head=NULL,*p,*s;
$ j5 L, M& A) J, J# j int i,sum=0,count=0;; f) `2 D+ d9 J2 { H
clrscr(); //清屏" D4 W) v! l9 j9 e# T2 `) B
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
% y4 J7 H R% ] p->number=1;p->flag=1;
$ e9 L0 i. T0 x p->next=head;/ z- d# Q! P7 `9 y7 z {
head=p;
" N5 P+ F: `: a2 ? for(i=2;i<=M;i++)
9 M' l+ _9 F f4 ` { s=(MONKEY *)malloc(sizeof(MONKEY));
; ]* ?- h: b& Q8 @ v1 z s->number=i;s->flag=1;
2 r, u" r* u1 @$ Z, }' W8 q; T s->next=head;3 n, T7 Z9 }% [- w# z& N# {- f! F" R
p->next=s;p=p->next;5 q7 @; n# `/ V/ o2 D5 l; q
}+ m C9 U" f% D* c) r* Q9 Q# G
p=head;
; H1 J, f, E+ q2 ~* Q for(;;)& G4 k4 Z% D/ J
{if(p->flag==1)
2 R5 f* E. ]4 t/ y2 _: p7 v count++;% T b I) a) A6 J4 V, w
if(count==N)
0 G U+ t$ P) k, e( @( [ T1 g6 c {p->flag=0;
3 g' W- v* K1 e5 ~8 s7 E count=0;
; J; @8 ~: A2 y: w6 K9 v7 w sum++;}' x8 |4 D1 R: f
if(sum==M-1)5 b+ r& X4 E) z/ d/ V
break;3 _- F! b; Y1 Z5 O% b, n& M
p=p->next;. u' Q8 q6 R/ [
}
( u" l0 r1 ~: V% ]1 L- L' } p=
5 `& t2 ~0 C# j8 U$ ^ \! R" L head;
8 c4 ?: K1 H* x4 k( m! E3 h for(i=1;i<=M;i++)
- k2 m8 _9 K. w" ?9 r { if(p->flag==1)! l6 E1 T' r$ _' f! P- d
printf("\t%d",p->number);
2 v; ~ z5 l' \( s b' \ p=p->next;- t+ G( Y' D' n! K
}0 s' F. e# t$ m, ~+ r z6 G
; y0 |# J! H; }$ e( W, C. n1 [
' X& h) Y& R% c3 w& t4 g9 ~: l+ V+ ^+ i7 @) B- \8 g% y c
} 7 S! m! H4 J4 N! u* R; ^* x9 h
第二种方法:数组
% {. w' b8 }4 i) n6 G6 e( k#include<stdio.h># G4 T- J; G3 c
#define M 8# a$ H% [0 p5 l( Z% b
struct monkey
5 f5 H" L% C" {* Q! M2 b+ |" [{int number;
- W- k0 `# O, u6 B* r+ `5 l: qint nextp;2 }# p" E9 y, q4 l) ?! q; r5 h
}link[M+1];+ P/ G1 p$ U3 q, H% g' E1 `
0 b* ?) |0 o$ G9 @7 o- s, [) C# I$ Gvoid main()
% |! G1 V, W1 Z% O. o{int i,count,h;7 Q: h9 M* H7 u( A
for(i=1;i<=M;i++)4 {. e ~: `. K3 \& @
{ if(i==M)9 }( R! Y% g T6 T/ ?1 f+ K. g
link[i].nextp=1;, W. r3 m5 t1 t* x
else a5 S- @ D2 V: `
link[i].nextp=i+1;
& l+ m/ w& H1 q link[i].number=i;7 W" Y, [' B7 H- E
}
$ ]! M3 d: ]2 o* rprintf("\n");
4 m; n; V' f0 R/ M8 w8 j" Fcount=0;3 B8 d9 ]$ r& l# Q9 B+ _5 c" f
h=M;; d/ R9 Q- f, {- z) q2 A
printf("依次退出的猴子: \n");
8 V& l. u9 m c( h; {/ rwhile(count<M-1)
' j4 `( n2 c: J9 Q* ?4 d{i=0;
; l: n F: A9 m# W& _1 H/ \while(i!=3)* i1 ~. O2 }- E! d E3 B! z
{ h=link[h].nextp;( }0 t% D+ D3 [; g
if(link[h].number)
0 y9 K" T A; @! f( {0 q i++;}7 ~: W B# Q5 X) ^! l
. n/ x# M( d1 F3 B7 a/ hprintf("%4d",link[h].number);
! s! y; s; Y; P: T9 v$ ~, {, u) clink[h].number=0;
. h0 V; m! Q, {count++;3 q( z3 F$ e T2 t, O; h. d" ~
}) i9 A6 x' @2 y+ p) h. Y
0 S' Y0 \+ o' c, v$ m9 H. z
printf("\n大王是:");% D* _4 t+ X; h
for(i=1;i<=M;i++)4 i' q8 ]5 h7 v/ n; b& {" t
if(link[i].number)
% b2 Y j! @% B( o printf("%3d\n",link[i].number);
j, x/ V5 k0 |0 O1 E+ Q0 `5 S. B: ^3 `$ J
! _, t5 T5 C q) \) E* \+ H
} % L' O! L$ O% J
第三种是普通方法for循环% J9 @4 E D$ |* l- r; J; Y4 C
#include<stdio.h>2 T6 F4 ]4 [ P& e
void main()
7 j4 M" q+ g$ A' Y' b8 r; S* d( ~- }1 N{ int i,k,m,n,num[50],q,*p;/ e% w4 U8 P' ]. M, J- j
clrscr();
) k) o( S2 `/ z o printf("input number of person: n=");
5 m7 u9 e3 j. Y& C, a+ ^6 R+ M- [ scanf("%d",&n);
& a. z) ]- p! r# ]printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只. O: M1 y! R; r3 |' j( @, [/ D" i
scanf("%d",&q);: C& R9 {% c( l( @* g z9 [
p=num;! O! p* T1 } c# S& M2 H
for(i=0;i<n;i++)$ ^% w- U1 G! V
*(p+i)=i+1;
) u$ c5 m g' A i=0;
; h! A: q+ N. `+ G: ?* X- X3 q k=0;
, Q7 F2 V9 s( Q! l* j M# U3 a m=0;6 c3 U/ u6 F' S5 p4 o1 a$ f
while(m<n-1)
" m+ s$ @# b; M4 M' y; L' R( o {if(*(p+i)!=0) k++;9 G' j9 Y1 T+ X3 {
if(k==q)% d4 h( k; f' I1 k" i
{ *(p+i)=0;
; J. S! t+ l& C9 V1 |3 v k=0;
) {) }3 f& \' E6 ~& G9 q% B m++;
4 m k) @3 U3 D3 B+ F }& Q- A4 y- }- y
i++;" e& x+ {" q; o; Y7 l- A
if(i==n)i=0;
: @# s; g3 g0 \, T: D2 _0 [$ g }# i/ N ~8 b% ~ o1 \- j) E
while(*p==0)p++;) Z: k. d, H1 ]
printf("The last one is NO:%d\n",*p);
9 t0 _6 N. x, u- D9 a getch();
5 `! P2 E3 ]/ Y( X3 Q+ m) K
( Q3 }5 f3 e- W/ V/ F} |
|