|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
3 m! x3 V2 P, q: R+ ?) P这几天我在忙着编一个问题,我用了一种方法编出来!
9 ?3 q9 W; w" b% \但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
" q' B! m( g3 a6 ^. V注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
, R( p1 S7 \' N0 e
4 e @5 Y( o( y5 h4 u+ x: X2 n* P: |4 u2 k0 c
题目
$ ~1 d/ E$ n P" n山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。8 M. A3 o/ _- ~% \! C ^
第一种方法:利用循环链表
( p# t4 m2 g* V- e/ x#include<stdio.h>
8 R+ X2 _; U \% L! E#include<malloc.h>
! k0 X8 ^* @8 p1 W; Y! [#define M 8 //共有8只猴子# T1 U# `$ Q# I6 z1 n% y6 w' t
#define N 3 //数到3只时退出第三只; b: {- t+ Z1 T w; W
typedef struct monkey
! p K4 W3 x9 b{int number;
( b% B7 M8 ^: ?# A; \int flag;
2 m; M' Y3 R" f0 ~7 @- i+ \struct monkey* next;. R9 Y9 M o7 P7 v( ]9 K B) z
}MONKEY;6 Q! o+ L( a( R2 ~
main()7 X" s. a; ~# W6 x2 G- x) Y
{ MONKEY *head=NULL,*p,*s;
/ j. Q% I3 K7 l! v7 N: D int i,sum=0,count=0;" J6 y5 b1 `, x/ V
clrscr(); //清屏4 E+ H( H7 `9 ~
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
0 p! G$ I2 j1 b2 b0 j4 v6 S7 o p->number=1;p->flag=1;( p# @1 U/ g+ `: s# X
p->next=head; ^" ~! l t8 A& n- A. {
head=p;
5 z/ R3 s) Z, [- {$ C: J for(i=2;i<=M;i++)
# S9 K& y3 y6 M { s=(MONKEY *)malloc(sizeof(MONKEY));
7 a3 ]3 G" }) z; `- @! n" { s->number=i;s->flag=1;
. D$ K% e! F6 Z7 K, W s->next=head;
+ m4 t. M& j0 |0 U; e- t' U p->next=s;p=p->next;. t- n* w0 K. v& Q1 R E" X
}
, o! n6 i$ A. Y2 E) K p=head;$ k. m7 ?! o! g, I
for(;;)! Y, M& \3 o5 A; y( J
{if(p->flag==1)9 j V9 S$ c* b8 X- |. `9 n
count++;
* P/ x1 l* G& [ { if(count==N)
|: V6 ^0 ?1 O9 X5 z+ b* }6 ]$ N/ D {p->flag=0;
+ `0 \" _1 a0 Q' d- r count=0;# z- i @, x3 l* h) u
sum++;}
7 {9 D$ d+ G) i# r8 q" o7 [/ c" s- ` if(sum==M-1)
& d; N3 Q- k2 p8 w# ] break;* Q6 K. j1 F) n8 b2 S `$ j
p=p->next;3 x& C( @5 ?4 c% P, }6 o, _
}: ~) H; c/ E, p4 \( z! P0 _4 T
p=
1 o& n* Q! G' a, K( I2 Q head;
; J1 f1 x8 }3 i/ c& n for(i=1;i<=M;i++)
2 {8 M% ^8 V& v7 M1 m9 T# d { if(p->flag==1) R7 L' ^9 ]) z* o9 ~' x
printf("\t%d",p->number);8 Y- s2 _; f8 v$ {# f1 j- v# q
p=p->next;2 Z) H5 V2 t7 c0 ]/ B
}; m, u v0 R5 ]5 b
* N) n" n5 W9 d" V& u0 `! i' H5 N5 v
8 H) I* {5 R# v. ?7 B( w
: ]& P( ^! o# a9 e6 u}
0 o, q/ t; P! \ s" W' ]第二种方法:数组
4 x, t5 c, j4 n* Z#include<stdio.h>
+ O- d8 X' T% L; {! R#define M 8
8 w1 o' L+ ^3 q, j5 }# w/ dstruct monkey
& S: A5 n: r C{int number;' A6 {* q2 i! B2 H# [$ B
int nextp;1 |5 s: S2 ~! o$ m+ ^3 D0 K
}link[M+1];
1 m) \& h! [1 x4 Y# M5 `/ ~) N0 N& d3 W6 b* h' u
void main()" w0 b" d+ `5 x/ [) @( ~0 n0 h7 j
{int i,count,h;
5 r5 q7 ?- l+ w% `3 @2 f: p2 y5 P7 Ufor(i=1;i<=M;i++)
J0 A' {, v z6 f6 W; |8 W{ if(i==M)
/ b' v6 `8 B0 u" b4 E, x7 P" ` link[i].nextp=1;0 x8 `, _" r5 A) Q A, y4 Z8 {0 U1 u
else9 b* _5 s; D6 j$ g4 ~0 ~. N
link[i].nextp=i+1;( Z. Q' |7 G. u- w$ ]
link[i].number=i;
3 b5 h+ {0 H6 @% O6 e# E F3 {+ t}
: g+ m; O# P3 T! h2 |printf("\n");
. m c) x" d. \+ S5 ]# Z- @count=0;( _8 g- w+ z7 H
h=M;# x( p, d2 u8 B0 N1 S& }7 O& p8 B
printf("依次退出的猴子: \n"); J1 x( ]7 R: F: c% ~
while(count<M-1)
# Y# C3 a9 M% E0 i8 {( z{i=0;2 c9 d( f3 i# {, Q& `& e& `
while(i!=3)
' t+ F9 N* K# H- b2 r; m, z{ h=link[h].nextp;+ O# {4 z6 _2 |7 L8 @
if(link[h].number)
9 w. v, ]8 O# A3 p# D i++;}0 O; P; z7 Q& \0 \8 p7 ?
) R$ O, _5 S3 H4 L$ b
printf("%4d",link[h].number);
, z6 Q; w+ X9 V& m7 t2 ]. K/ u# F: flink[h].number=0;* Q0 `: R' ]' V8 v# C9 P2 I
count++;
9 d, s2 y/ B/ I* F: M1 _- i}3 [9 |: [$ C. ^1 N$ J* S' u0 t
4 F3 b$ p8 q: D7 }. D; |
printf("\n大王是:");7 v; l, r( B" n& D
for(i=1;i<=M;i++)
4 v- G" G# n' Z if(link[i].number)! s/ P) n+ O* Z( }- [
printf("%3d\n",link[i].number);
) ]* h+ b3 E, y m2 L/ n& {% A0 W0 E9 m' A: q% I
7 l9 @3 |" V3 l; f( v& e7 D}
' {7 ^6 p$ m" J) J第三种是普通方法for循环* M4 j- h1 n% O3 l3 z! F
#include<stdio.h>
1 l( ~1 S; Y" u8 Yvoid main()
: K4 \5 v7 N `; d{ int i,k,m,n,num[50],q,*p;9 f" b8 I. H9 O+ n) l. x
clrscr();, k4 L( C, R$ c% G+ h( ~
printf("input number of person: n=");6 i" I- M: _8 H' J9 V3 O
scanf("%d",&n);
0 h+ l2 Q% e* {: y$ a t* gprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只* w1 B/ Z# W& r! W( b) A( _7 K
scanf("%d",&q);
8 L! c1 s6 D+ d2 j% I: J p=num;
$ W4 N! o& G" P& e; o9 x3 ]6 t for(i=0;i<n;i++); W( F! S1 h) `4 c" _- v5 {
*(p+i)=i+1;
, o9 ]9 r; C! q6 e d0 S9 r i=0;
8 }4 x* n8 A9 G. B% L$ [+ e! U k=0;5 j( K" Y/ [& m1 j1 w4 |( f2 t
m=0;
& _4 V: G0 |( f9 m: [ while(m<n-1)$ s4 j" g; m# i! H7 t
{if(*(p+i)!=0) k++;
2 G0 { {* y' C# B, N- | if(k==q)
& w3 Q4 j1 {8 q, R% r+ A# W { *(p+i)=0;; Y* x8 I8 T# R/ \: w- l$ W
k=0;! W' K6 |8 `1 H
m++;
) x/ M: E f. `. c0 c }0 y& @3 H! O9 J- c. [5 g
i++;
[+ p, n! b G' y5 U% m# f) |4 m if(i==n)i=0;+ N, i% b- h; Y, N2 o
}
4 l5 m: {9 e% x/ u5 i while(*p==0)p++;
1 B/ ^% D) F: t! Z" Y0 m3 Q! H f printf("The last one is NO:%d\n",*p);
% {0 z$ Y- y/ R* r6 T! m getch();
8 G" y7 }' V. R4 N- r
1 P! t, {# a6 \" g R} |
|