|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!1 N g! A, b' B+ z
这几天我在忙着编一个问题,我用了一种方法编出来!
7 X2 N/ O: |* b& x, J2 G% P但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
) D8 ] l+ {+ I1 o1 w9 d注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ; J3 P! ` K! `4 F% L. ], Z
) w3 o" t8 S! T; d0 C2 ]2 f
: w Q" _* ]6 |" f" O$ | 题目
! n9 V' |: ^2 q山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。5 t5 l; k6 q6 S( F( p* l
第一种方法:利用循环链表1 M4 C7 x) @5 ?/ u3 C
#include<stdio.h>$ }4 y' x0 J& _# T9 n; Z
#include<malloc.h>
( [; u: g6 X) {* ]* G5 b. X* C#define M 8 //共有8只猴子5 I. O8 q" p3 ?* a/ e9 j
#define N 3 //数到3只时退出第三只' F4 e0 K, o$ h0 W4 g1 g) w
typedef struct monkey
+ V& ]7 I& y; p; d( M{int number;
! a2 w! {. d7 Hint flag;
% A4 `3 S6 E1 M1 A# istruct monkey* next;; W4 z: L8 k/ K: Q6 F! G: W
}MONKEY;' \! N. J/ x! g' b% O; \1 Y) a4 q
main()% B6 Z) R" l. [$ N
{ MONKEY *head=NULL,*p,*s;
6 ?' _& p5 R3 Q) I int i,sum=0,count=0;( C( \8 J: r* B1 Z
clrscr(); //清屏5 x9 @$ h4 l& B, u* J
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存, w3 V. a% |' B' u" ~
p->number=1;p->flag=1;* Q( q) y% z; o+ G
p->next=head;# _. z. K8 D; u
head=p;. V* P" N+ j0 @% @% Y' d3 q2 A6 U$ e
for(i=2;i<=M;i++)2 A# h+ l* X: N0 t* A/ `
{ s=(MONKEY *)malloc(sizeof(MONKEY));+ h; }! g/ z! J
s->number=i;s->flag=1;1 S1 p" \1 `& |0 P( o" [
s->next=head;3 @# ~4 }6 K' p3 ?9 |2 n" s
p->next=s;p=p->next;
0 q \" z- \! h# A }" n9 S- D$ g' F0 U4 |6 P9 w% D( j
p=head;
4 h7 I6 h' p. E; V' y6 W' C) l6 c for(;;)8 X! o& ]! ]+ ]* q
{if(p->flag==1)
6 `8 l8 l5 T( k- N count++;8 T' g5 G9 ]1 u% W+ B
if(count==N)
" f, G: _ Q: J( r8 p4 p6 w {p->flag=0;5 I W: i" P6 @7 O
count=0;
7 ?; R2 w8 P1 U sum++;}* O! V8 ?, I' H6 M( q$ a9 H8 N. A
if(sum==M-1)- E# u/ ]2 _' o. G
break;" U+ K8 k: q5 R! O& l
p=p->next;. f$ c: w% ~9 K( u
}
: s4 B [$ h& r p=
. p. G5 ~% r" c2 [9 q4 x; S5 b o* R head;
% J+ l+ D. j2 ^4 n) m" \) k) z for(i=1;i<=M;i++)/ E \ M! b/ q; s' F7 o
{ if(p->flag==1)
+ M8 o: o; X) l* |. c- @ printf("\t%d",p->number);4 I$ d/ d% C3 x4 m& x
p=p->next;( W) J5 r4 {6 f& V
}$ [6 H7 c) _! ~' Y! A; d+ a( [$ [
5 ~# R2 u, j3 X- e' G, W
0 k! \; m# L) d5 q6 d6 e
8 r& p# F. Y$ N2 W* J4 f5 w}
# b, n4 s: z9 V! J5 [第二种方法:数组, Q4 E- q4 b4 @8 Q4 H9 x
#include<stdio.h>
3 G3 x- y5 D+ S* B8 d- }# H8 x#define M 8
1 Z" W9 R5 l% _2 O. ]$ n, pstruct monkey
`* Q, c" \$ ^0 u3 F% p# {{int number;
* P5 T* e# |% }# tint nextp;. `6 i. S5 O1 n' }/ N, B" ]
}link[M+1];
5 Y0 e' V, H8 q% ^+ R
6 Z! _; z2 `4 R' z/ X' G8 e" Uvoid main()
) n. M3 D/ w) h H5 L' `( a, [{int i,count,h;
7 |4 F* {( e; Y. P; p$ Q7 f6 Ffor(i=1;i<=M;i++)
8 O3 G7 q3 B) h2 f. y{ if(i==M)! p* x2 P, _6 P" t2 ?: r: I' _
link[i].nextp=1;
( j$ ]( y6 v+ I1 I" k& Y else
' L: g0 o4 |; ~7 {& w- N$ B0 t link[i].nextp=i+1;
+ @0 N) g9 V3 C; A, R5 }! ?6 ]2 E link[i].number=i;
$ D" f2 O5 v3 K0 Z! g0 d: k}9 v$ g6 Y, v9 R+ q3 ?' u
printf("\n");
3 O1 y% m+ g+ x) C2 U [9 |9 K9 ycount=0;3 {" K( W& ^/ t! v
h=M;
& k/ S$ S% O q8 hprintf("依次退出的猴子: \n");
) ]* m- @' S, w: Q$ y& Vwhile(count<M-1)8 f5 M7 z( w/ Q' \, ^% K! x& {
{i=0;
- P7 T, P% @" d; v0 N1 Owhile(i!=3)9 J4 {* w- o6 p3 I) s
{ h=link[h].nextp;
7 @8 \% P A7 A$ ^ if(link[h].number)
4 H5 u: U2 X/ `; s; F i++;}* ?6 [! y. w; }1 s' [; J3 v6 X
# L3 P5 P# s& J0 ]4 B( [0 Nprintf("%4d",link[h].number);
, r. L7 l- Y9 `- J3 M/ c. Y; Dlink[h].number=0;; w4 [9 [2 O4 X
count++;
: b) e4 M' h, g$ G) b}
' K6 i% Q& @0 {" b+ V6 i0 y; p" n& _. p. j5 t$ W. {. Y% o
printf("\n大王是:");
+ T4 I! G$ P2 A for(i=1;i<=M;i++)' S* L% o5 F; L. s; N) _
if(link[i].number)& A" r- x7 C( u, T
printf("%3d\n",link[i].number);
0 I4 l% N* |9 Z7 E! D, l8 b# P, X/ C" Y5 g& `+ k
& w% i& s4 c: R6 D
} p! P- Q: t: ]5 P2 W7 S
第三种是普通方法for循环; @+ i4 H; V+ o
#include<stdio.h>1 Z9 ?/ t' ~# b" T
void main()
/ O2 a' y0 e* G7 a3 R* E7 v{ int i,k,m,n,num[50],q,*p;1 |% e; a y* H$ ]" B
clrscr();
7 ~/ N# R5 N& u" V- ]! v% l6 a L. Y printf("input number of person: n=");
# k ?+ {/ Q; o) R g$ F scanf("%d",&n);
. [2 d$ n4 s" J, j' y& Aprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
3 ]; [; q- u) t scanf("%d",&q);
. X* n Y/ R: y: w p=num;
2 f& P, ~+ A/ ?# P3 P9 D for(i=0;i<n;i++)/ w1 T( }5 y; n) ~ h+ Z1 ]# O
*(p+i)=i+1;
- B5 q6 N3 _/ O9 ? i=0;# u* y! r+ A$ n- [, B
k=0;6 `/ O% a9 p9 p S5 h
m=0;( H" P$ h Y+ X6 l/ {2 e5 g2 K$ s
while(m<n-1)! _7 V9 D% m, g" P, ]0 i
{if(*(p+i)!=0) k++;
3 R, X( Z' |, p if(k==q)
z' m X ^2 y4 m8 F { *(p+i)=0;( T, j! f g7 n
k=0;
$ n4 b5 u3 S# O* K4 I/ a m++;
( ], F/ X! f4 \' e }0 ?' F9 q5 ^! r; b' ]1 L" ]
i++;- j5 M& v4 N0 ^6 J" U- G2 b# ^, S( ?" O+ l1 T
if(i==n)i=0;
( L+ k% @. \/ ?$ W+ n% b( Q }' ^; W. n7 ?0 n2 u/ J
while(*p==0)p++;
" Q% |8 c# ^ @3 R, F m+ J printf("The last one is NO:%d\n",*p);
+ M. L7 U7 e& E9 X9 ` getch();
* o. s, W+ T x$ _! }& {
- v/ u# W8 i; [% ^} |
|