|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
# T) |- o7 ~( W8 |: h这几天我在忙着编一个问题,我用了一种方法编出来!
/ _2 b! c( p3 U6 m但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!4 V H) i% [/ @& n1 g4 I
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
1 w! A3 \/ Z" C/ J3 R+ @1 L9 ]" J
) I! Y8 `4 `% q1 w# P
% A4 |/ P3 P/ p, _' `: J/ f. G9 w% i 题目
4 s( A S2 R3 v/ s, ?山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
4 i M) R% A0 J6 F7 t第一种方法:利用循环链表
. u7 o3 g* x" e4 O5 ]- j* R, J#include<stdio.h>
" l& ]& ^+ e$ G; m. J3 b#include<malloc.h>
- t: z3 V6 Q* ^2 H; r" k#define M 8 //共有8只猴子
' X/ l/ r1 n9 b#define N 3 //数到3只时退出第三只# T" B) b: }% i/ Y& f ]+ |5 E
typedef struct monkey/ D! Z5 C) C0 |9 E4 i" d
{int number;
; E; O% i/ Y5 i1 dint flag;
% O) z. X# h3 _6 O( R+ K: Ustruct monkey* next;" s5 r) e! q/ S& O
}MONKEY;- |" s' P1 f, Z4 H5 u; t* ^
main()
5 P- U- v4 ?% B: o{ MONKEY *head=NULL,*p,*s;
8 }* c8 K0 ~/ `1 D5 n: r int i,sum=0,count=0;
2 I6 G$ f5 d2 ` clrscr(); //清屏
: a" ~9 N! v2 G p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存/ P0 G4 c. ~) t* k$ B. L, B& s0 i. b
p->number=1;p->flag=1;8 F+ d2 N" M$ @
p->next=head;
2 ?3 ~: f. J2 D% A" s/ \ B head=p; q9 L4 H7 k% n0 \7 m
for(i=2;i<=M;i++), ]4 Y4 e1 W% u' U0 G8 P. ~& f" C% t
{ s=(MONKEY *)malloc(sizeof(MONKEY));
" O. L& @/ h2 J0 ?) h9 M c2 T! A s->number=i;s->flag=1; u5 l! F8 _8 t( F4 d% l
s->next=head;
& R2 T. S% M. p4 _8 j! d6 l p->next=s;p=p->next;' C& |0 j2 s; k, x% q5 W
}! O1 M" ^' R1 Y* p6 `/ m
p=head;
2 y% V* F8 T+ c, j9 x% [ for(;;)
# r# M. V4 F1 o, A) W/ X, _ {if(p->flag==1)2 p/ X/ Y; M7 ?+ L6 r7 O) g0 e8 ]* I, m
count++;
* h) {* z9 x& D$ T4 O' ~. R5 T if(count==N)- H! P8 x' } o' i% a
{p->flag=0;& ~! E6 c; f5 D- P$ t0 z( M
count=0;
5 ?( w! l; j1 u0 I sum++;}
& D0 @! u" K0 d) j( D! p* _ if(sum==M-1)
% v6 T/ F% C% V$ o6 b/ f. O' d3 p break;, v. W# _/ I: Q' s2 f; j# I3 I0 \
p=p->next;
2 k5 N) u( n6 i }
; H& F+ N# k% V! b& [4 l' A p=
/ ^+ g# d: k i. F1 Q+ s" Q head;
. Q+ y( C7 g% W* X- H for(i=1;i<=M;i++)
% a- y( {5 _! g. j; z { if(p->flag==1)4 D/ v/ d/ k5 t" r5 n
printf("\t%d",p->number);! _/ q2 E, T3 y4 p/ @% \
p=p->next;
. d5 r+ R6 B) G: ^ g+ f9 ~7 d) X }. I4 K) H5 b" f. V, u* M; [8 x( B. t
1 ?' E! M. y% u8 t4 N& M* N
+ ^& {9 u# E( W
, Z! J, E4 F$ D5 N8 \8 E% k} " d% q" [; N$ s* e$ C0 o# U
第二种方法:数组6 l: t) E# t9 u- |7 p$ X- X; `+ m
#include<stdio.h>& ^8 l. v6 S+ A/ S! C- v% G8 v
#define M 8
! k% L5 B3 _$ ^- j8 pstruct monkey+ m9 c; b7 l3 G- r
{int number;
0 g* s- s$ }; R* e$ Y; @# {' V% _int nextp;
( A/ \: A# V2 C0 ?2 i' K}link[M+1];( ?5 \) S. n; a" l
9 h3 `$ h6 R- p; ^8 v$ W
void main()
0 Y9 \6 [: D. Z/ ~{int i,count,h;
( U+ \2 T7 a, y& Wfor(i=1;i<=M;i++)
# u* V5 Z" Y* S8 V6 q/ I/ q$ ^{ if(i==M)
. F+ e& @7 r4 w link[i].nextp=1;$ z# f; z Q: D7 v6 e& j
else
2 ]& D6 T* G8 T5 B$ ~: t$ Y link[i].nextp=i+1;' z; N2 h! |3 C- L# G: W
link[i].number=i;
6 G3 T* ]! Y' d% ?}
$ q/ t6 j0 x: I" Jprintf("\n");4 r" D7 L0 V8 K
count=0;
8 u2 F9 |, J3 S1 _4 r+ r% Vh=M;
9 S! N- F1 c7 k( ?: Gprintf("依次退出的猴子: \n");
* W, O6 L- E5 j: a3 S* N# p, Gwhile(count<M-1)
* r G, O7 b) @: s{i=0;+ ~8 [9 X; y: D9 G
while(i!=3)
5 ]9 }- c0 \) W' P- K$ H{ h=link[h].nextp; Y" n0 c) S5 m, }! L0 e
if(link[h].number)
( Z: \- z! ~0 l4 `1 P+ U9 r% l i++;}! Q1 E7 r7 k" J7 {
' J% E3 P4 k/ ]! F# H t
printf("%4d",link[h].number);" w* f6 k5 r$ h+ f. Z2 @
link[h].number=0;
% n& d0 U2 ~9 X" p/ mcount++;
3 z; `' M# D. i: O}
4 o& w) N4 L& s* R' q
( P6 D2 ~+ B0 I7 a$ z3 U. Q. Rprintf("\n大王是:");
6 C& s7 x+ E ?/ { for(i=1;i<=M;i++)" S$ i- X/ |: u% h
if(link[i].number)
4 Y) V1 K1 n* s0 ~! R printf("%3d\n",link[i].number);) g0 @( c( Z, W+ ?
( g I8 u# C$ U2 O4 i7 P, L
6 A$ M/ m) }" e0 |. I1 K+ X
}
6 k: d q5 U& _0 k1 L第三种是普通方法for循环! P" R4 \8 }; w( |- s3 E
#include<stdio.h>
( @- s3 v& u. W$ M5 m1 z0 Svoid main()
, t6 _8 Q- w5 E" i% E{ int i,k,m,n,num[50],q,*p;
+ l+ R' k4 G2 {% z clrscr();
1 m" C% m& K# A printf("input number of person: n=");
: d+ \% F4 a8 x3 X+ b, ` scanf("%d",&n);# _9 ?+ l% R3 B# _* S) X
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只2 M, U |0 x8 a* F1 |8 ~6 j% B
scanf("%d",&q);
C+ w) r8 W, h @ p=num;$ m. w; _9 Z, Y% r7 o H; B F# N
for(i=0;i<n;i++)4 [! V7 Z% A7 a2 h" k& `
*(p+i)=i+1;' X9 U2 G: X2 Z4 c
i=0;$ J. [! }' Y7 q- S
k=0;" v ]2 @4 G0 G. e# y& s; N
m=0;7 L" J* D( q# L# B
while(m<n-1) \+ r( Q( K1 K+ D6 ]
{if(*(p+i)!=0) k++;. Y+ v+ m0 U; m4 k2 `' q1 R
if(k==q)0 W9 B+ E1 g! I; Y& B
{ *(p+i)=0;. Q+ f f6 t( r: O$ z: |: k/ E" e4 h0 C
k=0;
8 s) k/ _4 E: a, ^0 c6 }- V m++;6 ?6 M, {' y+ l) t0 @
}
3 z1 p. S, M# B! f; |) R i++;
# R" a9 i* X" v* C5 @ if(i==n)i=0;) D. e, W M! \: }; w J
}
, Q' ^' u& a- I while(*p==0)p++;- ^0 \& g, U& l! a8 D' G
printf("The last one is NO:%d\n",*p);
" y$ |9 ]9 x- e- M# d( T8 n' [ getch();+ W0 `( ]. h) H- F
- X6 l4 C z" H
} |
|