|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
6 E# m: ~: J' g$ }! G! Q这几天我在忙着编一个问题,我用了一种方法编出来! c+ r; l/ I4 l1 X, e& X+ f
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
9 w. [* O4 u7 E+ \注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 " H S& N5 |6 s2 g0 D6 T
' j( B3 d- |9 a- c" A+ r! m5 \4 A" i! \4 M+ X+ n, V! t. c# ]1 N
题目$ ]9 x* I$ C# J- M2 _# f
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。/ d% {& ^1 j1 A. \; r
第一种方法:利用循环链表$ n a; r: d+ B8 Z7 K
#include<stdio.h>
3 U0 d5 M5 w3 d7 a+ R6 W- m5 v* @#include<malloc.h>
0 @- e9 U( ?/ Y% n7 X* ~# v#define M 8 //共有8只猴子$ U) i: Y% w& v. B
#define N 3 //数到3只时退出第三只
$ p3 u/ F" O) ?$ Vtypedef struct monkey
. O7 K8 O1 y# T2 @, D2 r{int number;
, l- T+ \: ?/ O9 X. t7 W8 cint flag;2 s* j$ U( R, e
struct monkey* next;+ T* s/ r ?4 ~- w* J: ] a
}MONKEY;
, V% N# K# N3 D- H& n2 |! Z( tmain()/ d- q4 o2 H" b! U( T* [3 j
{ MONKEY *head=NULL,*p,*s;2 k$ _4 V/ H) ]) I$ F [8 j- R
int i,sum=0,count=0;
4 u; {9 p" @2 b! w) ? clrscr(); //清屏
T" B( b5 t4 J) ^ N$ G( m p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
, L7 v. F+ E5 {* J6 R( ~6 T. E7 ? p->number=1;p->flag=1;
# L2 u+ r7 ^& a0 b3 ^& [) {/ h3 S p->next=head;2 W; n% b; l3 e; i% ]7 i# b5 X, I7 h, M
head=p;$ s) S* p9 q7 q8 _" g6 x. o
for(i=2;i<=M;i++)7 w: f' [% n" O8 \
{ s=(MONKEY *)malloc(sizeof(MONKEY)); Z6 @! K- l1 B; u. E* ~) c% N
s->number=i;s->flag=1;
( L: S6 m, Q5 U1 @; M3 X s->next=head;
1 d0 O% e& {5 D H1 C9 b) j p->next=s;p=p->next;) }6 n. Z. N& R, S* r
}
" E3 K' R# s2 U, O N; i p=head;& C k6 E8 J6 p8 H. i) |
for(;;)
* W- v6 ]- D8 _5 f {if(p->flag==1)* g+ u5 E- J( s9 D7 U/ X
count++;
2 }) y; F$ C; l1 h. v, l6 q if(count==N)
8 A2 N U9 i+ N0 L {p->flag=0;; s8 \: v" Q3 B$ f
count=0;4 {. l7 \3 j" m5 c
sum++;}+ s( `: T0 c# G; X1 J* d; Z
if(sum==M-1)
& ^- q b+ b0 R8 S break;
+ c5 q: f: X4 O" R! y0 t: ?( o p=p->next;
: N0 _% j4 z3 x, O; T7 H* B. T1 Z8 A0 D }0 M, p& c8 Q* N/ m% \. O* I
p=
: N, a* M6 b: s# X; N6 }2 N head;
8 d* [0 I% p, J7 _- k6 Z for(i=1;i<=M;i++): D: q) p# \% Q6 b: V% W
{ if(p->flag==1)3 C8 N# c6 |* }
printf("\t%d",p->number);! P8 Y- V& Q0 ?9 O
p=p->next;
( s8 Q, G8 c7 [: {+ G+ z. P }
: X v4 y4 V2 \) A/ _% ]3 D
3 ~9 Z! `3 E2 }& {' I4 l8 ]
* ?: T( T9 q/ ^# U- s7 c# e) s. K" K
} 5 ]0 o2 t) w) J2 D; h0 Q% D
第二种方法:数组5 u4 x' P% m, W* S9 N b4 h' h6 O
#include<stdio.h>
1 X# `$ K H; q' a0 I/ k4 k7 m- k% ^#define M 88 A* r$ W* }) l: H2 n" e
struct monkey1 S9 b4 i4 [7 A: X
{int number;9 U0 l( o% `1 S5 c' i2 t1 f
int nextp;2 p) a9 p- a; x
}link[M+1];) |! a& _- b# X/ i
' K$ u; F7 [6 |void main()
9 i; F H5 E+ b{int i,count,h;2 ~% {/ E* D ?1 V' G. Q& ]) v# b
for(i=1;i<=M;i++)/ ?+ u9 W4 C2 b; O W
{ if(i==M)' ^5 Q* U- [4 h3 k$ x. R* ]
link[i].nextp=1;
3 j& a1 P+ M0 n: T' A2 f/ v else1 Z" S- P6 v! h. k
link[i].nextp=i+1;
v5 c: o9 _: z# H; a7 o4 k q: m link[i].number=i;& J& \9 A1 v; F, \- S" L8 P5 }2 D6 y
} Y9 m8 w( P+ h+ `
printf("\n");
# I: \9 N' ]" V5 Acount=0;
4 G& v6 b6 a) Z! H9 m8 Vh=M;0 P; ?% ~" X4 r0 X" D* R
printf("依次退出的猴子: \n");" M" Y2 \& s0 l2 N! o9 l9 \
while(count<M-1)
4 e4 m7 a4 z9 ?{i=0;: ] T9 Z$ I4 I! e2 {
while(i!=3)* s3 l: U& ^: Q/ E! U' F$ g
{ h=link[h].nextp;
2 e5 T" t) U0 y" Y f* ~ if(link[h].number)
3 P) O% {& V: f& x5 i, ` i++;}
9 P# z* ?: R+ I0 ?9 z3 w Y: [- R+ F9 w- f$ v' ^6 @4 G4 E. q7 |* R9 K0 G
printf("%4d",link[h].number);
5 b8 v& E, y* Mlink[h].number=0;
! L1 Z& Z5 z' E1 F/ a. t& z. b8 E6 ycount++;
" {& {$ y! G) V; P}
4 O7 X* [0 @" ` I0 B* O+ }# G$ ]2 Z3 C; H2 I. j# i+ H
printf("\n大王是:");$ _% G! `' P! s3 d3 {: X+ ^
for(i=1;i<=M;i++)0 P6 w8 l* Y, O2 L7 V0 R& H
if(link[i].number) e, U- L; d/ `4 i' ~
printf("%3d\n",link[i].number);
. j6 F( u6 V" K0 z7 T2 T- |1 P) R- R1 ?9 R& k
1 u/ u7 S" F% Z! d! z( C
}
' O( M9 I& {2 {3 H% W, o第三种是普通方法for循环
+ G0 K+ Y+ W& s) Q2 x' ?" q#include<stdio.h>
; w+ H" N) v, U8 N" avoid main()6 u# M# Y, T* u5 K1 n
{ int i,k,m,n,num[50],q,*p;
) v0 P ?* v9 ~! j# F clrscr();
5 q9 [1 D8 l I/ y printf("input number of person: n=");
# ~5 q% d7 f9 {( j scanf("%d",&n);
$ i: @* z7 s' ^# j; }printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
) b% @# Y. g7 B: E5 o, { scanf("%d",&q);7 R8 {0 v, v0 U- T$ ?, R+ A" ~- t
p=num;
: [2 _ _3 |) K& M; n0 N3 B for(i=0;i<n;i++)
5 l5 q* t0 Q% f1 X& Y) } *(p+i)=i+1;) J4 F7 K6 P& d, E0 `' _9 O
i=0;( n: V: Y: c/ Y6 u) S# r: `
k=0;5 @8 f9 A) x0 X% }/ c
m=0;5 U; E7 N8 E+ i7 w# X3 B, n
while(m<n-1)
# c5 P& o. I6 \, x* g {if(*(p+i)!=0) k++;
% ?! T% X7 v# [+ b l if(k==q)
$ i `0 ]( E/ | { *(p+i)=0;/ r/ W l( Y. o6 K/ ?, j. U
k=0;
- y9 \/ x6 ^( ]0 L* j m++;
( g8 n. q1 m7 t }, F% h0 J- w9 Q
i++;0 x" f0 ~/ L% U
if(i==n)i=0;
: c* C) e% C/ y }
& A8 z3 o$ u# | while(*p==0)p++;
( |+ b8 z- F% N' m7 h; e printf("The last one is NO:%d\n",*p);
" B. B% D; D, k5 H; d1 x getch();
- [! W6 U7 i- x! v: M
' Z) d- ], O p0 C" G} |
|