|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!9 c. X6 a% A0 j
这几天我在忙着编一个问题,我用了一种方法编出来!
9 ~4 D9 y, R4 G. n2 ~; J- f但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!; l |1 {! M$ L
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
% m( v# L5 V0 W4 j3 X) P- d
" c. e4 q8 E( Y
. O7 c" @; {" \3 F7 M0 P 题目
3 C+ k2 L$ K: |& M' z/ y) ]山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
1 w3 j3 o" D7 L% Z3 o第一种方法:利用循环链表
6 b! q* s, {3 r+ ~' p#include<stdio.h>
( b1 v3 |) P" b! _, P/ v/ D2 g8 O#include<malloc.h>
; o+ ~9 N/ R j$ ^#define M 8 //共有8只猴子
& N9 w, K* O; j#define N 3 //数到3只时退出第三只4 ] g6 T1 b7 t: M% n9 K: ^8 i
typedef struct monkey( P6 h4 q8 J( _& J4 U% e' _5 u
{int number;6 l, u3 f# C, z# u) w0 |, W
int flag;) b5 h* p n) A7 u- E
struct monkey* next;" B9 [9 G/ B$ R& L) i7 W8 u2 V
}MONKEY;2 x( H4 j0 m) n4 \
main()
2 O( c; t8 N& u; d0 ^{ MONKEY *head=NULL,*p,*s;
. k3 S4 Y, b: {1 {- Q" }$ ~ int i,sum=0,count=0;
# d) l5 k: J% J% k3 X7 l clrscr(); //清屏0 S7 `8 V% d9 f/ n. S* [4 J O; U
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存, |; g0 k2 J7 e5 @1 i/ E' e" E( t
p->number=1;p->flag=1;( f( l$ N/ O8 g, u+ i- }1 F
p->next=head;0 Q0 ~2 ^1 I( Y Y( W* C
head=p;5 \" I' Y2 a/ O" J' u* C8 b
for(i=2;i<=M;i++)
/ L. I$ [: L) b9 C* O7 v { s=(MONKEY *)malloc(sizeof(MONKEY));
" |" `+ ]" `3 r9 J s->number=i;s->flag=1;
* w' `, W3 C2 s( o9 e$ \2 ~$ I s->next=head;% O0 e3 T- W5 c
p->next=s;p=p->next;
/ u; h/ J. [& {% ~ d* R+ L' E }
5 a3 l1 U |) r p=head;) Q4 } d3 A, q
for(;;), `% l0 ~# N# t( f3 o. @
{if(p->flag==1)
q& }" B5 v4 n# \$ L* W1 l count++;' N0 f5 |$ C/ e0 W5 }
if(count==N)
5 r9 L8 y9 A$ X2 c1 t {p->flag=0;
$ g/ z- W7 { O2 R% e! N7 `) O count=0;
& ?. E% Q1 b; }$ a1 S sum++;}
6 l1 z) J, z% _ if(sum==M-1)7 ^0 D0 E. Q w& I- s8 `
break;
8 `/ r, C' Y% i$ {% |: K2 P% ^5 c p=p->next;( {7 ~' e6 N# g/ @3 d% R
}" D- {# B! y1 T+ a# E' H
p=# z7 i) f2 X: e6 }
head;
% H+ H# j( Q2 W( f* L7 x; ^ e for(i=1;i<=M;i++)2 k m8 k$ b- V0 Z6 g
{ if(p->flag==1)
0 z; {# W. E- ?1 M, K printf("\t%d",p->number);
1 F1 p% K. d; l9 }" m. H6 L) r: G p=p->next;+ b% Z0 }6 x/ y P- b' L6 Q& e i
}1 k% \5 F6 U' x- [. O5 _! y
% ]9 H* ~5 g* z% m2 k$ f+ v; d V2 p* s5 B+ W
/ d2 E! I- g) T} 3 r$ }# ~3 C9 H4 p
第二种方法:数组( v, A5 v( u9 T, I' J5 x
#include<stdio.h>
7 e# W6 a7 A; }3 X; \" N2 ~#define M 8
2 o! E) _0 v; L' Istruct monkey+ h, i& [2 `3 T
{int number;
. m# G; h+ C" N$ U) P" ~int nextp;
, i. Q S% m% F0 h$ l}link[M+1];; I. q5 r* f: u7 p
# Y5 u+ w L- Q
void main()
% _; \% f2 D5 B0 O{int i,count,h;" {* d$ h3 }* G3 y p1 T7 A9 _/ b
for(i=1;i<=M;i++) G5 U: D3 R3 h
{ if(i==M)
/ P/ A9 b6 q7 y( q1 t+ {! K) N! W link[i].nextp=1;3 a( C x4 X3 Y& [4 e: X" D6 ^
else- w# J1 _4 b3 c* T* h
link[i].nextp=i+1;
" {9 Q9 b M5 x* k1 i) C link[i].number=i;7 e- g0 k+ ]- r7 U
}
% f; h. j, Y) K( a2 V( Xprintf("\n");5 n- z( E1 i7 ~& w
count=0;
4 e* d6 z4 o$ z! O; C* Eh=M;; @" i+ K% o' X/ }8 x$ ~
printf("依次退出的猴子: \n");
9 m' J& _+ p, k* }3 nwhile(count<M-1)
9 l6 T$ h8 Z, G2 h: a6 `) C( x* q{i=0;! M: L: U4 o$ g% H$ p; m
while(i!=3)1 e e: s9 H5 a0 ~' R' N$ N/ V
{ h=link[h].nextp;3 m. Z+ p8 Y# z" ^
if(link[h].number)
7 _# _5 h C8 m5 E8 O, J1 ^ i++;}
8 B& D8 d' E" y; ~* K6 N( ^2 ^' o9 |4 x6 ?( {9 M; d6 `# }7 }" m
printf("%4d",link[h].number);
: k, N% W4 A7 S, blink[h].number=0;
+ w# C/ u' E3 I |+ J1 p; z7 Zcount++;
( V4 y) N( |* p$ s4 w" S+ D}
5 O$ [& x+ ?3 z
' ?% X1 U" k/ ^! L2 wprintf("\n大王是:");) U' J" R' w- m z
for(i=1;i<=M;i++). Z& [& k0 _' s* A" C
if(link[i].number)9 `- {0 R4 U. X
printf("%3d\n",link[i].number);8 Y" p6 y# \ b' M
" P! A. W* {* W' ?( X& C5 F5 j2 P+ \ Z' E1 Q' V
}
2 a; B+ _, v3 N8 {1 d第三种是普通方法for循环
/ A/ ~, z* J1 u% K9 @/ [#include<stdio.h>: `/ S3 s0 e8 [4 m
void main(), ~- z0 ^! q5 z
{ int i,k,m,n,num[50],q,*p;
8 z" @2 V9 e: K5 g clrscr(); Y! n2 j/ j% d9 H6 g/ D
printf("input number of person: n=");
. ~8 O' X# w& z scanf("%d",&n);
2 w* ~) r$ I8 e1 i( u% Z' C) vprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
5 e9 T2 X) F" ?& _+ H scanf("%d",&q);( Q) ]: ?& \. _) F" `/ k5 x0 `% Z2 y
p=num;4 ]7 n, S, w- f! g( n; e# R' i
for(i=0;i<n;i++)
5 A, l5 I z2 ?* m6 e *(p+i)=i+1;* e D' O" E+ K+ o1 C1 \ k
i=0;
: S7 [2 g) r5 V& C" X1 X1 l3 n k=0;
( z$ z$ v+ c* |' m m=0;8 d9 b# f% {1 S! J
while(m<n-1)
, m0 V3 ]( [" F7 g. y1 D {if(*(p+i)!=0) k++;: U8 `/ h5 d0 D0 b$ P. C( C
if(k==q)/ a6 L; G- x* z. s& f! S
{ *(p+i)=0;- W% E- I+ v8 b& @' o' i! S
k=0;/ U0 W9 e: i {" H* A9 k* S
m++;
# h" p. q5 k" @ }
K2 [: k0 J4 h. K' S i++;; f/ ]4 v1 @. Y
if(i==n)i=0;
. h$ H; x2 W E- C; @7 J* F }+ S* V$ ]/ i8 y7 u- p# \
while(*p==0)p++;0 G- V1 N; G h) Q5 P
printf("The last one is NO:%d\n",*p);8 r4 I) q& n+ N7 {
getch();
: r6 V# ^+ _8 R: [% T0 b3 l5 e# J% }
} |
|