|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
, Q* A) q/ k- r. i& f这几天我在忙着编一个问题,我用了一种方法编出来!. I/ s* m2 V* A! n
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
1 N0 i) N' t! v7 a2 O, e注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 , ^# S# W l1 D! E& |; V$ K' t/ v* z
1 Z( \ f. R+ b/ b
y8 T6 F* d% D' P 题目
; Z- H% l: `' J# t5 ~山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
3 K8 ]0 K) m* M: F M第一种方法:利用循环链表8 `9 z. W& Z7 Z
#include<stdio.h>/ c7 n; b% c5 h! E, r3 W$ J% b
#include<malloc.h>" z5 y; u. O6 e2 s) k
#define M 8 //共有8只猴子
0 ]% Y, `2 x7 Z; c#define N 3 //数到3只时退出第三只( e6 h, T* O% e/ W' E. s/ ~
typedef struct monkey
' m* }) ?6 h6 V& w$ M- s{int number;( q% |8 J! J, d
int flag;9 ]; M# p% ~9 m2 Y! ~+ @
struct monkey* next;4 M Q. j$ C7 j- n" v
}MONKEY;
+ ^+ G* @ v6 t1 L6 D3 z Nmain()% ^! j# |; H' C: b" _
{ MONKEY *head=NULL,*p,*s;
5 v2 Z% ?, u$ c' g9 x, v1 Y$ ] int i,sum=0,count=0;) \; L2 f9 h0 ~0 \- @
clrscr(); //清屏' r/ @6 _. l: x5 b: n. q
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
! _. R' m3 a5 e: o" H9 l% B- S2 C. [ p->number=1;p->flag=1;3 D5 G0 U5 ~7 ~+ C
p->next=head;
: F6 E% |0 f# r3 M head=p;
6 m! _ c0 R; y3 | t k: Q for(i=2;i<=M;i++)) i" Y. f- L& o! G2 a9 V5 v# N6 C
{ s=(MONKEY *)malloc(sizeof(MONKEY));% h% h) G W- t1 M8 q: A6 z
s->number=i;s->flag=1;
+ x! x: H6 h4 I4 n" n0 f; \ s->next=head;
: H( ` a0 h) [ \# N s p->next=s;p=p->next;
* T5 y- @' N7 c" { }
# D. B& ]* R2 K) h. g. j2 { p=head;
8 t# @6 c3 I: T. b for(;;)# S2 v" z4 N/ @2 [7 p* o& {1 k
{if(p->flag==1)
/ r' u& T9 T+ f# t5 b1 Q9 S count++;
; {% Q9 s+ K% k. a8 t if(count==N). z9 |, G# a$ r4 I
{p->flag=0;; U0 n6 U' X" j. d# ]; P5 Y
count=0;
$ ^0 M7 k6 N" M! f9 e) Z sum++;}- Q0 N1 N1 S$ S H
if(sum==M-1)! ~: h& G. ]$ z6 w D0 W0 m& U+ K
break;
, l o! n ]4 G9 z1 G p=p->next;; M7 R8 z+ w; ]/ y' `$ m- `
}# a' [- a0 \) t4 K$ X6 l# s
p=. b" S( q) ?9 a( w' Z+ {
head;6 a! J: L7 q' f
for(i=1;i<=M;i++)
5 {' S R: k5 Z, Q( Z { if(p->flag==1)7 s9 S% y3 t+ j8 z, X
printf("\t%d",p->number);
- J; | H7 | [/ _ p=p->next;
, l( [- R( K1 B; I }
+ \6 I# ?3 x9 }" @: j5 n6 T/ F$ u/ Y9 C* r
( P2 e+ `7 M! e- T9 c
9 ~9 ~: k1 @( S2 C3 a2 M6 a7 z} - e8 ?, g. z% Q
第二种方法:数组
* Z0 j7 k: c2 b7 O9 R#include<stdio.h>
& r& _/ e1 n1 a2 x0 M#define M 88 S* u! I L! ^6 K* g8 i
struct monkey4 f- W/ d$ L/ F6 W6 c c
{int number;
( S1 {: |+ S/ a5 {& X9 ?" B6 ]- oint nextp;
5 B8 Y1 B- T( e6 J+ W}link[M+1];
% A k5 P# B4 K5 P- G
/ ` G' o7 n. E D. bvoid main()! J! [, E7 D$ K8 W% w% y
{int i,count,h;
% d/ r) I- o$ H& a0 O5 hfor(i=1;i<=M;i++)
2 W( j' r' L: ]{ if(i==M)% k# Y9 ]) f# {, Y t8 G, j
link[i].nextp=1;
8 E8 A: I f6 L1 w9 I6 B' w. P else
+ Q1 q0 k5 a, h8 o1 T* U* v link[i].nextp=i+1;6 X0 W( ], ]2 o! [
link[i].number=i;
# \* P: e: Q9 u9 D9 A4 I}7 p' {4 V! L9 Z- P* P" |
printf("\n");& n% T U( T% p% s
count=0;7 |2 B& L3 ]( y' i i! _/ W
h=M;4 g+ n3 O5 e, U
printf("依次退出的猴子: \n");$ g [3 _, t7 r Z
while(count<M-1)$ K( n. y( ]3 K+ b
{i=0;
, ]7 h. P- _7 R* v9 O2 O7 Bwhile(i!=3)' a; E2 W3 b& v& @% N1 R
{ h=link[h].nextp; L6 n& P# k2 o
if(link[h].number)
/ f- A- F+ @* B L i++;}
7 p* l0 e; c! z/ d, q0 e# X: A: {
1 X) H( M; q! Uprintf("%4d",link[h].number);
2 ]5 u" d) Q, Y& J4 [% ~link[h].number=0;
- R# k8 e$ G8 U o% B9 U3 D0 j( Ncount++;+ p9 ^+ C8 t; h3 q9 T, x
}; @1 n( W. Y& X: D" f V
% t% z* U, ^0 X' j w. w9 n$ sprintf("\n大王是:");& [" H! g% N8 n4 ^
for(i=1;i<=M;i++)
E, @ u% g; i% A! b+ T if(link[i].number)( M: u7 i. t1 q2 K" ?0 w) I
printf("%3d\n",link[i].number);5 q' y l2 r4 {* Q- O: V T
! ` m9 H U% W5 R! P( c& n' N( w8 H# g* X# z# w- O
} : K9 i( y- P) x2 Y
第三种是普通方法for循环, \5 D% d3 V1 h( G4 d0 ^! v
#include<stdio.h>8 f) x7 U* S5 f8 E- S! ~
void main()5 P. Q' H: u3 q8 W( Y
{ int i,k,m,n,num[50],q,*p;
$ L" T: s; X, G( {8 k+ L1 r/ D clrscr();
' }3 P% G/ c. d) J1 h printf("input number of person: n=");
3 a; s+ z7 [+ c scanf("%d",&n);0 A* a9 d2 \6 S1 i0 b$ W' ~$ p5 ?2 a( F
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只+ S, B- J0 `6 b0 f' l7 u
scanf("%d",&q);: L5 Z8 H- {' R
p=num;
' u, ]2 R* P1 Z for(i=0;i<n;i++)
' j; N' i* D& m *(p+i)=i+1;
% K, B% M9 B" _2 n i=0;' m1 v0 `3 ?% T( u
k=0;
0 X0 i) D) U" \, _1 b5 [ m=0;
: T* }& Z; I' }- | while(m<n-1)
# i" r$ V$ {. R' F {if(*(p+i)!=0) k++;
' d2 Q3 f3 R R8 U4 j if(k==q)5 N( d! k: o6 b; i M+ e
{ *(p+i)=0;
# k* E0 D G- M) n( ? k=0;
; A1 V0 r6 }1 }' ]* u: d. _ m++;
! n# w9 N6 h8 [# F3 b4 O2 Z3 |5 u3 e }6 \! }5 Z, p. ]& c4 ?
i++;2 b. r- e( @1 R C! n. I J" Y: x
if(i==n)i=0;
8 s8 k: U( T g" I) Q; |$ j$ L E }
1 L* `+ r& G9 i# ~2 x$ L* @ while(*p==0)p++;
! c5 Y9 `! I5 m7 ~" X$ C- c printf("The last one is NO:%d\n",*p);
( j" c& j7 y- W" F0 _7 q9 K getch();
" @2 b- R9 `7 c* n3 _' r1 E: f8 s+ t0 B4 U9 h0 p' Y: L% P2 Q l: ]
} |
|