|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
8 F0 i/ X/ H5 S* A4 C3 o- d1 O+ ~) M这几天我在忙着编一个问题,我用了一种方法编出来!
& |9 V! T' Y; F1 t/ t但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
. Z& Y; \0 L, Q) c3 ^注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
9 j$ L/ i5 c7 @7 X1 S
$ Q% |* ^9 c2 m( C! I8 Z1 J. P. l4 S z* n+ b( C
题目9 n2 I$ Y! X. j- X
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
5 ] B" R( U' `; N2 j) H" O3 s第一种方法:利用循环链表' r6 x. V1 i4 A t
#include<stdio.h>7 A8 R6 Q+ O- \/ S
#include<malloc.h>, X1 j0 h, R; L! D
#define M 8 //共有8只猴子
, O1 L! ]1 t3 d# N8 W/ x4 W#define N 3 //数到3只时退出第三只; ]0 [# X8 N" C& `
typedef struct monkey
+ _( ]9 d9 B9 f, i+ r{int number;
0 {1 ^* i/ w7 Z( a! W* Q$ vint flag;8 ^+ I, Z) o3 F- \4 I% ]
struct monkey* next;! h+ R' |' Z- p4 k3 p, m; P2 L3 m3 l) Y
}MONKEY;$ C3 o& j& t* I$ t6 D
main()
1 {; ~% M% d' Z5 e{ MONKEY *head=NULL,*p,*s;
4 c8 ^" C! y% K* _ int i,sum=0,count=0;
: C* m% Z! Q7 L* e8 }. x% m [ clrscr(); //清屏
4 ?9 O& r* R" k& [4 S; o p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存 L" _/ i$ O$ P
p->number=1;p->flag=1;
; S$ B# S$ @9 i+ ?7 \+ Z: { p->next=head;
5 ?2 G) K; h% ] head=p;
3 a$ H& d* V' V. f& o( y7 L% ]" c9 u for(i=2;i<=M;i++)" G W, c% e; t
{ s=(MONKEY *)malloc(sizeof(MONKEY));
9 o' S$ w' Y& k4 Q s->number=i;s->flag=1;$ j! @8 u8 b$ K1 l
s->next=head;! R9 W3 |2 B2 r3 J1 X
p->next=s;p=p->next;
% k3 \& }+ a7 T$ p' f/ P+ B }0 \) v q* E% w9 |+ n& d7 T; W& b
p=head;
& [( n5 R/ \ W6 d0 G- l k for(;;)+ H0 K/ L. p( U" U
{if(p->flag==1)
2 D8 S4 J1 H! J% }* h$ y. B. k4 c count++;
: B) m. d$ i# t2 L' h, e) U5 @3 d if(count==N); [" v) ]$ k: N1 a/ P/ _
{p->flag=0;4 k$ I( t5 J) C- T7 O
count=0;
0 _. g" C l" w. J* ^) G sum++;}
# r" r3 ?* m, g( I5 o if(sum==M-1)* @( f# V% U+ C8 @6 d
break;$ ]$ h8 x7 Y }4 c2 l1 B# q* r8 V# r
p=p->next;2 K) t2 `/ @2 }6 e" ~
}
) A! G, p" v. q! e- ~( U p=
4 c. `# f0 z# @8 S head;. m4 P* O9 l H7 a S, g6 R/ G
for(i=1;i<=M;i++)
. V5 j4 K% E3 U3 P6 a { if(p->flag==1)
8 j4 R9 R6 w+ _4 A3 B. c9 U0 i printf("\t%d",p->number);; L. C) m5 D5 a' e1 s, p) ?
p=p->next;- g, k) j; p2 R9 H* v* r
}: Y1 F+ f- l9 B' ~! V
. t! K0 q* Z5 u7 ^8 r* T" |8 ~, P
" Q( W4 w' N( p0 [! H" j8 E0 |9 v0 V, B' Z1 P$ m3 K2 D/ e
}
& S2 o9 ~& q, Q+ E第二种方法:数组
7 }$ @2 @. V: Q#include<stdio.h>5 y' [9 B& c. G5 O3 V8 s: U
#define M 87 }) `1 q* Q. f& g: @& b1 ^
struct monkey
, h4 G' I5 p' Z% _6 N5 `{int number;) S3 R' |: ~. [" t
int nextp;
6 b) i) M; d+ \; w0 w}link[M+1];1 }+ ]- v B0 H% B
$ v, V6 [5 ~4 Z! q& \void main()
- i& O' }0 _2 N* W& t{int i,count,h;% ?: h. K' c m
for(i=1;i<=M;i++). |. _3 l3 K, o
{ if(i==M)
a) V" m( S5 a1 L link[i].nextp=1;+ D. g5 j4 [8 D- o) x
else, S7 F7 p5 H/ T/ _. |5 Q, F4 | j
link[i].nextp=i+1;
u y! `8 E# l/ e link[i].number=i;
' H' |+ \( W" ]; i: R5 U9 t}
4 l1 g: j* g ]% J6 T& bprintf("\n");* \# T6 \8 H( j& B' d; a% t
count=0;6 C; {& B7 V; n2 w+ Q& Z3 ]
h=M;
" ]+ l# a. x; v# @$ L0 R5 `printf("依次退出的猴子: \n");1 h0 v1 E9 k! W
while(count<M-1)7 R2 q# ~, ^$ y/ M1 Z5 i
{i=0;
* y+ H6 r: f: ~% d' f6 Bwhile(i!=3)
# v# b, H; g3 Y3 R! h) B/ y{ h=link[h].nextp;( B, S8 D* l' S% f" {
if(link[h].number)% D" X5 _, ~$ u+ Q- @/ G5 E# e
i++;}3 }2 o6 f( U; n* K* d6 R
, Y2 i+ X: C9 u7 Vprintf("%4d",link[h].number);3 T/ N' Q* h& L$ W- x$ O3 K
link[h].number=0;5 a- @+ P5 h. v! o X5 J" \% i
count++;1 c# S$ X+ j2 k3 P9 i( p
}
$ h; f2 C! h ]) r- _* ?7 J: F! D0 ^ i% E7 M: G
printf("\n大王是:");, k: Z+ G$ l4 T, s# I8 F7 t) ~
for(i=1;i<=M;i++)
. e* A. W; q' k A: M; j if(link[i].number)
" q! K0 c! `* G+ ~7 b, }$ C printf("%3d\n",link[i].number);; X( c+ t2 K) `+ ^8 y; ?! Z
+ p$ g9 g, V- M' I) I
' [7 a# Q3 E. w. Z- z1 ^
}
# D; K( k+ j6 h% x, `7 d3 u第三种是普通方法for循环
3 R2 F* N; M1 _& ? Z" b% Y#include<stdio.h>1 j. q1 S+ D( ^/ i, a" b
void main()' d3 |- w8 h- x
{ int i,k,m,n,num[50],q,*p;* n: H0 U; M0 F1 z: h
clrscr();
9 T. E1 T# f# z printf("input number of person: n=");; o( H7 e! [* ?7 r5 `# W
scanf("%d",&n);
3 D: {9 t N' i$ D1 Q3 D2 R" nprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
* p4 c" T3 V9 a7 U- ~6 x) l" k scanf("%d",&q);$ |2 ], P2 w/ W: W, l( A4 i t
p=num;
$ ~; {+ Y2 U" H- G4 O4 j( H for(i=0;i<n;i++)) G0 T2 {9 K2 i' f
*(p+i)=i+1;
) h6 y+ r6 {) \) ~: | i=0;
: v5 e" H0 k3 T4 d l k=0;$ V4 o! m. g! d/ Z
m=0;) y8 z2 V: X. D8 Q/ y+ S' H& B
while(m<n-1)
$ D' ~, p1 ^- K& Q( t) Q/ X9 _ {if(*(p+i)!=0) k++;
/ Y; k, B( g& o) @* d if(k==q)5 j _. J$ o5 R; Y0 o- Z
{ *(p+i)=0;2 p9 P, f9 X2 d
k=0;( ~* w7 k' p4 n3 S- g3 H( |
m++;/ v7 G! K( t& I$ y- \5 e- E
}8 }7 y t+ M/ D1 ~- T) t+ Q+ Y. ]& Z' k
i++;
0 r) y* o0 o3 v- I x2 s$ b if(i==n)i=0;
& K- S/ S4 \, `8 | ` }
& _, i2 L; D/ S: o while(*p==0)p++;+ t- H' a5 E/ a+ `
printf("The last one is NO:%d\n",*p);& C$ {0 x- ^- I( S
getch();
! V9 w/ X* d+ m x$ |- K. T6 @, q& H$ `! K3 d2 m L
} |
|