|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好! s, [0 p" A% d& U& r% d
这几天我在忙着编一个问题,我用了一种方法编出来!
. b! B' E( d+ T: p5 b% r/ q但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
+ d' i' ~, E H- `$ x$ _: s5 Y/ f注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
$ M4 a, W% N( S9 `* O( ~8 `" ?+ C" e# N
' \: W' M9 C4 k Z' Y: ~
题目
6 l/ _1 j5 x1 u9 ^( E山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。, J6 h: p% P) q6 X6 F
第一种方法:利用循环链表
M, ~9 P3 W( M% A#include<stdio.h>4 L2 t/ g* N' L$ @8 ~/ J
#include<malloc.h>% \9 m! l3 E0 g. B. B. \
#define M 8 //共有8只猴子
4 d( w" e6 g+ i- c) Y# m8 V2 w#define N 3 //数到3只时退出第三只
" ?+ _0 W/ w7 d! mtypedef struct monkey7 [! }8 F2 y$ d8 h4 r$ q% {
{int number;
7 f& a' T/ @) a+ O3 Zint flag;0 D4 g7 {3 a- J. v) B+ B1 R
struct monkey* next;
) j* X9 S5 j9 B' N( R$ O. u}MONKEY;8 j: j$ o: Y- w
main()9 e* _) e9 u2 _7 ]/ g* B# k* M! J
{ MONKEY *head=NULL,*p,*s;
( G, A% R9 ]4 @ X) `# H2 R$ j int i,sum=0,count=0;
9 q; e- o% y1 n/ x2 I clrscr(); //清屏
8 y$ @: V2 @+ Y) y p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存. c/ o8 s4 z) X3 `; d: a
p->number=1;p->flag=1;6 L+ Z: S% D( _5 s, G' a
p->next=head;
; @/ N5 C/ y& B( C% r head=p;, _( o4 \& J) ~& k" H
for(i=2;i<=M;i++)$ y! z+ e* ^4 S9 @! r" U
{ s=(MONKEY *)malloc(sizeof(MONKEY));
0 e4 ]0 n# y% ^) H" O7 W s->number=i;s->flag=1;
7 S* ^8 f, w `! V9 v# G s->next=head;
9 \% N. |- F! k% S p->next=s;p=p->next;1 u! @) p' B5 G4 R+ @
}
( F$ A: D4 u/ S! d! y8 l+ T p=head;
/ z |! C3 Y+ I/ t for(;;)
3 K( G- `6 ]' ]; E {if(p->flag==1). z, _9 A+ M& ]5 b
count++;0 [& c8 ]6 M+ a8 U3 H. e6 |- n1 m6 y3 j
if(count==N)4 ?7 A- r! ^$ a+ u" X
{p->flag=0;' {) c6 d' j5 O) b8 ~
count=0;
# Q( S- ~3 N% q+ _1 T ]! F; d/ \ sum++;}* @$ D: A+ Z( T0 T! t2 C
if(sum==M-1)) u0 m1 \2 ^; @8 j T o, U
break;; ^7 R; b0 f* r
p=p->next;
2 ~: e3 | p9 Y7 ?* N8 _3 z }1 `% m# v4 g h' G% w
p=
% k8 n+ s. Z; N head;# _4 h g' K1 u; y
for(i=1;i<=M;i++)
" J6 {0 B1 y7 }# A9 |1 r- S4 }2 U { if(p->flag==1)
" T$ @7 b; R" ~3 S4 } printf("\t%d",p->number);+ L7 E3 u! C3 R5 E
p=p->next;
, x/ |+ A; F! r5 G }
7 U5 D+ a; l5 O" ?( X, j* e. S( _
; l! Z) ~& o0 k' V: s9 g1 G" _0 k$ c* d Q
- x) P J5 G' e- u( O8 F} ' ]+ p: ]- i+ A0 J5 L' r
第二种方法:数组
1 t8 d0 W+ ` d: t- I#include<stdio.h>0 x+ x; ]- i- @2 T4 @
#define M 8
9 l5 g5 W2 N7 t; Tstruct monkey
. e$ M0 ^1 T" j; [+ m{int number;; n+ X, v7 Y6 W7 I L
int nextp;7 T( r" Y: I5 T& u% n
}link[M+1];
" P W, Y7 I% y
! Q; x, s+ b$ e- p- H4 kvoid main()
/ z0 G/ j6 c7 Z# |{int i,count,h;/ N4 _( m6 q0 J0 }# B5 B& V9 @; u8 R$ P
for(i=1;i<=M;i++)
+ O/ w1 P6 V0 h7 H6 t( I{ if(i==M)
1 R" w v C+ R# G4 g link[i].nextp=1;
* u/ v3 A/ A& `( p else5 N O8 c( V6 R6 k, }
link[i].nextp=i+1;5 {, H1 [. s/ O) V7 D3 |5 X
link[i].number=i;
( R% r! F# i; E2 b8 T4 p}0 y/ l* ?8 u9 N2 S4 c8 S6 K
printf("\n");( i0 E8 k; _2 H1 J! d, d
count=0;# ?) T; W( o0 p6 W5 g
h=M;# d+ a! X9 N( F( @3 u: z
printf("依次退出的猴子: \n");
; |. c/ W& \. A# o4 }& wwhile(count<M-1)# d% ~ N6 j4 [& k! L7 r
{i=0;
' s/ E( z$ V4 m# L5 v7 Rwhile(i!=3)
" G4 z' H& Y4 H{ h=link[h].nextp;
! A/ R. u ?4 ?& [8 f. [ if(link[h].number)$ k5 L) I6 R* ~: a
i++;}0 K7 U# Q. s& m: X* D# I5 m) O
5 s2 S- x6 S# I, F( k( {
printf("%4d",link[h].number);
# l3 x/ z! h$ k5 q4 J+ d5 c, Y2 elink[h].number=0;2 J. R6 z) ]2 D: O9 X
count++;6 n4 d( e% a9 L O8 V4 l
}9 X9 y8 g# q! J- B: [, B$ }
, f4 q/ m) J: ?6 c0 u& b
printf("\n大王是:");
, t: v; h& Q4 ~2 x0 M for(i=1;i<=M;i++)
& M% J8 n2 }+ c) p5 | if(link[i].number)7 t' Q8 E4 Z- I7 R: ?
printf("%3d\n",link[i].number);/ k3 B' @4 }/ n: b& x8 M
. C, C1 J3 e6 T5 o, X* L5 q9 w1 ? E; ^
}
) Q2 Q3 c( C( m5 r$ j第三种是普通方法for循环( u: [; } [$ P" z
#include<stdio.h>" z* n0 s. m8 [: B8 F5 b" m" P5 u
void main()
% [5 T; S8 e: c6 O y{ int i,k,m,n,num[50],q,*p;" d9 O v& X$ ?. S. E0 Q' [- y) H
clrscr();
* o7 }7 L3 w) | printf("input number of person: n=");
9 y' V& G& i' a8 E- I scanf("%d",&n);
, n9 p1 U' s% ]! u. A! B& x0 q# X* `printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
! q( x; x, ^1 M6 O/ L scanf("%d",&q);
7 J& e& B3 w+ e2 g. T1 [5 } p=num;
0 V- s& Y8 _* v+ C' e for(i=0;i<n;i++)
" z. P6 u8 l9 q( [- i1 j *(p+i)=i+1;% {! K5 M- J% Z7 F
i=0;4 z0 _5 M) x2 J1 Z% L
k=0;
; f. |; U* {6 I9 L m=0;
/ D2 O6 p1 Q! ~6 a2 y while(m<n-1)
6 ~! J2 @ b ?! c3 S; H {if(*(p+i)!=0) k++;6 Q: ~$ Q4 T& A9 T
if(k==q)
6 R' {: G5 J m7 [/ ^ { *(p+i)=0;
) C3 J' W+ U# @# t' x) |, H k=0;
4 W$ B! o1 L& T% v$ t& [ m++;3 p7 R/ O' l: u7 a d0 f9 k
}/ K' w$ t0 U. n' ]' \8 U. \
i++;
6 Y8 r: y5 n G4 J% u4 u% Y8 X if(i==n)i=0;: L' Y- L* w# ~( _* Z
}
. a1 j" \$ @6 [* m) \8 F; I while(*p==0)p++;
' P, w: E+ p& z3 r% {6 B( ? printf("The last one is NO:%d\n",*p);
, b% L5 T, A- G/ U getch();, V5 H* Q7 d4 p g6 o3 K: X
- X3 D/ L4 R8 n} |
|