|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!( d8 h- B1 Y2 J5 p( }* S3 h# h- b
这几天我在忙着编一个问题,我用了一种方法编出来!8 f0 O0 r+ `; P1 E) g0 t; Q8 a! q
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
# ? y8 V; C. y+ x注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 9 ]. K9 h, N6 C+ e: }
& Q @' A$ I Z8 p) h" p0 ~7 _2 X+ O: W. c7 B
题目7 j! P% u$ Q; ~: t6 x
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。4 I$ m3 S1 e* k$ g6 B
第一种方法:利用循环链表
& Z, w+ a' D/ T2 |3 B' i" L3 d/ \#include<stdio.h>5 ` a, V j; S) Q1 W% {9 A
#include<malloc.h>) R' I2 W4 B7 I( h- y" c# G
#define M 8 //共有8只猴子
9 L3 f! a/ n/ q1 o#define N 3 //数到3只时退出第三只* x- J0 c/ G) H1 y
typedef struct monkey
1 x }1 u7 {. c& {7 T- U0 W1 R- l* Y{int number;3 M# |/ Y! L$ B0 {, [5 s& P
int flag;
1 k% I' x+ G8 ]6 qstruct monkey* next;
. g/ U D" y% I9 h' K( \7 t4 P$ _9 ?$ A}MONKEY;
( D1 W1 y0 ?8 z! _main()8 K. {/ Z; f, u
{ MONKEY *head=NULL,*p,*s;
; W/ B. j7 G d: Y& J, b. x int i,sum=0,count=0;1 z O+ a% d) @. W1 M( J8 ]
clrscr(); //清屏6 G, v; J/ L2 h+ T' z
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存& |* H: K: e3 q) g j. M
p->number=1;p->flag=1;" B$ T9 P+ ]: j( p5 s
p->next=head;
* o0 ^0 M8 } S, { V) U8 {0 u# h head=p;
. w% L% v' z+ X9 z( ? for(i=2;i<=M;i++)
+ B. ^9 V k1 J/ s* k' b a { s=(MONKEY *)malloc(sizeof(MONKEY));2 s8 ~- e: G% e- O4 |4 W
s->number=i;s->flag=1;
0 z5 ^# [- k; D( p" \; {6 Z( \& d s->next=head;
% l2 r8 S! K$ g. m p->next=s;p=p->next;9 \0 F/ a3 m' i; ~) p
}
" U& p3 {. M" P. ^. k* N" z p=head;
I, I, A! e" y9 c7 G for(;;)
& f2 w; L# H& Y$ I9 Q {if(p->flag==1)
9 W7 f: c$ X3 a0 z+ N" i; d count++;- @: w: P% I3 R6 `2 j' Q, l5 |
if(count==N)4 k: V6 E: B/ I6 s2 M4 C
{p->flag=0;$ \! q, q9 w& {9 z; f
count=0;
e4 n$ j) K6 t$ @' v0 e sum++;}
. P% s! d$ C, R n6 Z1 @# o if(sum==M-1)! A( i9 D7 v( o1 K0 A
break;6 o: G! j K6 m e
p=p->next;
E9 Z* v8 o/ B& o0 E2 z }8 s. m9 @! @8 R4 C3 M, O
p=. ^9 S8 v* f" o9 H6 L
head;
' l( ?3 p$ ]% R' _' j& Y% H for(i=1;i<=M;i++). ~. k# ~4 D3 Y1 @, V
{ if(p->flag==1)
* k1 I, Q% W) h8 I- u printf("\t%d",p->number);
9 S8 ?* q6 C" ]( z2 L8 j0 w S% | p=p->next;6 V! a5 n+ i7 [% H( x7 O [
}
7 t$ \+ Z2 g- O4 Y8 d7 Q
, L( _/ p& Q. o; f
# o/ D3 h( v2 l0 r: s- d( J! s2 f e: ]3 | a! j u& Q- {
} , R( G# a0 U5 z% V) h
第二种方法:数组
s+ N1 q% G+ z#include<stdio.h>5 w5 v% l C. M0 {
#define M 8: b/ H& {3 ]+ ~# L2 h9 u# k
struct monkey
5 G; ]2 C* i- [- l1 v{int number;4 A" I7 ~9 K5 f
int nextp;
: h- ?! s [( W1 v) X}link[M+1];
. i! [1 n( K6 t3 b: l
" ], W5 n3 h" Y3 _8 Kvoid main()
! u% X5 _. s8 ^$ }: g7 s{int i,count,h;5 _8 J7 p/ a0 r9 f# N# G
for(i=1;i<=M;i++)
4 ~9 V: O" G5 K) \5 l{ if(i==M)& G$ G7 p& R) |% c$ B
link[i].nextp=1;
4 v1 ^3 P7 s/ n4 J; ]& e' |& x: | else
! T8 z+ q; O4 Z# @- D. G link[i].nextp=i+1;! ]6 k; |4 k. @! n/ A' Y
link[i].number=i;/ s' Q9 j7 S# B
}& Q* s; q" f! i) a, O
printf("\n");. ?% {, Z$ P7 F. `( ~0 K: {
count=0;! d$ _2 G, L) |
h=M;
4 n: L; l0 ?# P6 W. H& s* {printf("依次退出的猴子: \n");
5 D7 o' g% @7 f* ]3 Q: bwhile(count<M-1)
) I8 |& ~$ e1 h{i=0;
! _8 X7 `( f1 f) s! U) xwhile(i!=3)' q( j' Y/ U! L5 D( E+ L
{ h=link[h].nextp;
: Z; k" ]/ S, F0 u( e7 V8 X1 q& h if(link[h].number)
/ g2 W% ]4 A7 |! j) r$ a i++;}8 a3 _" S$ j$ R
) ]3 S# p7 f3 f9 D9 P6 Sprintf("%4d",link[h].number);9 h# h! y6 _8 v2 Q+ N, E: ?8 R
link[h].number=0;
. p, s( A+ f* }( I5 N3 I! Dcount++;% e0 {! V w, X: {4 v7 G3 O
}; f, p) ~0 U ]4 {; @: a
: _5 g! P6 H8 w
printf("\n大王是:");8 G* x- t& S8 _: G- j, D
for(i=1;i<=M;i++)
) I" m t5 ~, i. v1 K if(link[i].number)
! O# L1 N$ X$ p& k" \* | printf("%3d\n",link[i].number);
+ o' u; i1 e) m% M" R$ q
7 P/ e' Z3 F9 D4 U" b+ n9 B7 x/ H6 @/ t* q7 i
}
7 ?2 Z* q2 a% j4 T# Y9 e第三种是普通方法for循环, k* ]6 h( \; ^- ^3 X( Y5 b
#include<stdio.h>
2 c6 |+ M, M! Z' H6 Z& E$ I. rvoid main()
3 t4 c# y- a9 z4 P- |/ ^4 v* k% ?{ int i,k,m,n,num[50],q,*p;) r2 H' A8 k B/ y( f
clrscr();, K0 a- E8 e& _( p$ X& y/ T; a9 P& r- k
printf("input number of person: n=");; `* v; d3 O# N
scanf("%d",&n);- X) h+ Z4 h7 L" e
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
. K& d4 s) F; L& ?. u% v0 P& [6 h, u scanf("%d",&q);
1 |* n- Z! }7 [; e J' |# p3 L- U p=num;
5 [5 w- c# D! l0 Q2 } for(i=0;i<n;i++)) S) I% Z H3 r, U+ ]3 j$ i" @
*(p+i)=i+1;
& I0 f# y1 R3 ]( F" G( Z i=0;
9 |; y+ i, ~ U: f k=0;
7 r" h# T' k P8 G: z+ }0 E) F( E" o+ L m=0;
5 l& L( `4 y$ S7 l4 R" O! y# P- T while(m<n-1)! Q: G7 q8 p6 d N; S% R; m
{if(*(p+i)!=0) k++;) ^ Z3 ~% C$ K0 o4 }
if(k==q)
) P2 K9 {* g0 P" ]& J { *(p+i)=0;3 r2 c. E. T3 o
k=0;6 M! {+ V# _" J }# H" u
m++;
/ o0 o: j3 N+ ?% u }
% c2 e! u; P4 ?- A) @) Y i++;
8 M! M" F9 q8 L- S% v* y o+ ]! [ if(i==n)i=0;+ p0 z: p) O! ^
}1 q4 d; O9 b3 U$ \) S
while(*p==0)p++;, m3 u% T8 e) v# P, H8 |9 B- u4 C
printf("The last one is NO:%d\n",*p);
1 T3 T# @$ h2 d6 j+ t/ i2 G getch();' F6 \6 Y& i4 B4 ? O
% i- P* C5 I. s7 w* }! C
} |
|