|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!' q. w @* {8 f, a8 Z
这几天我在忙着编一个问题,我用了一种方法编出来!
+ M- B' R3 M$ u1 v8 k* W% T但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
. ?* m. u0 A/ V- n3 ?4 {) F, _注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
9 T7 I; u) m- c. m6 R0 x
/ W$ d1 V! y$ S. {% j* v+ T& S1 a& h5 j
题目% Q2 L, ?8 |8 N; E2 h, }9 {
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
: ~( C4 I8 \) F7 a1 {第一种方法:利用循环链表6 o4 }0 K8 n5 u6 u; s. R
#include<stdio.h>/ c8 @! l5 q9 S3 }% V+ w) \
#include<malloc.h>6 [: T9 d- B# L( `% L
#define M 8 //共有8只猴子! p- N- }( r& @) Z3 ?. t A
#define N 3 //数到3只时退出第三只
# `, T3 g8 s6 d! ^8 c$ Rtypedef struct monkey
. d6 n# ]4 c G! D2 t9 c" i* L{int number;
7 x$ Z3 @( M) D% d& {" z' W1 Tint flag;" j- |8 s7 a4 s/ c) N5 C# D2 J
struct monkey* next;' w0 b, d8 H) V
}MONKEY;
, b0 t( y4 ~7 h6 Q; Imain()
/ Q, C, \: ~$ f( ? k2 A{ MONKEY *head=NULL,*p,*s;
2 N% v) A7 ^; d) g& e D9 J int i,sum=0,count=0;$ F. w8 e7 ?! N
clrscr(); //清屏7 s8 Q5 N) [! ^3 T
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
) N( \* X3 p% f* G p->number=1;p->flag=1;
9 i* K( s% } ~9 R( T! n7 d$ b, a p->next=head;
" Y1 I7 }% ?' N7 {+ | head=p;
' X+ ^* [+ h4 i for(i=2;i<=M;i++)! d3 c: q; ]4 y2 Z; S6 Q. E
{ s=(MONKEY *)malloc(sizeof(MONKEY));( j w; d1 S" ]: ~ ?
s->number=i;s->flag=1;
5 l$ z+ \1 r' S) b s->next=head;) C- `. P: W8 L( Z
p->next=s;p=p->next;
' O: h7 z0 {; i, l! S% w# K }
5 l% {0 `- t0 T2 D( X p=head;
9 Y1 _5 S2 I( M6 s/ o for(;;)# K/ T3 Y. o% y$ N
{if(p->flag==1)
( ~' E/ ~) W6 e: q count++;: G( X. Z3 b0 B! i
if(count==N)
1 d4 ]6 |4 o- I2 u4 w$ R {p->flag=0;) w1 v! s% V4 @: I; Y+ {) A& r
count=0;
% Q" R w `7 q; O; ] sum++;}
9 ~5 S- E$ F: ? }8 N if(sum==M-1)
5 L5 r+ e5 i0 v4 e( W break;
7 }) a, o* o/ ` p=p->next;
7 A0 m1 B6 V, @3 C! ^1 j }2 b* f9 N( A+ r0 X/ [) e, l
p=' I( X* a8 z) q3 K
head;
- g2 t; s* Z8 R4 J2 C for(i=1;i<=M;i++)
1 K# p2 S5 G) { { if(p->flag==1)
. o& `7 t! M( a: E/ D6 ?% Q printf("\t%d",p->number);: s) _0 I: u0 \, J( s- ]
p=p->next;
8 L1 _+ y9 T& i1 L- I, X }
! A$ n" o. Q8 o- M/ l" V
8 f) Z6 Q/ b% x0 C9 v( v, P0 ]7 r) C' J1 W( X$ I8 p- Y+ W
4 h1 S/ }+ T8 i# t5 V% Y5 f} : a/ ?- @* P U2 o) ]- m
第二种方法:数组
5 R0 f+ A1 a ^, Z#include<stdio.h>
, y% n2 B7 Z) }3 C#define M 8
0 C' t' @1 {$ i0 Qstruct monkey
- X- ^0 H0 d+ o1 v{int number;
7 |' l1 @" Z) _$ {2 R; ], N9 N* uint nextp;. |' r% x6 i4 e. |+ L
}link[M+1];
7 _' h3 C: o1 Y" ]) G4 Z, T0 `6 v+ V; B( {1 Z" _+ L. h7 ~! ~
void main()6 x( U9 t& s+ @, F1 \
{int i,count,h;9 }1 j" r, h* z, N8 G3 @9 [" ]6 ~
for(i=1;i<=M;i++)# W: ~ b# u! j
{ if(i==M); l( y# I) y! ?5 G& E+ A
link[i].nextp=1;1 L( f7 I1 i' C/ Q, l
else
; ]$ d! ^/ M+ j, L3 A" I" W+ O$ F link[i].nextp=i+1;( p. l9 D: v9 u" s
link[i].number=i;/ C7 o! z2 J( g. ~8 F/ T
}1 O5 G6 }8 R: O i7 X, @
printf("\n");
6 ?1 |% H: ?& S9 m* ]# @9 \count=0;
- V* S+ W& j& ?6 M2 b$ Ah=M;
$ I ^! ~3 s0 e0 B% M" Hprintf("依次退出的猴子: \n");
: q7 W, b' F- \( P) vwhile(count<M-1)
9 |" |5 F, v( p$ z6 Q. Q. G B2 C{i=0;
( H; Q' W$ ?5 I8 r+ owhile(i!=3)7 [5 h1 E# v# v6 K; V, E$ h5 [( V
{ h=link[h].nextp;
3 D+ h: K, k* ]( s/ T2 e X if(link[h].number)& p) R( @, \3 }1 P) w' C
i++;}
: o8 R" W% g( p; \, B+ c2 v5 y
" N. q+ R- [% q. w& @ gprintf("%4d",link[h].number);
; f5 _8 N( V) _/ [6 G7 v* hlink[h].number=0;
1 t5 G" x6 I6 c0 P3 D8 Q- Ccount++;
! Q$ U6 E0 b. B}# f5 H5 X4 t' q' P5 g6 @
& `5 t4 u: ]3 \3 d* r( }printf("\n大王是:");
7 ^: i6 Q. K- G! U7 F for(i=1;i<=M;i++)
9 k# e" B+ Z8 t/ x: S2 P, n4 E if(link[i].number)( g1 w- D9 |- t+ w( J# [
printf("%3d\n",link[i].number);
3 M& F& C! T" ~5 g0 x+ E
& W/ ]: B$ F* ?: F' Z/ O, {2 k; X4 c% O+ q7 I) v
} / x* C# Z- F! T4 L& `, s, A4 O3 m
第三种是普通方法for循环
9 p \; M6 B& z6 l% t- D#include<stdio.h>4 o) X' `: f2 b) E+ |( Z2 j& ~
void main()0 A9 `0 W% x: M4 b0 k
{ int i,k,m,n,num[50],q,*p;
- g! U: P% T7 T9 l6 P0 C5 b$ a( { clrscr();
+ A( ~- I2 _; m% \# j( n printf("input number of person: n=");5 e9 R! m! S, I$ _+ l: C
scanf("%d",&n);" F) e/ z8 I2 s: t6 d' g) A- N
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只. T: I, J% B4 O' e
scanf("%d",&q);
8 r& q. f, b2 Q9 B* Z8 P p=num;9 c+ L+ @) p* {6 s c
for(i=0;i<n;i++)9 ^: p( P: t8 h2 d7 K5 H
*(p+i)=i+1;
. K6 v, i. A0 [! M0 J% @ i=0;
: O. _. D# g8 d* q k=0; y& g- `2 W9 [: |
m=0;2 F) u( H, z3 [) ?$ ?4 v
while(m<n-1)
* C0 J1 g5 ~9 T* E$ K {if(*(p+i)!=0) k++;
2 F6 V' f# T2 S2 c if(k==q)
) Y3 I" ]( B, U# G { *(p+i)=0;
* U4 s% @- f( \# e% h k=0;
* `) ]) Y. w5 R/ a" K m++;2 c( r! c/ g2 `6 N" \" {0 i
}2 S& u' k2 m# s. H
i++;
/ T7 Q0 j. {1 c3 y9 t( { if(i==n)i=0;! \% D2 C1 ]0 U) u
}6 y6 h: `- x+ G/ w
while(*p==0)p++;
" E: n; t: J4 y7 Y printf("The last one is NO:%d\n",*p);
( y7 _4 O U. W$ p" K8 i- ?7 O getch();; e! P3 A: i( ~
$ z3 [7 h. X) X, E* e* i
} |
|