|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
0 S8 n5 l2 m! e Z$ ~这几天我在忙着编一个问题,我用了一种方法编出来!: N+ ^9 w7 Z, W
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
6 N( w9 {: J; Q7 L注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ; j6 w* z e6 H, m/ _4 d
1 e) v8 O" c$ k+ b
5 n& p$ w: n9 Z' ]& t1 e& c: H" N
题目
& ]" e1 A9 f, f( x) ?2 B山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
+ h+ l! s) P$ H' Z: b# I6 G5 @第一种方法:利用循环链表
2 t# s5 X- @2 g! w: t#include<stdio.h># M" N* ^. L' ~. ?% Q# t. ^
#include<malloc.h>
) }! Z3 X6 W3 M2 y" v#define M 8 //共有8只猴子# B4 ]1 C6 Y8 C* m, q2 |
#define N 3 //数到3只时退出第三只
; L, C9 A5 ^, B4 r; S8 ftypedef struct monkey' e H1 |8 W6 \2 U8 M$ I1 M
{int number;8 g0 Q8 W; v5 d& M+ h
int flag;
, P& C+ f" @# Y! Ustruct monkey* next;
$ V" j( F5 d2 ] a, E/ ~7 O' w' v, u/ l}MONKEY;/ K( [ l2 l7 g
main()3 I/ X& R4 k. e' E0 t
{ MONKEY *head=NULL,*p,*s;. w: e) g n4 ~% z# J" ]) y1 u
int i,sum=0,count=0;
: m: r1 M, N) S5 K7 P% @ clrscr(); //清屏
( a0 Y T. h3 {4 Z p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存+ Y! @4 ~! M$ t' C4 D i! |
p->number=1;p->flag=1;
P) N- U% t k# c) }$ q p->next=head;2 D: M }) ~" _' s9 Y. @2 F5 L
head=p;
1 s4 s' p' v2 ]2 s3 @+ z' }3 u% T for(i=2;i<=M;i++). I1 |) E1 Z0 y- ~7 b z
{ s=(MONKEY *)malloc(sizeof(MONKEY));
( q! H& w; u! H+ V s->number=i;s->flag=1;0 h' t2 [6 D3 p6 w
s->next=head;- {* h8 K( f2 \+ B, `
p->next=s;p=p->next;
5 B; Q* _0 n; v& |5 g5 x. k }
2 F( W- F6 f$ i( x/ N p=head;
) Z+ w0 W' K6 C1 u5 Y9 j# d% A/ u for(;;)( O+ ~/ ?6 N- p) r
{if(p->flag==1)
% T; F' c/ T. K7 k% H+ m count++;
# b( G( E. A, Q7 `7 ^5 X if(count==N)
/ v- a* E% M; X$ c; ~. r+ I0 j {p->flag=0;
; b+ B- z. a& Y. F/ c8 i' r count=0;2 w8 |4 s1 r: E( M
sum++;}
2 a+ Q% w s. c3 Q( p7 f" u+ N if(sum==M-1)
. A2 n+ I z$ s8 ? break;
6 N: l, a! c+ u& Y7 K; h( } p=p->next;: D* O9 z) S. f, m' i
}3 h+ o8 h! U/ ~$ K. l
p=
+ M. L' m6 t/ x head;
5 F1 \% ~1 J | for(i=1;i<=M;i++)
; Q6 ^0 N( T6 r( C3 U$ y5 b { if(p->flag==1)6 l. i, q) a$ W9 N# v
printf("\t%d",p->number);
# C; Y& c* |4 @! F. {9 m p=p->next;/ L& F/ O5 _2 Q$ y% O
}" Q5 f( o. n: ~2 M0 a
# `* D: D# l) ?( O. \
, v9 S( V1 A( g* ^
9 G( l$ X9 ?5 W
} 2 R/ Z* j T( |& \/ ? J
第二种方法:数组
- K& z. t8 T. O6 r7 J#include<stdio.h>$ F) x- X, C5 f. v/ J! `
#define M 8$ v5 L4 c( R# ?) s; Z2 |
struct monkey( Z- @0 B/ j6 J$ A+ a8 H6 b
{int number;
_" u% ?5 z' C2 `' e1 ^! Jint nextp;
7 L& d2 ]' K/ ~}link[M+1];; V& C6 A, N. J
$ q% i) p$ _( W+ j$ Gvoid main()
2 P. N6 Z: Z7 y4 z! `0 ~6 i{int i,count,h;; x: h- x! j7 Y+ ~2 E/ r, j0 v" ~
for(i=1;i<=M;i++)
) M" T* e0 Y6 g1 y k{ if(i==M)6 Q% R$ h( U! p
link[i].nextp=1;" E0 i- w; k5 ^% L& {! L4 s; C) j
else
; n3 Q1 C$ X# n' b7 `. u link[i].nextp=i+1;9 q0 i/ h# z4 V# z; {! k
link[i].number=i;! D9 J/ X l3 i+ G1 p" { i; I1 j
}
3 W% M0 S. Z! n. p- x/ U: ^( d9 ^9 sprintf("\n");& l/ U& w( b0 j, l0 y9 s' v
count=0;
0 P; @5 W4 {& z- D& Yh=M;
' [, Y5 M' @$ K. l/ d( ]printf("依次退出的猴子: \n");3 J3 r; ?7 s0 W+ C! y% s+ {
while(count<M-1)
3 f! k, X) v( O: g9 C: k{i=0;1 C/ s5 f1 Q8 R! E$ @
while(i!=3)
4 A! W- j/ N3 t( Q! H{ h=link[h].nextp;( `7 J8 f9 k& z/ c! z5 T
if(link[h].number)
; R! Y( L) ?6 B" P$ A5 B$ k i++;}
$ x8 M8 N: G; P2 e- g3 G' S/ i1 K- k! H6 {" T/ p7 j
printf("%4d",link[h].number);& E) M, m& V* g. m; m
link[h].number=0;8 o7 m% p2 F1 }
count++;
. u9 z% Q1 C w} h2 E4 g, n8 N
9 n8 R+ w: J6 A# O% n. \) G8 o6 V4 e
printf("\n大王是:");
6 {3 r4 ^9 |" {+ B S; `7 `( j for(i=1;i<=M;i++)
5 k o" M; r V( Y, K& C4 ^ if(link[i].number)
3 x4 t) z3 J) b+ f: M printf("%3d\n",link[i].number);
: [7 p0 I* Z- u b& Z
# n6 m( ~7 s' f
% D! }3 X6 R% |& z} " z) j" i2 z `* b7 h: T6 L
第三种是普通方法for循环# a* a* a$ l. i8 Y3 |: k/ R
#include<stdio.h>: b( T+ G: _# z) n
void main()
- ?7 y4 ?/ I; R- o [" |: [4 I/ B{ int i,k,m,n,num[50],q,*p;& U- _: k* g6 c8 N$ Z( H! t
clrscr();8 n% c9 @$ w% b
printf("input number of person: n=");
6 `" r8 f4 x- d o+ D scanf("%d",&n);7 C4 b" L8 i2 x! s0 |: W
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
4 P o3 J( p# W! C9 N: ^. [ scanf("%d",&q);
6 P1 B$ Y; b& } p=num;. H4 f+ g; J' ]2 O" S s0 B( @, C+ e
for(i=0;i<n;i++)
& K. |( Y; C4 J# J/ `0 _ *(p+i)=i+1;
. p" p" }! Y" R2 v* d+ Q i=0;$ z' i q) @/ `7 A
k=0;: X' _) A5 O5 a2 r
m=0;
! ?4 ~- y" o; D7 C) m$ v while(m<n-1)+ q: F; ~9 p9 Q- L
{if(*(p+i)!=0) k++;+ S1 Z. a. P5 S
if(k==q)4 V% }) z7 \" e' Z3 Y+ t _
{ *(p+i)=0;
1 [( |6 u8 l5 b o8 r k=0;9 v$ w/ j6 B3 f4 H7 P
m++;% ~4 P( @8 Y D! [# Y
}
4 o8 K! c1 p: D& c5 v& I( @ i++;6 F1 L/ d* K) d' n: \" M
if(i==n)i=0;
i$ ^2 S: O/ E$ J8 _ }
! d7 O! Z0 u) ^2 G, F2 N while(*p==0)p++;3 V% K. T4 U% L, T
printf("The last one is NO:%d\n",*p);2 h1 V% \9 E, Y/ m, D$ ?
getch();
5 z, f9 W) E; @6 |
$ g6 f# R$ m& ]5 F# B. k! }} |
|