|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
/ D+ S( S" d1 A" Z8 a8 n. C这几天我在忙着编一个问题,我用了一种方法编出来!# g. c& u9 ]2 L
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
2 r2 Y7 }, u3 J! H! s$ V注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ( H1 f8 h" j4 k2 K4 Z& @
& X6 [5 ^' K7 F9 I
s) \* n) O- g4 y7 K& J& R
题目1 z9 |5 G+ C+ j$ D" a1 t( s4 ~; @
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
) S/ E; @3 x, {4 _8 q7 ?第一种方法:利用循环链表- b. E) ^8 d( `; m4 l! u! M$ Z
#include<stdio.h>5 w1 h5 c- e& ]- c. J
#include<malloc.h>
9 l3 ~0 K# v0 _/ m9 G) s5 T#define M 8 //共有8只猴子: t8 w) C' c" {. f
#define N 3 //数到3只时退出第三只 r9 [* V2 q0 O% |
typedef struct monkey
+ E9 i4 U& P2 V: K{int number;6 l2 f/ B8 b1 v
int flag;5 N5 u* p; m) R. ?! W5 y8 i Y
struct monkey* next;4 c$ Z6 o6 k. l5 c5 ^$ i0 C
}MONKEY;5 ^4 B8 p' @. B
main()0 C: f. U* [# `$ X3 t
{ MONKEY *head=NULL,*p,*s;
) i$ @7 p& N3 b# y2 D% R/ K int i,sum=0,count=0;( ^1 E. n! L$ K) u2 z! j' Z
clrscr(); //清屏
5 N {; {9 I8 I* c p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存& P8 \( f! l2 s8 y9 y% H7 t3 H+ H
p->number=1;p->flag=1;
8 ?6 ]) `7 C7 Y' H p->next=head;
+ s& G: @6 X+ T! ^ _- H5 q head=p;
: G7 [$ ~6 V( k6 v for(i=2;i<=M;i++)
- e2 X8 \1 s3 i, g { s=(MONKEY *)malloc(sizeof(MONKEY));
3 F" i' q6 ~3 O- c- h s->number=i;s->flag=1;
, C$ M% O: O: J* R3 g% ~) u s->next=head;6 S+ C3 |6 m0 Z+ `; q2 |
p->next=s;p=p->next;$ ^# K* u$ C8 H2 n* D- L* o
}/ Z: h6 e) {6 l( f3 n- S
p=head;9 H' k, o0 M6 k* x7 y
for(;;)9 b# _, q' S7 N) k9 l
{if(p->flag==1)
' B+ i3 |% H9 }7 w# c5 o count++;) H5 w" R9 C5 j. w+ J. }& }* l
if(count==N)) z1 E" `3 E8 _( ` e; R
{p->flag=0;6 Q8 C, c$ @# |: ^! \( s
count=0;2 F- P5 F8 g' C( S0 A" |0 D
sum++;}, s- m% ^8 @1 B, I3 Y& z* |8 z
if(sum==M-1). }2 x- h* @0 w4 \3 W! M9 c
break;
6 Q. W8 T+ L$ u, ~8 h p=p->next;
1 p2 u6 f6 d- ]0 l! Z3 v6 T) O6 D+ T }
. n8 A+ }9 Q: P/ b) v `8 @ p=
" V# `/ R0 C+ D: R& u# c, y head;
& i5 A: A0 d8 l9 R' { for(i=1;i<=M;i++)
5 U8 h6 A" M) k. J( N# E { if(p->flag==1)" M) f9 v. r: _+ W/ s7 j0 U/ L0 @
printf("\t%d",p->number);3 ?0 R' W- [' k6 W `
p=p->next;
' F% B* W" R6 b# ~! `. ~ }4 Z+ }$ E! L6 b9 m; g5 J
4 D4 \9 t6 _: H v+ ?
( B/ I* [! v- M6 b0 @
" k* @4 I3 d; H8 q4 M8 d) s6 |} ; P* D& k: d6 V7 I& J' ]: s
第二种方法:数组
3 u8 M- W& w7 h% @3 h#include<stdio.h>
- K. Q) v1 A7 Q- P#define M 8' w [2 d- L1 l: @) N' F/ U
struct monkey2 U" o2 l# P8 c8 R3 `
{int number;
# Z3 z1 R. _ D2 @, t# H" A6 Uint nextp;
: l% D0 @3 Q* g8 W}link[M+1];1 _: t! Z% x4 O0 Y* u' a4 r
& S a( g$ s7 V/ H, f( t/ H- r2 }
void main(); b& S5 H% h' [. H8 ^
{int i,count,h;
" b; B& V$ M4 }1 Z( @% Hfor(i=1;i<=M;i++)4 Y6 U1 x9 ?4 E$ K
{ if(i==M): z; u. @5 u7 Y
link[i].nextp=1;
W" C' E; z) M3 \2 y2 `* i: `3 U else C+ t. U |) C) z" a
link[i].nextp=i+1;6 `! d/ Z! }' t8 d( s. [9 }; I
link[i].number=i;
- k5 V- g/ M9 ~- H5 |0 e, W1 M$ P}
( R0 \; _! t7 |3 X( n7 t# Bprintf("\n");
' s0 l0 x) o5 p& J. acount=0;( B% ~0 Z( _: l" m: B+ i
h=M;
; ]/ `0 [. e( Q$ U: x8 R- N0 ?8 Wprintf("依次退出的猴子: \n");
7 Y6 s# a2 i+ ~5 H+ pwhile(count<M-1)8 {& M& K: d8 H4 @) v" j
{i=0;/ p' F7 ~3 o. u8 P# n$ C1 i, x' N$ I
while(i!=3)- B. L' p$ j( N& S3 A( ?
{ h=link[h].nextp;. x! O$ v9 s3 C' d7 A: d0 s9 s
if(link[h].number)
7 ]2 |2 K: r, C: A- \ i++;}% t+ @: c9 C: q' S
: l6 u9 z& s) q4 B6 g b4 Cprintf("%4d",link[h].number);
2 k* o J1 ~2 t" Plink[h].number=0;$ K: C5 Y& V: @1 k9 N2 f) J! o
count++;
~8 o/ ]9 X# \: i/ [, K}
6 P' `& W0 i4 l# a7 }! c; w, H- D/ o) }7 z9 X
printf("\n大王是:");4 c9 P, k, W# {5 O, t; r: V
for(i=1;i<=M;i++)5 W: `* f0 ?+ a$ L/ D- ?8 h% M
if(link[i].number)
! }& ^+ N9 O! Q$ B: p printf("%3d\n",link[i].number);9 B5 F7 k6 r. j
* j$ Q8 s8 l; `: O
8 ~ m- H9 p! J4 K; n} + y' J: [2 B. @0 e- _( `3 h: @
第三种是普通方法for循环
; {4 T% @! n! X& J! I4 z3 r! p#include<stdio.h>
: V- F: L' k4 m/ J uvoid main()
: A+ f: \1 J. r3 |% n( u2 }( L4 d{ int i,k,m,n,num[50],q,*p;) Z- ~9 n. X4 p0 a
clrscr();
% E5 n: ~8 J$ m2 R( x$ I- Z S printf("input number of person: n=");) r9 w4 V/ }2 J5 Q% Q
scanf("%d",&n);5 A' U/ n& ]2 W$ {. o' z0 W
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只8 T8 W. s( M1 E9 |) [8 F/ x N
scanf("%d",&q);% H) X. T. v; }# |
p=num;
l* U# D q. C. N for(i=0;i<n;i++)
$ Q) w4 L3 i9 w$ a3 I *(p+i)=i+1;
4 ?* V2 t. D$ F+ g+ n( J, n' ] i=0;
\3 ?1 x) z8 i( j; y; U& V k=0;
' K8 d( ]( C4 I) _4 A+ a$ ^9 ? m=0;6 b4 B4 {/ Z2 w+ ~7 @
while(m<n-1)
9 d1 |* N5 Y* i; R% J {if(*(p+i)!=0) k++;
/ z) H0 `4 e! U4 e% S6 \ if(k==q) J: k, g" _3 _9 y! _% {
{ *(p+i)=0;% g' Q0 u1 Y" \- t' a R9 ?
k=0;
1 P+ P: A; ~0 D) k# P- o7 V m++;
# x9 F( n. t# V/ K6 j; m: ~ }
) u* {( G/ Y' W6 F/ [% ? i++;
+ l2 L% b" J' J8 P- U if(i==n)i=0;
# {4 w. D' m V$ _" Z* ^ }
( y) ?6 u* N2 s* \% T$ [9 @" ~ while(*p==0)p++;
& ~; N5 [$ S6 i! b( u- C" i$ i+ H printf("The last one is NO:%d\n",*p);. |* e: I% ? e/ {: D
getch();
4 E3 Y7 p$ I' m# F. k" g. U. j: P+ g. w j1 @5 o, @) M( _3 x5 }
} |
|