|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
×
大家好!
+ k+ ^+ X; s' S( }% n这几天我在忙着编一个问题,我用了一种方法编出来!/ W6 U0 ] } n4 x% @. ^5 A. Y
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!3 r; u+ s+ B a1 @2 @# V4 l
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
( T) @- i7 |' ]# F& x0 S2 b( i0 J: m9 ]
+ ~0 l2 {9 v4 C5 ?
题目
+ h$ q1 u1 g' {2 m山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
6 K1 N, c3 Z" x& f. b. ]第一种方法:利用循环链表
4 }* M, z8 s: Y* B8 b0 u- T4 V#include<stdio.h>, s7 B3 i0 L2 t' E6 p$ i
#include<malloc.h>. V; Y4 C7 e8 M* _5 v* v5 v8 u
#define M 8 //共有8只猴子
7 N* Q4 F, A, F+ e#define N 3 //数到3只时退出第三只
; p" Y& W6 K. m/ l: u0 ^' Btypedef struct monkey6 A/ m6 V" h) F, m% B
{int number;
; Y( X: Z/ z! ^int flag;
8 j' |* x% j# {- }4 P5 estruct monkey* next;( l7 h- i: ^6 s6 t. n7 R6 `3 v
}MONKEY;9 g7 p* q6 `8 D! a4 G4 L
main()
% S: R* D6 j* e* L5 w! S3 H: b% W{ MONKEY *head=NULL,*p,*s;
' `& Q: l" M9 {$ T int i,sum=0,count=0;
% G. }( ]/ M; b: ?/ z- r$ z clrscr(); //清屏. }2 }3 U0 Y* F% t5 ?( ]
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
; o( |) w( S' T0 x! I p->number=1;p->flag=1;# L3 t5 r6 E1 ]& z
p->next=head;
' m H* g2 ~: L head=p;
- C' M8 J( Y V! n9 {0 k for(i=2;i<=M;i++)
" u4 |2 D K& I: K% c3 s A" R { s=(MONKEY *)malloc(sizeof(MONKEY));! F; L- c/ B% P
s->number=i;s->flag=1;
. H4 c" X( Q! o4 e/ j: m8 r s->next=head;. k. O. Y; F+ N H/ M, ~+ M
p->next=s;p=p->next;
. ~ y6 F* p+ S6 C) ` }
6 h& |3 B5 S8 Y* E p=head;
4 y; ?% s. {' n# C, l+ c) {$ Q1 R% U for(;;)
+ w4 ~) C& ]: v- o0 d9 m {if(p->flag==1)
: v1 [+ T7 S0 V0 L4 j count++;. ?8 U7 q. |4 X. \+ D6 Z: d* D) i
if(count==N)
( y! R3 a G2 E9 I2 d {p->flag=0;" l8 ]5 c3 m. ~( S& J
count=0;5 r- C( l4 x1 h* ^% e
sum++;}
d0 ?) `1 o0 T9 |9 `1 O if(sum==M-1)
* e9 Z+ w$ z! w2 v5 n" K. [ break;) a" i9 x/ k. ~5 i
p=p->next;
+ K$ n! L$ g8 W: {. f d$ z }) ~2 S0 w. L/ T% v
p=
& z$ S3 z" v( K3 w: ~4 c head;* ~* l$ [8 c5 i
for(i=1;i<=M;i++)
! O+ s4 y3 ^. @5 i) W/ b { if(p->flag==1)
. Z0 @4 Y! q8 k printf("\t%d",p->number);
$ F. n$ |( H$ G, ?. n8 O% D0 E$ W p=p->next;
, y" k o9 K: o4 N2 @ }0 m, W5 W; d) N7 I7 ] v! \6 a- q
" Y& f9 K! J# ^
, O1 E5 n: x; p* Q) g5 @3 i, l8 R3 ], v$ C1 L. o4 G: _1 b& o8 P# S
}
, Y! T$ m3 V/ M2 L( |! r5 x第二种方法:数组
8 y5 m( F' O* K: ?9 m#include<stdio.h>
% S, G; Y* K! R9 i: h#define M 8
5 J1 G+ H. K7 I x' y, n8 ?% a4 {3 [struct monkey
4 Y$ ~, E7 E3 E# s: |. r: b/ h{int number;6 ^* a+ Y2 g" N9 r6 K
int nextp;' k( m" T7 ?$ V2 W( z# G# i0 \
}link[M+1];* b3 G, Q, W; e% \+ O8 v
7 g: g/ w4 k# q$ U. s$ Cvoid main()
3 C% U/ k9 y2 L. K) U{int i,count,h;
+ c$ Z! J& e* @# J% Zfor(i=1;i<=M;i++)! y1 j& h+ R2 \! a4 G8 G# Z
{ if(i==M)0 ~# T/ r1 R' r% u: B R
link.nextp=1;
2 Q* G( }4 c, m0 W* ~' m else
) {5 ^' A( C A/ R( Y2 R) H* D+ t3 A link.nextp=i+1;8 ?3 r7 w* v" v1 I: W0 C
link.number=i;
; A; ]% R* R# E9 G8 j}
2 O! ?% A) y3 ]8 `2 U! K5 `printf("\n");
4 D; X- j( {8 ~0 Hcount=0;' A. h7 n! |6 G( Q9 b6 d
h=M;
; ?8 ~- L8 }( ]- n" X) {7 r- ]printf("依次退出的猴子: \n");
" C" f$ O7 e3 |while(count<M-1)
2 ]' N6 Q. z; a4 e$ p{i=0;4 _# n# _5 Y! L; c% G& ^
while(i!=3) h9 e l* D* I j; C3 Q/ q, U
{ h=link[h].nextp;1 Z$ m9 {/ Q* n5 a8 ^2 F
if(link[h].number)
- E- o9 B2 ?& L: x* Q z" H5 Q i++;}
, D m' T, o6 g2 [4 v2 d% p; G9 [( {! z
printf("%4d",link[h].number);5 p" t, c: j/ `3 \$ a
link[h].number=0;
/ z4 [' T& \7 @, g3 r1 Acount++;3 |: Y6 R0 o" j E" k; }
}$ m+ W1 x. }3 e" W7 d2 Q
$ l" `7 X. w" ^# Lprintf("\n大王是:");, |. j# N8 ]& T6 e/ `9 t
for(i=1;i<=M;i++)
8 [7 \+ L* F4 Z0 v1 I8 I if(link.number)
9 b5 w. W" |' e6 r printf("%3d\n",link.number);
" r7 J8 f3 v: R: w
; O: b. ?8 |* L/ P
* C9 l. I. `- d1 e7 j} 6 X( A! @. `, E0 ^( o
第三种是普通方法for循环
/ N0 K) D# ^( P! R( c0 w. e- C- G* P#include<stdio.h>
4 b# H( V2 Q% |1 p2 z& A! @9 cvoid main()
- g3 g+ p' W5 ]2 ~) f* }! y$ B{ int i,k,m,n,num[50],q,*p;- ^! U- D3 f' B& M8 ^
clrscr();
4 V& j$ L7 `! k! f6 M printf("input number of person: n=");) ~; @7 D9 e) k3 T
scanf("%d",&n);
: o4 f' m3 o& k4 |printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
: B7 O9 V9 w. Y, L. u$ Q; x scanf("%d",&q);, ]1 s* g$ O6 P: u5 X4 }0 Q
p=num;
K8 n8 t& m x for(i=0;i<n;i++)
3 X6 Z3 h" A( T5 t; u *(p+i)=i+1;8 A& X& j I& e+ `
i=0;
) t2 P# q- L# H k=0;3 L2 i) G) s' s) o2 y7 [4 ?$ v
m=0;( k: L2 B* \& {
while(m<n-1). O& u/ i1 p2 K* r8 C4 `7 E# l+ X
{if(*(p+i)!=0) k++;/ \* M7 ?& X) `1 U6 T8 @/ T! w
if(k==q)! `6 g+ L" A: v% P; l
{ *(p+i)=0;
$ T8 {: ]2 i: O2 M. ~4 \+ X k=0;) S: J! p0 X1 K9 J0 U
m++;
- a( ]8 N$ M+ }0 z J) ] }
6 H- U3 N( B# ]0 S i++;
# P( J4 |( |6 Y- H; V& y if(i==n)i=0;% i" K& A6 ~. |
}
& m) w: R. L! x4 W% k$ r: ^+ E4 c while(*p==0)p++;
' O9 _6 b' D& s printf("The last one is NO:%d\n",*p);2 m$ ~0 i( x5 C& D
getch();. Y7 r& J& x& m& v" E
) |7 A7 L5 j3 H" r! y0 u/ c} |
|