|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!* g$ ]) Q" s3 i {6 N
这几天我在忙着编一个问题,我用了一种方法编出来!+ T6 ~' K; l- O! ?
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!- I; U, w" O9 R3 E7 R4 V+ v# [5 S4 y( t
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
+ A" W9 S1 ]4 U. O5 J3 }, B# n% G3 {
6 N) z2 |& S) z) C c% ` 题目
; I( j* H! b+ m# Z+ I8 ]* W3 l* K山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
' f& v: v+ [9 A( ~4 w' {$ c第一种方法:利用循环链表
: N1 U9 }4 W, a' j1 j( w" T" l#include<stdio.h>0 F7 L* O+ l8 `
#include<malloc.h>
- d+ S9 C* k, e#define M 8 //共有8只猴子) x8 E4 N# e/ ]- q
#define N 3 //数到3只时退出第三只
E2 c/ W) {. F( R) j1 Ktypedef struct monkey
) I+ e2 }* ^$ P7 \( i ?{int number;* o, w5 w2 A, w9 L1 i
int flag;
0 } M" s v1 D$ `4 hstruct monkey* next;
- g7 u/ q1 X# K# @5 k# e}MONKEY;8 g& _ q! y3 r9 w Q- `
main()" x5 j! a( F# k+ M% P. G" g3 l) {, s: s
{ MONKEY *head=NULL,*p,*s; `0 ~; e1 L) q. D
int i,sum=0,count=0;- u5 O4 I3 p2 D
clrscr(); //清屏
* K% F7 s: M) M+ L) b, Z, l p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存8 D" J. d7 H3 w* \* h0 B
p->number=1;p->flag=1;
2 n5 R& n, a7 V( ]# [ p->next=head;
b' ~ a& X$ V4 l" ? head=p;- X* j Z7 Y2 M( S3 r6 z
for(i=2;i<=M;i++)( x3 l4 k4 T# n+ R' o1 G, C$ ?
{ s=(MONKEY *)malloc(sizeof(MONKEY));
6 E7 o2 I1 p! U s->number=i;s->flag=1;* u" X; ^6 O; [4 {4 V5 h
s->next=head;: P8 n2 Y9 |; l3 H8 H2 o
p->next=s;p=p->next;
3 ^& x5 a+ m# q3 A. \ }. u# V# l! x" n8 l/ u! k X
p=head;) N! B7 l& x4 a, O0 h5 N
for(;;)
+ \, o: U5 S( l) g {if(p->flag==1)
& g! }8 V3 P3 r+ S, E& Y' N count++;" m9 m& O0 w6 n& n1 _# w
if(count==N)
$ I* H" t1 X* b( u2 m. g3 F( }! X0 v {p->flag=0;6 t) }- }/ W J4 ?% c' K5 }
count=0;$ q) U2 W0 a) ]$ n. s" l* Q" w) v, [
sum++;}
) L3 k# J$ o7 v1 I+ v if(sum==M-1), E- Q- M# e7 |0 q ]1 Y
break;8 r( |5 K; B" P% ]* I* k
p=p->next;2 Y5 K' `. i1 k4 \
}% ^8 Q/ H x/ k& R: k
p=
?. C4 `3 F6 k. n- E7 S) @ head;7 i+ ^4 x# i, t
for(i=1;i<=M;i++)5 R+ z" K& K' ?
{ if(p->flag==1)( q& w) u! [ y3 h: h
printf("\t%d",p->number);$ v. y7 [( o8 n% O0 S* B
p=p->next;( z) ?, |1 L. s
}
/ b2 g. t$ D9 m3 s4 \% Y C" C: z( A4 e, i7 ^- h/ y- l# M
9 u Y% M- x; K+ z& C. f- g d3 s
$ e) M+ W3 L- ~$ j+ {6 [2 }} * m. x" ?- f6 f& `+ Z" S
第二种方法:数组
; g5 t8 d* Z6 d#include<stdio.h>" [3 {( C# T# l5 M% x; G
#define M 8
* j, A9 k2 ?) R6 T: T$ L4 e4 Cstruct monkey. P! c6 B# K7 K. |
{int number;
7 T* X( ?( r: p+ ^# c4 ?2 gint nextp;
- g3 W( W6 b7 Q* t/ |% d% V}link[M+1];1 E' M/ _4 L3 u% e5 u* P8 V# a
( {1 _8 Y4 v6 B5 `: n4 f8 Xvoid main()
) ]8 }+ Z& r2 T I' R{int i,count,h;* M2 a' X( ~6 z% a. {- X
for(i=1;i<=M;i++)5 ], R( X# `4 {9 b8 M7 a
{ if(i==M)' V8 @( y- s4 t8 E+ d3 V" {
link[i].nextp=1;
0 H4 ]" _. r }/ w. s% ^' ?' ]$ A else$ q" y" X1 g2 F, S4 I( v6 B
link[i].nextp=i+1;% I$ q I1 I7 F! L
link[i].number=i;
- j( d, s+ J+ l. H6 U: D}
" Q/ Y2 j0 M$ E4 |3 i' Rprintf("\n");! i1 f5 a2 |* _
count=0;
3 i, w" X/ r, H; @4 _h=M;
( g+ S- G" L: D9 j1 s6 R- J n9 Gprintf("依次退出的猴子: \n");* s, x, A9 B1 {9 l% F: d0 u
while(count<M-1)
9 Y% G* d1 F8 F- y0 d- \! ]0 B+ J{i=0;4 ?# `$ m$ Z! j2 H9 l( {
while(i!=3)- ~$ S0 a0 r+ f, y# d3 Q0 T* f
{ h=link[h].nextp;2 d" s; j- I( @6 H3 Y
if(link[h].number)" E: ^! o6 C. ]; g# c' w. m6 U
i++;}3 y1 i( u2 g/ v) {" M L" W
, N! p% v" i1 _' f2 u/ q; @' P: E5 j/ aprintf("%4d",link[h].number);+ [" ~1 j+ t& y9 Y2 F- [% N
link[h].number=0;8 z1 W1 z# Z6 Q" Y; g
count++;
: h% i# c2 c: ?- R" g; b}
# m. ]% v" y9 x& a8 J% }) a' M' H% {# G) g
printf("\n大王是:");
- H' s) H/ q6 r# F Z4 T for(i=1;i<=M;i++)
# l0 w7 b! N1 ]; f if(link[i].number)# l- G: q; J1 `8 ]; i
printf("%3d\n",link[i].number);8 R! j; h: @9 X" e0 M& i* D& v3 t
$ Q" p0 [3 A z3 l) o ~- I
$ C$ {# L5 q' _! R} / Q) O9 ^& W# I
第三种是普通方法for循环2 M1 [* M. r8 y; W
#include<stdio.h>5 O( d# k+ Q K$ _! R) ?) V8 w5 x. A
void main()
9 l6 a. f( M( Q* l) ?: ^{ int i,k,m,n,num[50],q,*p;
/ L1 t2 H* _+ H' |4 S clrscr();8 L$ o g9 w* f( f
printf("input number of person: n=");% m4 Q a* H) C
scanf("%d",&n);
$ j" ? C$ U5 gprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
' `7 d l e. c& u. E scanf("%d",&q);
3 v, |( f6 W, t# X- }( b p=num;) q$ s- Z$ K: T2 e* t
for(i=0;i<n;i++)% | V- E' @1 U) i, X% o7 Y
*(p+i)=i+1;
+ N+ {8 O' L- t, F5 z" F i=0;
8 l {/ Z3 k2 P k=0;
: I- g. Y# G7 n2 q! q8 c m=0;$ _! ? y$ Y+ ~, Q; T. ?) g
while(m<n-1)
( ]0 ?3 R' x6 S {if(*(p+i)!=0) k++;* A/ W4 J8 j9 G0 Z/ F" L" i
if(k==q)
6 m# S1 N1 r! F9 r { *(p+i)=0;" S9 p) L: Z0 v+ O" n( T, G( J
k=0;
6 y# k+ Z% \- W) @* j& r# r m++;4 m' Q* u" u5 d9 e- b
}* l+ s7 k' c* t& G2 S
i++;
- H& e: Y/ j* H. s, H& Q if(i==n)i=0;5 Z j1 k0 |7 \2 O
}. V# }; [7 s* @: U2 H7 n# u
while(*p==0)p++;
. _9 o0 O/ D$ b( f# j printf("The last one is NO:%d\n",*p);
; W2 z: M. E+ ?/ ~0 g getch();* ]$ f% c6 o9 E% a! E7 ]$ U1 @
8 F5 Q8 p/ [7 M0 q; f# Y
} |
|