|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
3 T3 R, I" b o这几天我在忙着编一个问题,我用了一种方法编出来!4 Z- P. y) S Y4 D; k
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
: u; z$ B) n& L4 i9 [注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
* g: a) B* t8 g4 J E- ~6 g3 \: V. v5 L- r
/ I% c+ C3 g2 W& h
题目 e! f$ b# N0 D7 Z6 E% {( ]2 i
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
9 h( A4 G! Y9 X! L+ r& v: K第一种方法:利用循环链表
, E* ]& ` J+ `4 F" l# _#include<stdio.h>7 P2 P, K: w! b: _/ \) C( ~2 @
#include<malloc.h>
5 W+ p" X* D( H& t$ o" Z- K; A#define M 8 //共有8只猴子
# ` i9 q+ T5 r5 _5 Z: U1 R4 D* `9 }#define N 3 //数到3只时退出第三只
% w7 y# D8 ^% G6 Ptypedef struct monkey
, Q x% B1 H: u! W; ^{int number;! V$ Q' x& B8 a
int flag;
m5 S8 d g1 [0 D# L0 F, kstruct monkey* next;
7 |: o; F1 A M3 X- N! F0 ^}MONKEY;
" u" T+ Q% j) K' s1 N3 n8 imain()) v( P" u1 J* |. \
{ MONKEY *head=NULL,*p,*s;
3 N0 O V9 x) A9 k8 d% t9 ^8 j int i,sum=0,count=0;
3 Z2 e5 c! Z( V: p& a clrscr(); //清屏
. m& D% `* m( } p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存$ p) J8 q7 E( h$ H( w
p->number=1;p->flag=1;5 `* y: w1 k3 y, k0 W; ~
p->next=head;
! ]4 w$ A) l& T; r" z# B% f3 q8 J head=p;
' b+ N7 U; D* v1 q for(i=2;i<=M;i++)
$ p$ m* R5 C( e6 R9 i { s=(MONKEY *)malloc(sizeof(MONKEY));
5 @4 { H5 |9 B0 X { s->number=i;s->flag=1;3 |: g9 k* c8 O6 x1 q
s->next=head;. L. l( h- t5 P0 k6 H) I
p->next=s;p=p->next;
- `! q- c& [4 S* w& ] }
. i4 E/ u# @) a1 o* B p=head;
8 a: L- A& |8 r" I( l# A for(;;)
8 j; T+ f6 i+ M/ Y {if(p->flag==1)8 \! \. L% G, |7 l$ s
count++;) G' Z8 v$ c$ w7 @# ^, N& c
if(count==N)
4 z4 h) W% k& F2 S8 G+ m& E# I; | {p->flag=0;$ V' K6 T1 c0 T, ?8 x+ [1 c" i
count=0;8 _; \8 I% r _8 {. ?: c% ~
sum++;}3 V) o2 f: t, K5 T3 t3 m, t! Y
if(sum==M-1)
2 v3 [+ q. C7 o7 Z2 w break;
1 H, A8 G1 B7 p* f2 s. [, R4 p) u$ u p=p->next;
' w) ^6 o0 \& m% Z, ~9 P& j) o' V# Z& P }5 P0 O4 O) _ E2 f `
p=! O, S$ O+ u5 \; H6 T
head;8 i; d. x$ v% c. i+ ]
for(i=1;i<=M;i++)0 `7 g9 |/ `: y& h' A& X# ~
{ if(p->flag==1)
" I2 W$ {* U+ q( z printf("\t%d",p->number);
' u' T `3 Q5 D( C1 i+ Q8 u$ J p=p->next;
& `: M& H* p2 q+ R& w/ U6 C1 O }8 Y P4 ~3 @3 ^$ Z
7 I: s( N$ u3 ^; G0 m( e8 w
' E1 A0 ?; d" [0 H* a
+ r$ |. W9 v" g4 O2 e3 H} ; D& g# z, k8 ~. D+ [$ x
第二种方法:数组
/ l0 k. s* Z9 u- x3 D#include<stdio.h>4 e a! L& f3 I7 }9 S# H- L% i
#define M 8! y. N4 e* Q2 g7 r
struct monkey: m/ q. O+ o6 l( b" S0 ^
{int number;
a" A% w' K" D% hint nextp;- f& `4 v" o3 ~/ I
}link[M+1];# u7 p) @/ d. u+ n
, t; k; g0 r/ F' j- P( k! hvoid main()) J, |4 \% [# E
{int i,count,h;, ?6 U. I- X9 y
for(i=1;i<=M;i++)) e9 M9 Q' V' Q
{ if(i==M)3 L9 a j7 g5 s( ~& J3 e
link[i].nextp=1;. y6 ^; Y$ \: {4 l, c5 t+ X1 u
else
6 Q% D9 j6 y- u) O N link[i].nextp=i+1;
1 e( ~: r3 r# D& s* t, Y5 @ link[i].number=i;: C1 r8 f0 g6 b0 V
}9 \! t% l4 c9 q- M# X
printf("\n");8 I" l' D! Y8 [
count=0;
% @6 H& d! I; F# n* \6 T+ A$ Z/ th=M;
/ }8 f6 j. y: O( hprintf("依次退出的猴子: \n");
( M$ D: e* w4 B$ Rwhile(count<M-1): B8 [( s' p% t7 g9 x
{i=0;
5 ~& a/ r) m9 d" X. uwhile(i!=3)
! w+ u( `5 v: i3 R" q9 X{ h=link[h].nextp;/ N" e. Z# P, r. O0 S
if(link[h].number)
& f+ |9 C/ j7 G8 H4 |8 v3 n+ V* @ i++;}
9 M& d' }4 Z5 h& R& f! L# q# u j! W
printf("%4d",link[h].number);
# T+ a; H S; v; }link[h].number=0;
) L! F* p" q8 }, \count++;
( ^- S- Q# {) z1 h/ m6 \5 P4 q}
9 g! p1 _ t9 x* p2 n( G1 H' j- d* }) A. m4 W
printf("\n大王是:");' K; F8 B' Q8 l. D: l
for(i=1;i<=M;i++)/ F1 b/ v, J/ B
if(link[i].number)3 W$ l# {5 D* F2 g' x% q7 ]& T# `# @
printf("%3d\n",link[i].number); v5 w, ~, k3 q# J% Z: P
! Y* t$ e7 H( C
3 ?& \1 o8 { D# ]4 _4 g3 ^# [3 i} - E+ K# o6 W# Q( Y
第三种是普通方法for循环
+ M) c+ S+ H. G8 f- ]$ Q#include<stdio.h>
6 k/ W1 Q) S Yvoid main()
5 Q/ `4 S7 n" Q6 ]: M{ int i,k,m,n,num[50],q,*p;
) }6 S/ Z& f: y% d& h2 @ clrscr();/ d+ t4 M9 O; ~& g- [% I
printf("input number of person: n=");
! [, e# K" k8 Z' c: N5 l2 t scanf("%d",&n);/ `2 y _1 L3 A7 w+ e( o2 o" M+ f% n* K
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
0 U8 o5 \/ ~6 _* f y0 W scanf("%d",&q);1 {, }0 o* y& ~
p=num;1 [; Z1 a( ]& d x
for(i=0;i<n;i++)8 r. ^3 m' x) g' P
*(p+i)=i+1;& r4 b4 g3 e- ^
i=0;
7 |0 i) o5 K3 w5 P0 Z: S k=0;0 d* Z0 J8 Y$ H4 }4 [$ P4 w$ e) k
m=0;# H$ E: { H6 b/ Y
while(m<n-1)% X) R" k1 h0 \8 E" t; N
{if(*(p+i)!=0) k++;
: X/ u/ U! ^6 N if(k==q)0 O0 n& f C3 z% O/ L3 j+ L. N; O: q0 H
{ *(p+i)=0;
5 X& s0 f. V! D: O k=0;8 h( N2 o$ g* f* `9 \$ H
m++;
! u3 Y9 g U1 I8 g5 H }
3 W$ ^9 G5 O& R9 d$ W- M i++;
2 R0 j. h' ]( i4 F2 `+ T# P if(i==n)i=0;
" z$ N4 c* ~4 d" E }
# o/ D3 C! d P y/ n5 ` while(*p==0)p++;
5 I* g; I. D- U( R! F printf("The last one is NO:%d\n",*p);2 M( _) I- L3 H
getch();, M, ~8 U/ c, I
3 x. O; A v3 g; `: l9 [5 {0 N
} |
|