|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!. |! B5 u9 O# Y$ Z* O
这几天我在忙着编一个问题,我用了一种方法编出来!# O9 O f+ `2 {; g8 u5 b
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!; L' C- l9 ^4 Q1 z8 @1 n
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
$ K |) U6 b) T2 q1 f1 A7 t
, L8 D: P/ X$ D: X+ L( j& v( p; a3 n% k2 `
题目
/ p2 X" Z# P! b9 c" @ w e) n山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。7 x7 U$ O: z/ l) k5 N
第一种方法:利用循环链表" z* g1 \0 b6 S
#include<stdio.h>
" j6 @; w) g% t5 O% t#include<malloc.h>8 l$ t/ M1 J1 t; O/ O
#define M 8 //共有8只猴子
( }9 [* _5 @% r#define N 3 //数到3只时退出第三只# z% N4 \+ {: ?( ]1 V. j
typedef struct monkey3 L2 N& X' x3 @8 c8 N# X# s
{int number;
! @% S( m* r9 v1 U f1 S0 Tint flag;
9 J! c0 A; n0 J& h$ e7 jstruct monkey* next;9 @$ d' b/ V9 u6 h2 n1 K0 Y3 W
}MONKEY;
, r9 E% @, Z) v4 E: Kmain()" d4 c" ?" s" r
{ MONKEY *head=NULL,*p,*s;
- Z) I' V& J. l int i,sum=0,count=0;5 H6 g: `0 t+ D
clrscr(); //清屏
5 b' w) p K2 f$ a C5 i% f p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存1 _# ^/ P/ H: I, K7 U3 y
p->number=1;p->flag=1;
# [- A) v2 W# s0 ^& r8 |, l4 I p->next=head;
9 \% d2 b1 G, }6 C head=p;
! |' k5 a" p8 \5 ] for(i=2;i<=M;i++)( U- Y+ I7 \% U0 p* X! @
{ s=(MONKEY *)malloc(sizeof(MONKEY));
) h& J" ~, q% i9 M7 m% W3 I' p' v s->number=i;s->flag=1;
# ~$ I7 D" u+ n- Y s->next=head;
1 \$ ~' {5 z' a1 W" U p->next=s;p=p->next;& j' V" J3 [0 O+ Z# s' x7 ?
}
: f G0 i* P# ?$ b- v3 Z. }6 l p=head;
5 ]+ W/ |, j, ^* O; F" @& P for(;;)" }! {3 u6 e+ A5 j
{if(p->flag==1)
; a% {3 ~- [- m3 d count++;
- D2 X1 s9 z R9 T4 J7 V if(count==N)) I! m4 t# T" n H% d% V9 l
{p->flag=0;
+ o4 l( L( u% A: i7 a" A! | count=0;
6 S/ H3 X$ X3 c- m& G3 V sum++;}1 }! f, X7 j* Q, o
if(sum==M-1)5 U" ?4 C. f7 M9 V% X
break;
$ q* `6 D! I# I( T: d7 r p=p->next;
& R: O8 I h8 D2 ^ }' S" A, n( q3 v8 ?
p=: D$ a/ R% }1 r9 u$ W
head;( m; C% U3 K, L0 G* S
for(i=1;i<=M;i++)
: M# [# [! @* ~: x8 c; y- [ { if(p->flag==1)
4 f) A5 Q) [& `0 D# \) R" ] printf("\t%d",p->number);
& ^+ Q. Z8 C/ X, J p=p->next;
4 b5 c2 E( K! w9 c' n }6 `+ F8 Q' A8 f# C0 \3 s
0 G) O2 f9 L" N1 Q
. C9 D. R) g( F0 T6 B+ M
. w p' z% ?8 d" p}
0 E( q: M0 p# F/ @- S! l+ A0 V第二种方法:数组
' ` q8 `* b* C+ v- D h9 Y2 `#include<stdio.h>
( q( q3 M& b4 W#define M 81 P% e7 Z! F6 p8 J4 I3 w( I
struct monkey
" _2 E8 \' ^& u9 z9 `{int number;
* e& V! q( W v9 s# i5 R7 |) u% pint nextp;/ B/ j1 {( F$ o
}link[M+1];+ [$ L: Z7 I" g+ ^
$ J$ C+ R u* U, `4 h
void main()
, @, U" C2 E4 z6 u) W" i; L0 ?/ }{int i,count,h;5 v2 n& S; h9 D0 z4 W P# z* f
for(i=1;i<=M;i++)3 u8 z/ O1 @2 B) S" m8 S
{ if(i==M)# @& `/ Q0 h# q; S% s
link[i].nextp=1;, M$ C: A& N. f5 B% e) h; [/ ?7 V
else- d9 M# X/ `) f6 ?
link[i].nextp=i+1;% P3 \6 h. J' @' _; ^& t& B
link[i].number=i;. |/ S H4 w8 h) w9 |- \
}
, `5 _3 Z/ V9 v; ]7 Yprintf("\n");
3 `& H" @0 H0 Bcount=0;8 W$ z* U& [& I6 ?- [5 u
h=M;- T- t- q8 u8 m& h. Y
printf("依次退出的猴子: \n");2 q& P4 p0 o$ v
while(count<M-1)
) I6 _* U9 X1 M: m{i=0;
4 g, C0 e- y0 ]6 rwhile(i!=3)4 n* ?% N, T9 F4 w+ Y/ R
{ h=link[h].nextp;. ^8 Q" u' [9 o* T4 W' a5 D7 j3 f @
if(link[h].number)
& M5 o0 u3 Q7 f' V( K# y C i++;}
3 |& [9 a7 ]7 c6 _8 B! E3 Z w
/ x/ `0 p3 O) Lprintf("%4d",link[h].number);
. t8 i1 Y, \0 O1 P) w* P! dlink[h].number=0;+ ]2 ^8 b9 |: X0 @% d
count++;
6 W+ m+ Y% G) _# U2 @- W1 Z4 q}3 _2 L( u: p5 E+ k5 g
, p0 C( N1 M# u8 vprintf("\n大王是:");
5 H( H5 y. `; \ for(i=1;i<=M;i++)) b7 n2 k% M0 n: i( Y) Q
if(link[i].number)
6 H2 _$ T/ d- s! _) j printf("%3d\n",link[i].number);
! U( D. t9 o* k2 X0 S' u
; Z) _$ l1 L3 i/ p6 r5 O1 O+ k4 d- c6 [" P; M3 ?0 L S
} : n+ |0 W/ C+ h/ P7 m
第三种是普通方法for循环7 V* Z# x0 B4 z3 k' y0 m
#include<stdio.h>
. X- q4 E- L4 R) dvoid main()
( U. c: E; [. H5 J' Z: n3 V/ g9 S{ int i,k,m,n,num[50],q,*p;6 W9 I* A0 `5 A1 o- i
clrscr();
- k) Z" y4 @' C" Q4 d printf("input number of person: n=");
: i3 Y m/ }4 M2 [+ z scanf("%d",&n);; O9 S" ?; p; l
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只1 _0 Z/ r( H# o9 n. p4 T5 t: o+ [
scanf("%d",&q);
% i$ D5 u7 Q' t, D4 k p=num;' F% [" S* u$ H. I) P& F! B
for(i=0;i<n;i++)- V; s$ A" M& o+ r8 p/ [8 C
*(p+i)=i+1;
& {9 ^' \2 _+ S; D. T+ r i=0;
: f- f3 d' _- w W8 K0 d k=0; x1 J/ x% O6 L s
m=0;
2 T# d' G( H; [) _& d- r$ b while(m<n-1); T- r+ T( _0 d& y7 d: A
{if(*(p+i)!=0) k++;' X' L2 B! |3 h$ R; B& a
if(k==q)8 c, y- z& W# Z2 K2 n3 a4 H, u
{ *(p+i)=0;. I' s( q1 ?, y/ ]' u
k=0;
* g6 ?6 J. v, |8 o5 F' C$ V m++;
, U; h( Y% q' N }, R) L2 i# B- ^- G
i++;3 [9 U Y) |/ ` k7 U# g+ n, ?
if(i==n)i=0;
2 F e; \6 ^& v, [ }
0 C& o8 f$ {% R4 |$ x while(*p==0)p++;; J K9 \! s# ?% j6 g$ v$ u
printf("The last one is NO:%d\n",*p);0 T' w, {4 ~/ d4 s) A9 E8 o
getch();7 w' `" m$ }4 `* `
: j6 Q* i- P% A; Q7 A @
} |
|