|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
' ~' H, ~& W) e这几天我在忙着编一个问题,我用了一种方法编出来!4 r2 b9 ]- N- ]* a) a. _1 ^" w
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
% a7 v: h+ _! Y- Q4 J7 d" n注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
# T p* K8 ^5 ?# C' R4 R- r( w. X& `6 C7 n7 U
0 A8 _ L8 g1 l X* U
题目" v) t! [- c; S: K7 H
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
1 Y# m# R0 b% \4 u! l: ^1 s8 s- S第一种方法:利用循环链表6 a' A7 r' G2 j- R6 t
#include<stdio.h>
" j6 A, C5 P: f" i#include<malloc.h>
- C8 j# s. c) d6 y1 w/ ~& b#define M 8 //共有8只猴子. s; y# V+ t y4 W* W
#define N 3 //数到3只时退出第三只
3 [1 d3 J! x: A; h( w, k" {7 [typedef struct monkey
# [) J$ f$ q; s7 T- ]4 B{int number;
5 h7 L( _# h/ p& v, |; _: xint flag;2 G2 w" I' I# A: W! h
struct monkey* next;' `- u3 D7 c8 w1 }4 N
}MONKEY;
3 u/ r: i9 k; x5 qmain()6 ~( K9 [7 t1 x6 t
{ MONKEY *head=NULL,*p,*s;
( F! S/ J; Z+ D int i,sum=0,count=0;* z6 P' T- l: u9 M1 f
clrscr(); //清屏
$ H5 P" v8 G+ e3 L" l2 Z4 R p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
7 @- e3 S2 ]: H1 I: i+ ` p->number=1;p->flag=1;
4 v9 B/ H- j2 I9 f& q: I" @ p->next=head;, D1 }4 D' |: @4 G) s- l
head=p;
. t* n* k( z$ j1 }7 l for(i=2;i<=M;i++); |: A: O, u" n) F0 i
{ s=(MONKEY *)malloc(sizeof(MONKEY));+ W/ _6 k, j! \" N; b/ Z
s->number=i;s->flag=1;
$ s6 h! j0 ?% V+ k* z- [& } s->next=head;
" \) S m6 b' b N7 M% R4 q& {; ~ p->next=s;p=p->next;
4 S5 |/ ^5 U9 w9 n& g. R }
3 [3 x: E4 S8 V# e& H9 }3 `5 a p=head;) s) m( E* g( P! ?
for(;;)/ t4 t. B8 M* p! N- J0 K
{if(p->flag==1). s7 [' M& [3 g0 G- R+ `
count++;5 f+ p' `: M3 g( a1 Z$ S+ n
if(count==N)
& B# w5 v* q A5 A {p->flag=0;
* L$ b* E- ~" Y; W9 x count=0;/ j, f u5 ?! Y1 |
sum++;}
9 E* q0 a1 c4 W* K3 D, i5 O if(sum==M-1)6 g, q, v E6 N- B
break;0 d* {& T$ W2 o4 e
p=p->next;0 z0 n; V9 t( t
}8 \. J/ j8 m W6 F
p=
! r. x# Y1 ^6 ]- I head;6 @5 i: n4 A) I) z; y) ~& u
for(i=1;i<=M;i++)
2 I4 i% g4 T. g { if(p->flag==1)$ x R: p6 y) f1 U8 Q
printf("\t%d",p->number);/ `/ [! ?/ z7 ~* R
p=p->next;
( x6 P% ^! ]3 [9 I* d' \ G }
6 x. r! I3 ?4 `2 E: c& v4 B- O6 C# U6 Y
! `4 b! V9 [, g4 X9 m: g0 f" ?7 G
3 `9 `- u: U0 `3 N& c5 J} % [" W# ~+ T, C0 c
第二种方法:数组
( v, v" X# M$ a0 l# J8 K+ x#include<stdio.h>6 W& g4 ?. t; r, D; ^& m
#define M 8
, W. J; K* R. U+ x8 k2 M' S2 Ustruct monkey
( U& _4 b$ D2 u, w1 j{int number;
: M9 |1 v% B) Rint nextp;/ I$ R6 ~, I2 O" x: ~6 B9 B9 L3 t
}link[M+1];% |# T, |( O, Q3 l! M; W% Y5 `, N
; g# ~# z% P% X/ P! t$ Hvoid main()5 N' q: Z0 ]. l5 k. H) n2 k8 K
{int i,count,h;
/ t- R: C7 ^+ F! k( ofor(i=1;i<=M;i++); t0 @' W. d* z& `4 H) \
{ if(i==M)- n) }, }8 W8 i) c; x
link[i].nextp=1;! q$ Z5 \9 n8 c; L5 I
else
( O- f w+ h# A9 v# G% X3 r link[i].nextp=i+1;
/ @: n3 n$ k+ j% S% ~ link[i].number=i;" Z1 f0 K5 m+ a9 H. l
}
( }; e/ c+ V6 |' ?+ nprintf("\n");
W6 }- e/ f/ J8 ]) c! L/ ^count=0;
8 t2 }4 h) q5 |! l3 ah=M;% |7 P9 Z* o7 Z% y
printf("依次退出的猴子: \n");
" K- P8 T: h' J; C; [* @9 @while(count<M-1)/ g2 W+ U& C6 ]. @! z
{i=0;
+ P% f0 r" y7 }% n1 qwhile(i!=3). p( Y* `% F1 N
{ h=link[h].nextp;& j7 ~, U4 q$ v; m9 G, f; i
if(link[h].number)
+ ~" r, m2 u7 O$ t+ X% ? i++;}' U& L9 T% ?4 O
7 E% P3 w; z8 L$ S# m. R1 q
printf("%4d",link[h].number);
9 u0 {! }+ v0 P- blink[h].number=0;
( Q% E$ K8 z. t8 v- s; Q6 j4 Bcount++;+ g/ `4 Z' N. D
}# F5 y, k) ?" ]
V& H" ^ d# a" w* [0 _! sprintf("\n大王是:");' ?) w k, B+ r+ S
for(i=1;i<=M;i++)" J" f1 I- T8 s' i+ c \
if(link[i].number)
4 d& `( K1 S2 W; y r printf("%3d\n",link[i].number); j# p6 `9 p/ `# t/ E: D* Y& X( k
Z% ~6 Z) C/ @1 Y( C0 C( ]. l
, X( V+ ]4 H) N- K+ V7 o$ K
} 1 q3 E$ |& g) E4 ]: _: ~* V2 p
第三种是普通方法for循环; |+ I% T, q7 g, @5 a
#include<stdio.h>
: J& {( M) b( c& J. B, Qvoid main()# b" ?9 e) i! T
{ int i,k,m,n,num[50],q,*p;7 \ a# h& Z0 z- Y
clrscr();3 y; k6 U* s% [; |% a2 l2 k0 Y8 C
printf("input number of person: n=");1 Q2 Z% M4 H! f0 P$ P$ o- G
scanf("%d",&n);
; h* B' O- _3 K8 ` h1 Z$ _- |printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
& L# r" c. ~8 a5 n9 s0 k7 B scanf("%d",&q);
t1 h# N. b: C3 J1 g" ~" h4 A* x p=num;: n! {- L8 |" E1 V) W" [
for(i=0;i<n;i++) W1 C/ U5 c. `
*(p+i)=i+1;2 t; W8 c9 H' Y: v; j
i=0;
9 s1 k0 B+ |5 |7 D, k; e; X k=0;
9 ?+ O1 h( F5 [! H m=0;
3 J. Q. i) {. @ u6 A) K while(m<n-1)
1 H& _$ b' X' W& r {if(*(p+i)!=0) k++;: {% x' O5 ~5 ~
if(k==q)
1 H j4 m. z5 j { *(p+i)=0;# M: g9 d; W$ o& Q8 z L- G7 Q( @
k=0;
4 m% l' p2 _3 { m++;& m* v- Z# D0 }8 c) |
}
. U {) J+ m$ P' _ i++;0 `0 y% t: J$ _
if(i==n)i=0;
1 E6 x, j* C( g: t9 E4 W }
4 f0 y# H2 F, V1 x( q' Q* d+ V while(*p==0)p++;
' ~: `- a) A Q4 r4 |/ F printf("The last one is NO:%d\n",*p);: t2 r( X" ~" |: n4 K
getch();
& L3 a3 H5 w/ Z+ j) G! r. y C' y) P% S/ ?6 ~5 E; \' j% \
} |
|