|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!) B* ~ U! U9 M, |) r$ w1 c
这几天我在忙着编一个问题,我用了一种方法编出来!
& _* i" |8 S2 q- B( ?0 f但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
7 C) p0 M7 |: i8 f注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 4 `4 B2 Z) [/ r! q
6 i p' s; n; L0 l
- c; D5 \3 B9 r) a- }9 K% ^ 题目. e; ?: P- D& W {* n V7 _: ~5 L0 d d. k
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。" Z& I! T: c7 C5 R0 a
第一种方法:利用循环链表
* m6 R8 R4 R" h0 P% ^, g: ~#include<stdio.h>
d, h( K& ~. E4 K5 }#include<malloc.h>% o2 u0 m. I' C6 |. T* v! \
#define M 8 //共有8只猴子
: S, n0 F, d3 M8 m#define N 3 //数到3只时退出第三只& Q% e( I. @# D0 q% ^ o- N: `
typedef struct monkey Q! m$ t" @& Q' \0 i
{int number;
- N* k% h8 {; E: e: m9 w6 B( Xint flag;) k) z' x1 ^ V3 T" Z, u5 B! Q
struct monkey* next;) e! g |( @/ }7 e
}MONKEY;; e& {9 E* [3 R' I* }
main()
5 B1 O0 X. ]: i% [0 H' E c{ MONKEY *head=NULL,*p,*s;
3 x5 j. P% z) n% i2 a% V$ e( m& o int i,sum=0,count=0;
6 Z! ^( y; Y" D& _! p' x7 e- S clrscr(); //清屏
$ m0 [; q8 `8 a0 h p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
) ~ o/ f% B" N6 H4 C/ p: k9 K p->number=1;p->flag=1;
8 U" O2 y. g9 T p->next=head;3 p* T$ ?: |4 R1 x7 L. Y# D
head=p;
3 y% L7 D3 l5 t" C6 _5 ~7 Q, t. ` for(i=2;i<=M;i++)
# O+ s- V) W4 @2 h5 G { s=(MONKEY *)malloc(sizeof(MONKEY));- z1 y) O7 a5 H H
s->number=i;s->flag=1;
- B# q( u! n# X! {# x. k/ t( Y s->next=head;
- l- H+ [& t0 h" L/ C! J p->next=s;p=p->next;
* ^8 Z' D1 A* s4 m% _! ^ }
% I# N" [+ e: G2 A5 a* E% w p=head;
) @0 ^2 |; B; m: z V, z for(;;)# |* z; {3 u; T( H: H
{if(p->flag==1), w2 a' s6 d7 q- i5 i
count++;
. v* c3 B1 K6 q2 Y" r7 @ if(count==N)
4 l+ l4 `0 V( e( a+ y7 j {p->flag=0;; w/ _) m7 g; Q! k* l" _
count=0;7 y( y+ G8 [8 L5 a! H* b+ j
sum++;}" U' Q9 l+ z( b& v, {
if(sum==M-1)/ m( n. \0 ?" F2 H7 e
break;% ] {1 y8 }3 N, W) O
p=p->next;2 p; L) C$ h9 H& n# ^+ ~8 n) s
}
/ M/ j3 t8 O4 E( a: B$ n p=
! x A4 k" ?: B/ P4 p9 A head;1 J$ {# P4 Q6 B: W+ j$ l8 b
for(i=1;i<=M;i++)" m. e9 N, V( V6 S5 Z% J: j# T
{ if(p->flag==1)
8 ^/ h' Q# q+ @! u A printf("\t%d",p->number);
& u1 c. n& k" J9 d$ {" Q p=p->next;1 Q5 [' X, k' q+ l0 ~
}+ v; `+ l, P# d. B7 M# c
, h5 i+ b: l# B V8 A) J
# r' V; n. W2 D) ^; `& A- F! ?1 l& \& j% r3 }
} ; p; M6 u% X1 Q3 r/ ~2 U
第二种方法:数组" u" {2 a' u$ J+ m7 `0 l: A
#include<stdio.h>
& _2 i9 n, l( y2 a$ F! J% G$ T% T#define M 8
( n( m2 [7 O! ]( a& r r- Ystruct monkey
4 J6 q; t- |+ q$ T& y{int number;6 D& J4 c" }* e3 b0 h
int nextp;0 Z! w C. w7 W9 x, R
}link[M+1];
% v' H7 Y$ e( m: l/ H% v0 r9 Y6 y( T/ P p: W2 q: r
void main()
8 S1 J1 F9 F) ~ @{int i,count,h;
) K2 ?( I, w9 i! I4 T/ e8 kfor(i=1;i<=M;i++)
7 ]3 B' Z3 U% [0 q5 \" `. h{ if(i==M)2 L4 L2 ?2 G$ ^3 V
link[i].nextp=1;8 k6 ?$ ~* {0 ~2 V
else7 A( S3 R& o) ~7 i [/ C# q
link[i].nextp=i+1;
7 u+ q4 ~# i4 w; l6 a0 r link[i].number=i;5 S- g. J) H# G# _% W6 J8 ]
}
- s. E5 b) r. z" ^ [printf("\n");" q g% Z2 { \, M
count=0;0 Q7 I. b# f6 Q& I; f$ Y
h=M;
9 z- \( ]0 N* X6 A( Vprintf("依次退出的猴子: \n");( ^6 ^5 U6 {# f7 z2 I: g4 N
while(count<M-1)
' y" ^! m# U# f( s: O* F1 v5 i{i=0;
, p1 r# n S3 k, y' N, xwhile(i!=3)
3 {" ]& P( G6 V$ U5 \* a{ h=link[h].nextp;
# A6 C! }- v5 O0 W if(link[h].number)% N: [% y: h/ }" n9 d. K2 |2 c
i++;}
' o, N1 ]+ S8 U# A
( F+ K: t, l' T8 Y& Cprintf("%4d",link[h].number);( H8 R( y# {. a' m+ M
link[h].number=0;
7 X6 P5 W/ V: W8 L8 J9 o1 m* Ncount++;
+ p! |) f" b0 ~- }5 I}. ?' `0 c! n2 w# V0 H( y' D
0 W9 K& y" o. w
printf("\n大王是:");
; m4 c8 K0 M9 H" Y& r for(i=1;i<=M;i++)+ w$ Y2 k" m- E5 b3 w: R, Z7 D: `
if(link[i].number)
$ E \% o5 `$ W' L* I7 ~* J printf("%3d\n",link[i].number);
( I3 ?, s' I& x: c, V8 Q% f- t
9 V9 h! b- Y: ?& e2 }, P: g% r" ~6 c4 ~0 O( V! x& n' N
}
+ y) X3 E' ]5 t& m/ a. d+ {2 ~* c第三种是普通方法for循环
- s* L0 Q& U% Q C# A6 n+ V#include<stdio.h>+ a1 E S& o+ X+ ~" \4 }
void main()
1 b4 \1 m# K7 B9 l/ f1 z% p0 c) w{ int i,k,m,n,num[50],q,*p;
: Z( J& }5 e) e6 i clrscr();% p, V2 L1 H6 V v8 U
printf("input number of person: n=");
; F' m b/ y3 J/ ~ scanf("%d",&n);
2 k/ ]. a! }1 zprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
& ~* o. t _% _, B scanf("%d",&q);
- F$ j2 d, V6 r3 A! Q p=num;
) S. H) L+ J% ^. `, Z for(i=0;i<n;i++)
" p; H2 c3 S2 i+ T; o( P( I *(p+i)=i+1;2 e8 Q9 L0 U& U/ \6 I# |1 f& F
i=0;* \9 [/ } n0 ~" B R3 {3 o- W L) G" B
k=0;0 m9 y. r! J; u4 B% b
m=0;
; c h, S% W5 M8 e, r5 Z while(m<n-1)
; ~, s7 {0 ]0 l+ L' ^ {if(*(p+i)!=0) k++;% W k+ \2 D/ l/ f4 v
if(k==q)
, [: _( X. l5 x+ T/ c8 V# w { *(p+i)=0;% _- y* M0 d" g c2 F) T
k=0;/ E m/ y5 c7 j9 k# N
m++;
; e/ ]4 h* @% D5 K& e+ c }
% ]! b% U, ^% j$ v8 Y5 b* D; d i++;
8 W/ Z) W; S9 Q: Y. V; L3 _ if(i==n)i=0;2 M7 h& p& G) r
}
" L# ~) c1 ^; d while(*p==0)p++;) V D4 ^; s. e" }+ j
printf("The last one is NO:%d\n",*p);
; W6 b8 t) V& Y- F+ \, l getch();+ h& Z1 ~5 F2 @/ h
& p8 m5 ~. `* c0 f9 m
} |
|