|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
; z$ k+ e3 W0 m$ }0 F) S这几天我在忙着编一个问题,我用了一种方法编出来!
& ^9 o; E- A$ X& e但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
$ k' v& Q9 v9 ?$ Z+ Y- _ S注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
4 y6 [7 ?) a! r4 Y' H) v2 |$ j1 j% x3 b' w
% U6 S2 ?" Q6 N
题目" P6 }& u0 `8 y, I- B, A5 a" ^
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。: N2 V6 [8 D! k
第一种方法:利用循环链表
& V& @+ O7 m. x* p#include<stdio.h>: Z9 h, J& [& H5 @
#include<malloc.h>( X/ p4 ?4 O* P, [/ q
#define M 8 //共有8只猴子
5 u M) p3 E9 h- k#define N 3 //数到3只时退出第三只+ r# D3 n! }7 X3 |% A
typedef struct monkey
2 _6 Y% F& D! n+ Q0 f% [2 _{int number;5 W4 I( @9 k" K1 ]
int flag;
2 W; a' P- i) R, U' ustruct monkey* next;1 @# R* i$ S) Z; ?" R
}MONKEY;2 d. v& F4 O9 V+ L" W9 ]. P# [! u
main()
% T* B" H$ P0 @; ^+ X{ MONKEY *head=NULL,*p,*s;; Y2 D5 j6 M9 F( J
int i,sum=0,count=0;
9 y: M1 s- E: S clrscr(); //清屏0 N( G& `" T/ H2 q
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存- B, L$ c$ F" D7 H! o5 R
p->number=1;p->flag=1;& }; q& g) ~; f
p->next=head;
. [' Z( @, G J, i$ M head=p;8 r; V! I! W( L: _3 z
for(i=2;i<=M;i++)
M, t: J4 M2 N8 d { s=(MONKEY *)malloc(sizeof(MONKEY));
9 N( o$ `) v( X q3 H( E. p; K s->number=i;s->flag=1;
$ ]& R+ I8 D$ W& ?$ \: C s->next=head;) U7 c) B/ T; y, K+ S7 w+ E
p->next=s;p=p->next;2 H7 ]: }" @+ G
}
* }- R2 O1 i) n) ? ~ p=head;5 L3 B0 L1 z2 o
for(;;)/ } J1 f5 J2 n
{if(p->flag==1)! S$ ]. @% }- N* ]7 G1 N7 X
count++;
( _9 e0 y1 w; p7 _ ^; J0 V if(count==N)
3 o% ]( b) R: W/ Z! u7 F {p->flag=0;
5 M4 P6 }+ X# z# c count=0;6 }' m2 `& C* u$ f
sum++;}. J0 s; O2 k |
if(sum==M-1)
/ W' l E, F' @ break;" i3 a. @% Q* T% y& A$ U1 }
p=p->next;% `' u+ `1 y8 x, S, w
}
4 V/ z# f1 `' ]+ H6 B2 h, T9 k p=
& n1 w9 u* [% n' F0 ~' u head;
% N' o0 m. [$ ^! F! q/ E% M* H5 m6 a for(i=1;i<=M;i++)
# M# \3 x1 M5 h) S0 ~& Q { if(p->flag==1)
" U4 a8 X2 a, c5 s' A' } printf("\t%d",p->number);1 \; p' B8 F( n. [. l
p=p->next;6 O8 e& w% j$ W7 v$ s! y
}
5 L- X, s) _+ c5 x5 ?/ o3 U2 Y. q/ B# x
1 K2 G; I6 E5 L. B+ _" @+ ^
/ r2 [0 ^' A; l. r& c, }" d. H} $ g% ]' W3 e9 `$ r/ W
第二种方法:数组
7 M4 l" {/ D" S9 x0 V0 ^. s#include<stdio.h>) b1 x! j. M$ F. [& Z& }
#define M 8
+ M# W% t% i: S) r* d9 A- ]struct monkey0 T5 J. \! ?. {/ Q9 K O1 k$ s& ]
{int number;; K. E& I- s0 i1 ?
int nextp;& m" y3 W. d2 ]# F4 a
}link[M+1];
4 }: p# n/ n) ]! q! O ^# [9 H7 A7 S+ q3 v3 S% { T
void main()8 p8 Q' v/ T( @1 c" I7 O
{int i,count,h;) H- l( U6 j5 u1 y
for(i=1;i<=M;i++)/ @ ^) g" k$ M
{ if(i==M)
$ o+ Z% f4 I7 u link[i].nextp=1;" T" h1 p$ h1 U6 h+ e) [
else
' z8 W9 r" ~) i' s; @0 c9 M link[i].nextp=i+1;
# H+ [. w# X" s link[i].number=i;/ s# B! D: X, r9 @# o7 h M0 ]% U
}
/ M7 {. X/ W0 T( X5 W5 R/ n+ j- Sprintf("\n");! i' s3 d' ~7 ]8 x
count=0;
# l/ O# r6 N* _/ g1 Ah=M;& ?0 J' i" T) m- @. v
printf("依次退出的猴子: \n");
: S: ~' M9 ^* d* h% c: o: Dwhile(count<M-1)
3 H4 Y3 d0 R) E9 |# a# b{i=0;& p7 R& m' o& W( F% C( S2 s& W0 x: f
while(i!=3)- m* _ E, w0 Y# a# [( j4 y Z0 g
{ h=link[h].nextp;
& [+ D5 t3 U. D+ Q6 `% K if(link[h].number)8 Z* C& q) R2 y/ Y7 u
i++;}' v* [" M' v: F8 X, A
7 P* ]- S. c ^; n! {- M; |3 i7 T" ?printf("%4d",link[h].number);: p8 p& H$ ]1 q% R
link[h].number=0;
) Y* U1 r" I1 K P" u5 fcount++;& U, m$ I+ g1 X" E2 y, _
}+ Y( R9 ?* S$ Q4 J# a% Y
: X8 P! o5 L0 X3 `printf("\n大王是:");- ~' i6 u j% ?' f6 i9 H9 r2 F% d
for(i=1;i<=M;i++)
1 Y+ p; C, \) ` e/ B! ~2 r if(link[i].number)
1 X7 v- r) E: p( t4 k printf("%3d\n",link[i].number);/ F+ R/ G7 g+ f, S! w( b$ k4 |1 A( A
& N% v1 t$ n4 N$ m$ W
0 R) C/ h7 T( O& y; z' M( \}
& P+ K7 n* V! t7 w! u第三种是普通方法for循环( Z$ \7 o2 {8 F: U/ s/ d
#include<stdio.h>
: N/ J( ~: ]$ x3 k) [; Jvoid main()
. ^) v/ ~9 X3 V& }* n5 K6 p7 Y [' H{ int i,k,m,n,num[50],q,*p;
, }5 j; I8 c( s M3 ]) q, a+ r8 ?& D clrscr();
* x! e% `7 J8 A6 j4 |0 Q, T" D( v printf("input number of person: n=");
+ n Q! v4 `3 b$ l6 W1 P! {$ Z; P scanf("%d",&n);1 C7 _2 S0 t9 i; o0 C; j
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只% [7 Q% A& J r2 ?3 E
scanf("%d",&q);; S0 _+ b$ Z1 l. ?- O
p=num;$ j% r+ L* x' r: I6 V" z
for(i=0;i<n;i++)* {) j/ R& K$ o6 J
*(p+i)=i+1;
% d( V, v( j, k i=0;
! E7 l% @# @9 h7 @ k=0;' ~1 Z; J+ K2 e1 E& p+ r, i" ^
m=0;' O9 _; b1 d1 D( l& l
while(m<n-1)" S$ ^$ g7 ^" x, B/ D
{if(*(p+i)!=0) k++;
6 w" @+ p+ F6 `- r9 V% h if(k==q)
0 L+ U' z2 r0 X0 s# N { *(p+i)=0;
3 R+ G% n4 v% A e$ C0 I k=0;" ]6 T7 D& |# [# j! g
m++;
7 l# r# @# i1 b }
: L& Y! `: C; E5 G e+ j& _" I# r% D i++;
. ^0 Z8 Y& S5 H! ] if(i==n)i=0;
$ ]& ]% f! S* x0 B }
! |! g8 i/ W1 \& n* q while(*p==0)p++;) X$ c1 R1 N* z* o( W
printf("The last one is NO:%d\n",*p);
! D; i$ B; F4 g% D4 K9 y getch();( f- E( }- B9 |1 i+ t6 R
- b* f4 H) u8 s6 Q& ]' o" Q6 w} |
|