|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!5 [- k0 z( } H L+ Y- e% P
这几天我在忙着编一个问题,我用了一种方法编出来!- H+ M8 H# a& t8 Z/ Q
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!! [8 m6 E! r; w7 g) ?/ \( x
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 $ M7 j: {/ S3 ]' G0 F$ p( v; A8 Z
/ l0 s! V6 c( O# j
9 \/ [/ D: x/ l5 D; ? L
题目
2 L* O5 I* b, }( G5 R; v. H" C山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。/ g6 ]$ r n# G2 H# m
第一种方法:利用循环链表- a* u' i& j1 B. `+ w6 X
#include<stdio.h>* P ?2 f5 R* a) S/ u( q
#include<malloc.h># `: R$ J* a( X
#define M 8 //共有8只猴子' C7 b( ~1 `9 ^/ T9 p, ?2 C! g
#define N 3 //数到3只时退出第三只* \/ S! Y8 F, T. b/ [
typedef struct monkey
5 O2 Z6 }! C4 s2 n: [{int number;2 N& e; \8 K. X' S `
int flag;5 a b/ {) ^. L7 c6 D/ {5 U
struct monkey* next;
2 G2 ~. X' T6 i}MONKEY;6 ?& c# U5 {' \6 q+ {
main()
$ Q' `% I; N& ?. V{ MONKEY *head=NULL,*p,*s;. W, u: `; v/ k( a" a; ?* D
int i,sum=0,count=0;
% d/ L+ d! p& L; p! S+ j4 E clrscr(); //清屏+ y- }4 F! O8 B: H
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存# s1 H( }9 _+ _$ J1 C/ t# v
p->number=1;p->flag=1;/ F" B! b( t: U
p->next=head;8 o* |# P- @2 J& c: @* S8 ` h
head=p;
! a3 X G1 e/ }& n for(i=2;i<=M;i++)
) A1 ^2 O4 Z7 e8 ] { s=(MONKEY *)malloc(sizeof(MONKEY));' U; @. J6 h# |
s->number=i;s->flag=1;' f4 _2 q4 y: v4 h
s->next=head;) o9 k! O3 L( f4 T* N, a
p->next=s;p=p->next;
, e; B N. i+ K$ b! p' ?; Q }
P5 M* M0 Q7 t+ X. A p=head;" y9 g9 ^- i, ?/ D; W' ~5 D% w3 D
for(;;)
- h% Q/ R. g4 l0 W. } {if(p->flag==1)# \& R0 Y% b+ W. q
count++;
0 N, _4 g; `! j6 | if(count==N)$ P5 x5 P$ y1 E# t
{p->flag=0;
8 s3 |) j9 W$ p count=0;, y6 p7 a0 B+ J- Q, C
sum++;}4 M+ M" j' D, w9 V6 a3 L
if(sum==M-1)' X0 j2 u) E$ g: P5 V I% o0 w
break;
' T3 `1 y% N' w9 Y Q/ [8 c1 M+ i p=p->next;
/ b. ^2 g. ?+ F* g O T }2 [* D5 [3 U2 P1 H
p=
0 N0 B% B4 G; M( `6 Y6 B/ o5 u: W head;" Z2 `2 {. v. @/ X" N/ d
for(i=1;i<=M;i++)
5 Q% j' B# n Z6 D& R5 [6 O& @ { if(p->flag==1)
$ x, Y" ?3 k, b& W* c. w: q) f printf("\t%d",p->number);
* G0 P4 {# X+ _8 L" Q* n6 L p=p->next;5 X! Z3 ?9 w3 A! P! ^7 {/ I2 u
}
" \0 @1 D+ E" I: Q: [& z1 t% u0 g; g$ s7 K" a. q5 a2 l
h* k6 w: ?/ U
, r) T" p$ c8 {& U} - x( r0 _" X+ E/ }( H+ t% ]
第二种方法:数组0 a) j0 t9 k. p* C0 K! ]
#include<stdio.h>
' [4 X% x, j6 y4 s: a! h5 s/ v#define M 8. Z, [+ _* C( F$ r9 e
struct monkey- J4 T a1 A5 n3 B
{int number;
0 Q' M l0 Q* P4 `6 ]& K# w1 q! Bint nextp;9 _/ [+ Q. B* Z( A; N
}link[M+1];& g4 v5 }! J5 F
6 b. m1 `7 j3 n9 |9 t d! `8 F4 A
void main()8 h; N, p$ f, e, X, P' r
{int i,count,h;
: Z3 v$ N% D" y5 q& {0 ifor(i=1;i<=M;i++)
+ w# |, x9 e5 p0 w' `' H{ if(i==M)
+ H; J1 U, Q! Y k( Y2 ] i1 Z link[i].nextp=1;' k N; s1 N# p; S1 V; f- j
else
" E/ h6 N9 G% x9 e link[i].nextp=i+1;
0 D$ v d" `: z* v- K& o link[i].number=i;
: ]7 o) X. x w) ~}
& d$ t0 U$ n F' q6 ~printf("\n");
_; D- a+ x4 x- Y2 kcount=0;% C5 q+ R; ^ S# I
h=M;% v4 ]" |. H" t5 Q; {( y) N, G
printf("依次退出的猴子: \n");8 ]7 n3 B1 M" f# z7 k1 E
while(count<M-1)
; u& ] s% O$ C. P+ ]* a0 L{i=0;/ C; E6 I8 j3 e/ H5 f: B( K
while(i!=3)- i7 ]8 k7 ?" U8 _
{ h=link[h].nextp;, f3 A# c; q' C% F$ G& h& N
if(link[h].number)
- e. E9 H7 ~; ~" n% @! t i++;}
, ~( E$ z* W9 q0 l; k. b2 G9 m3 a; q9 q6 q2 Y8 q
printf("%4d",link[h].number);8 ]& E9 g' @; ^( z( l: F% u( F
link[h].number=0;- f) C' d1 ^" U( {5 u: Q
count++;" |+ @1 K, ?( U+ y
}# p0 s7 d0 S U' _% _' ~7 ^
, S; B; M% m1 H! {7 D4 X
printf("\n大王是:");- n6 ~8 Z1 _- Y |" r/ L
for(i=1;i<=M;i++)
: \' z& H; {/ v& F if(link[i].number)! Q' n8 s0 \& K, ?' ~1 m& I( d
printf("%3d\n",link[i].number);
7 j! {5 ?+ B9 J7 R* ?# o3 e- ~9 ^9 b, ^# H6 K
, N% U: T% }3 X} : `, a9 \! E- p' c8 S% Q# ?
第三种是普通方法for循环
, K. r3 J1 ?$ w) V4 K! `% B0 S+ t#include<stdio.h>" w8 P2 L% N7 A1 \3 n3 p' A, c ?4 T
void main()
2 |2 p T R4 D+ B. [{ int i,k,m,n,num[50],q,*p;7 n3 o% T4 }# L- R
clrscr();7 Z& Q7 G& S; x* Y9 m; G) X/ w/ F
printf("input number of person: n=");
" B/ j" C: f$ P scanf("%d",&n);. ~! _$ `% a! W0 ^5 O
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
- ^% Q8 Y0 Z9 w scanf("%d",&q);, g' }: ~ P8 y; k
p=num;! o$ A& r1 O8 N% ~% |
for(i=0;i<n;i++)& O, D M; @, ~
*(p+i)=i+1;
* T% B' X' x- \3 o- d+ G i=0;0 \- b& y9 w2 H$ `% f
k=0;) ~ U, O) H% O! J
m=0;: N$ P/ w ^; i2 t
while(m<n-1)6 Y& `/ S: g$ Q3 s5 l. ` G
{if(*(p+i)!=0) k++;3 Y. z2 l3 [1 ?! ~2 X9 K. |% [
if(k==q)
! ~& _' {3 A7 l6 w. u8 W/ V, `* j% h { *(p+i)=0;
. `3 I G& i: I k=0;
9 D& S; ^' }6 M: e& f( Y+ a+ f) ? m++;4 P- b$ O) h5 h/ R D$ P5 {
}
+ L/ T0 V. c# b# } i++;
: {& d/ u, S1 J7 q0 y if(i==n)i=0;
; P& y9 s8 }. F2 G }+ B9 g1 v4 d- D' v5 z) w' C
while(*p==0)p++;5 g/ e# z+ H5 m8 U
printf("The last one is NO:%d\n",*p);! D( x3 g* ^( i( y" s
getch();
7 ?; o8 w$ R, t* u1 X6 d( v/ ]0 v- H$ M2 \
} |
|