|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!4 m1 \" \, s( @: F2 x( c/ X
这几天我在忙着编一个问题,我用了一种方法编出来!
! G. b0 T, P1 ]但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
/ P, I; x/ g, X) K, |' s% u注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
1 h3 c& y$ x" R! C
. l8 ?, a- X4 z2 A
; B! \8 e. {' s8 I ~ 题目
: Q) v. a+ N2 y% r/ Z山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
& s' ~5 `& J! b+ @; b第一种方法:利用循环链表
, ~9 b' q0 g# j8 |& V2 ^' S$ q#include<stdio.h>( ^+ b. H& m, c J& F- [8 V# r: C
#include<malloc.h>
( h7 H+ p0 W; F5 M. Q5 ]/ I#define M 8 //共有8只猴子: ^, n0 p0 [8 v Y9 V$ E" ^7 `8 K
#define N 3 //数到3只时退出第三只
& `6 m: x! F/ o7 ~typedef struct monkey$ ~9 k3 i$ g) x+ ?4 D
{int number;
) _4 N O1 V/ H; ~; D2 ~6 aint flag;& Y* [9 V# U, T8 b3 W; I( S' p/ j4 [
struct monkey* next;) a1 K- o* @; Z- l/ W/ W
}MONKEY;7 U* R- y/ }% h: U
main()8 K8 F, q! h0 i4 K
{ MONKEY *head=NULL,*p,*s;5 ^ w8 C$ r9 m# }* }7 y! J% H& D
int i,sum=0,count=0;
( w8 s; F3 z" [1 b clrscr(); //清屏
; B! N$ K" {0 i# O p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
, T* L9 f m/ ^2 W. C& X p->number=1;p->flag=1;* n6 d" S ~3 G9 d# F
p->next=head;8 n8 l. }7 z' h) x+ X
head=p;
- P9 Y# ?4 o$ \* i1 @! A for(i=2;i<=M;i++)
3 P5 G8 h. k x" |% g { s=(MONKEY *)malloc(sizeof(MONKEY));1 h, l6 M, i0 ^7 {( |7 g7 Y/ ^
s->number=i;s->flag=1;$ L1 F) _( H4 f( Q& Z% L
s->next=head;
6 Q& U6 N( G, I7 ?1 \ p->next=s;p=p->next;1 I: R% }% x4 @# M
}. M. N+ G' O% b
p=head;
8 H9 _$ Y) U$ T! S for(;;)5 a1 L( H J2 C: Y
{if(p->flag==1)! w x6 A# o" V7 S0 u, F
count++;1 f2 }% f u: @6 H
if(count==N); C, c. \' e8 n6 r% r" t* o @
{p->flag=0;& J' \& S7 ]0 @( Z3 q* o \; F
count=0;8 k" l* U; b1 X) h
sum++;} Q! Y- \. k3 c Y$ c8 R: b+ N7 H7 s
if(sum==M-1)- i& t' y8 Y8 Z4 Y c# U" @
break;
$ {4 |+ ?3 k; M: L( Z p=p->next;% l; l: y5 h R. D. v. m
}) _) o5 L) B& l8 D
p=
( F H$ U( _! H& G. z$ L) B head;
2 k* B6 j* ~! N2 o3 j/ Q" W: D1 Q for(i=1;i<=M;i++): ?5 w4 M; _: P: ~9 H7 e% b m! j. A5 r
{ if(p->flag==1)
' o. Z7 N# g# F$ f" S0 I printf("\t%d",p->number);
7 i& F+ F: p. Z! V$ I p=p->next;
. @; N# k/ Z( H, C: D }6 b; ?: \' u8 i, m
! _0 O; }, [* v- m" p
C$ P! v# s" M: z0 Y/ ~* }
* u1 Z+ n0 `0 s# y7 D}
; C1 i$ }5 \( h& F0 U7 ^8 Z第二种方法:数组' k' O8 l$ s+ I( E- G
#include<stdio.h>
7 r# ^8 Y. d' c5 M#define M 8* D2 b' \' s1 `6 ]) @
struct monkey
! v" P. d& K j( ]9 R; ~' }{int number;
9 f5 u9 I3 Y/ y2 q; I9 Q6 y& ~int nextp;/ b( M: a2 _- @/ D2 q* t
}link[M+1];
7 i2 T, ?6 Z) D" R( S$ e1 j9 L% T5 _2 _$ \" }
void main() o' o1 _% V0 ^" M/ N8 {
{int i,count,h;+ y2 Q b2 T- Q: j; D9 d
for(i=1;i<=M;i++)' R0 z5 [# I' c2 N1 k
{ if(i==M)
6 @; Q3 V) D, f4 o# k# f link[i].nextp=1;
; ~8 v3 k: x& e* S J; H2 N# n# @ else
1 t$ p9 h* [) t! C! S; Q! h# { link[i].nextp=i+1;# W2 V4 ~3 f; y0 H# k
link[i].number=i;+ u5 k# o, W# j8 N3 y ` i
}
, b$ {/ Q' d# X8 zprintf("\n");
$ V$ K# w. m5 ?count=0;
+ ]' M. e- K5 ~, w- n$ Dh=M;6 a% H) D, T& [$ J! d7 ^6 w
printf("依次退出的猴子: \n");! k0 ]8 d# O1 z( U
while(count<M-1)6 U3 h3 |5 \& K8 z
{i=0;
. I9 ]. _3 q- c ?while(i!=3)
' Z) ^6 p, a6 t! x{ h=link[h].nextp;' S& T1 j4 s# X& k
if(link[h].number)
$ l0 i# m; z" d9 `- K0 y i++;}/ w# N) N* m1 `, J3 t0 w
2 o U+ l8 v0 Y9 D' r; w
printf("%4d",link[h].number);9 I3 k, H$ w# E+ i' B t8 {/ C! w
link[h].number=0;
2 D: ? I* \5 {1 i' p% l1 E2 R) ycount++;" }% S+ R; ?8 @9 h7 [
}
* x" }6 B' z3 }! O, a+ t: W( b/ f* }7 W {6 G# }
printf("\n大王是:");7 w, d v% U4 u) E0 X. d/ h: |
for(i=1;i<=M;i++)
7 j5 ]' z6 V( x& {! F, g: L0 V if(link[i].number)
1 L! n1 A9 I8 T P printf("%3d\n",link[i].number);
+ N3 s% t+ q/ \6 y& p: Y/ b3 q* C( s$ }3 Q& J, }" e
! Z& {1 s, w" g/ r) Y; U. H} ; I) w/ `; M; v* o% z; n
第三种是普通方法for循环7 m' i* ]6 r1 P0 Z3 C
#include<stdio.h>
( ?- I- r+ O2 ?( S5 ^void main()
: F) K# O/ v) J# ?) I, ? J{ int i,k,m,n,num[50],q,*p;
e9 m, Z r& } I% J clrscr();
, P8 H- Y; e8 b7 }' \ printf("input number of person: n=");3 L! m$ y' E$ `. B( J9 L
scanf("%d",&n);* W/ k1 F+ y. \& F `
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
1 q; [3 s- g) O scanf("%d",&q);
' n: g) r8 e$ V p=num;
# p. Z; K1 [3 R. m# o6 H/ V for(i=0;i<n;i++), J6 x, W2 l- O. V# I, _$ z4 N
*(p+i)=i+1;$ D" c! {/ e$ W/ ^1 A
i=0;
* W5 ^1 D: H2 M! M/ s k=0;
a6 T# S$ B8 K3 M+ R& ` m=0;
. Z2 `1 C0 f) K" G# b while(m<n-1)
; V( w! ?) z; o7 z2 r6 @ {if(*(p+i)!=0) k++;4 g! k) l3 u/ S9 H( ^5 K# Q+ w
if(k==q)
% U1 H/ J* ]8 X( { { *(p+i)=0;. f; @5 N. x3 s. q
k=0;/ ]& B4 K X- V( T
m++;
8 u e2 g0 z' A4 h( w7 h- ~5 F }
4 I2 j* J8 g- X, [ i++;! k# Z% i6 S" T
if(i==n)i=0;
) V, s" K |+ z6 P( x, r }- F5 _4 {0 p' R
while(*p==0)p++;
' X0 U- k% A$ U' H( { printf("The last one is NO:%d\n",*p);
& G0 H0 Q6 k# w% [. @. c$ u getch();% }" {/ |5 \5 V( Y; [8 d
/ R& A- `$ H: M2 r} |
|