|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
- R+ D8 F9 a9 k4 h9 I, y C5 |这几天我在忙着编一个问题,我用了一种方法编出来!
7 {: y) ]) o2 R- D+ r但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!4 S1 @5 I* c" j# \: E: }4 g0 c$ |
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 0 W+ r7 `: N* z4 c# l6 i
3 I. W) _6 }9 N4 b
% |) F9 c) D& ~6 P3 |# K 题目
* r" F9 J1 Q6 g% k山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。% @2 `8 Q1 m1 U W7 K+ ^" M
第一种方法:利用循环链表
' ]- {7 |% k- y#include<stdio.h>
2 V9 r5 J. f. J$ d#include<malloc.h>
v) e3 q1 t( D#define M 8 //共有8只猴子
2 o! C* Y3 D8 |% _1 W# {' o#define N 3 //数到3只时退出第三只
6 t ?5 x: p" i2 x5 @% @! H% o- P) J9 @typedef struct monkey
6 o, k6 ?) }/ x; G+ ?# w{int number;
0 o( Q! G8 g6 t$ \! |- m( Xint flag;
* B' _8 i+ o- \3 q4 F1 }struct monkey* next;7 B+ q3 t- i( V* S- [! @. x
}MONKEY;& B0 z7 Q* ]3 C9 T( S
main(), h6 s& T2 g6 [7 y' x) o
{ MONKEY *head=NULL,*p,*s;
( t7 W2 h" r2 \. @3 E int i,sum=0,count=0;
7 w/ t% O0 ~) d1 R/ _- E5 W! ] clrscr(); //清屏5 T" |$ T4 \" S$ j9 O! B
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
- V* @/ y4 |3 t, ~# b2 ? p->number=1;p->flag=1;# t: U2 \* Q5 s. I5 g/ ?. _
p->next=head; Z9 i4 I' z( l/ \: [5 M- y
head=p;9 ?8 T5 A+ Y7 O* J0 m9 Q1 ~
for(i=2;i<=M;i++)1 M3 g/ m) Q. v) G
{ s=(MONKEY *)malloc(sizeof(MONKEY));, \. i* P5 U2 B4 u
s->number=i;s->flag=1;
! l+ z9 H3 p& [ |% d" W0 g s->next=head;) E* Y6 ^3 J( J8 R6 y! M4 _. w3 C
p->next=s;p=p->next;- `9 B+ {4 r2 w @0 S
}
7 I3 p' x1 `( \1 B0 g9 h p=head;
1 w: Y) @ s' O0 l for(;;)
+ U3 l4 M0 `! e0 V: z% U {if(p->flag==1)
) R8 D$ F i5 x+ A8 p3 G( @$ f count++;9 ]4 c2 d7 v4 f, P; j# I8 a0 p
if(count==N)0 q& W \; C# t, l' ^ f8 b! D+ T
{p->flag=0;
$ [6 c6 f+ [3 ]/ I% p count=0;/ g7 H/ {% h7 d
sum++;}
?# v1 G, e0 d2 K: {' Q if(sum==M-1)1 z T, j* {0 Z4 `( `. L3 O. Z
break;
) m! F. `5 G/ A p=p->next;
* p0 D- z% }7 }+ a) M. T, L }
& R. Q. ~6 _6 i8 ]$ \, ]2 v p=# D# s( o6 |* y- I H
head;" [% ~3 p" d2 A1 V+ F. O* x
for(i=1;i<=M;i++)
/ \& T" Q/ X6 t9 {! q6 W { if(p->flag==1)+ i) F, p' j* U, z% X8 I
printf("\t%d",p->number);
! O8 G& g& @( p! |1 k1 W5 l p=p->next;
; U# V0 | }3 @: |& { }- |- l* j( }: d
: [& T" g8 p" [3 E+ Y! N7 V9 U$ D* ^
3 S, l5 o; _. [+ [: g" w
} + w; N5 l- E" D# s
第二种方法:数组
. A$ p! d& t& i# n! G#include<stdio.h>
3 n% z* M. k/ D3 Y/ M#define M 88 a5 O2 ~1 t5 ^7 y; n5 z$ A" G
struct monkey
) A, P3 ~" O5 b' N' q" Z{int number;
8 g1 Z/ u# J# s1 v/ s" |int nextp;
) M- M; }& Z$ ^* J& }$ _7 p7 i}link[M+1];
8 k; y# _+ W6 Q$ ^) E4 s
" u2 M2 j1 `, W5 T' L. Svoid main()4 ?! \6 A3 w8 e
{int i,count,h;
5 {' ^' K7 n: M4 V* B2 ^" cfor(i=1;i<=M;i++)( c0 f$ t J, z; ]6 H
{ if(i==M)/ Q" s3 v4 V+ {/ u2 [: a; {
link[i].nextp=1;+ m( R! d5 I/ c [4 h' G* B
else# `. i3 A; T# o* X5 B( F) }
link[i].nextp=i+1;9 a8 P5 K6 |' K% q8 {$ J
link[i].number=i;
( A+ J- j7 J; |) ^; v} `* Y/ K, }3 r" ^% M7 r3 X
printf("\n");& G5 W! Z. f9 z. c7 {) Q0 m
count=0;! a$ U `9 {# u4 I8 A7 l$ z
h=M;
6 t9 P' a& x$ H" R+ _printf("依次退出的猴子: \n");
" ?" i* z( L! }& Wwhile(count<M-1)
# B) L! D. ]/ y. o* h3 i{i=0;
' \3 V8 l3 l4 Q( v! |while(i!=3)4 M- Z+ F- X! A9 G# ]9 j
{ h=link[h].nextp;
2 i- G; a1 S1 C/ _# h if(link[h].number), Q+ G9 E4 ^9 E8 e: w1 ^/ `
i++;}" M1 k* s2 A% h( v# P) x9 h/ @
" f' e9 e4 S$ g7 C0 c' ]printf("%4d",link[h].number);' i# Y3 l0 p9 M( V: |$ V
link[h].number=0;2 r/ Z( {& \/ N: ]1 c" h& O
count++;
3 J/ q3 J- X- R, W: V}* C% x, z. [9 c3 ^2 j" y6 q, I
) f9 O, r/ @0 H4 I2 Z* v) O* F
printf("\n大王是:");0 ?) t. {. S- B, Z! X# T3 y
for(i=1;i<=M;i++)
I4 T1 w$ [) g) N' _0 e7 S( E0 Q2 N. \ if(link[i].number)
7 ~" X g+ ~& z, U, t. F/ X; M printf("%3d\n",link[i].number);3 G; ?0 {6 W8 Z$ a' D( {, K K
# P0 P+ a2 }9 D M& B, ~# A+ ^
7 E( R) Q- y3 u" C} 8 p: U* ]8 B( ^
第三种是普通方法for循环
: D' D; U* Y; ^#include<stdio.h>( C: i G, p& o5 Q1 b' y
void main()4 _* k+ \" ?3 y6 x6 r5 i P
{ int i,k,m,n,num[50],q,*p;
; b9 {8 D. O6 u* s0 V7 ~ clrscr();: v0 ]) c' _% g, |- v7 N( E- o
printf("input number of person: n=");) A, Y. j& N3 H/ L6 w5 y7 i
scanf("%d",&n);; q$ o4 a% J8 H, ~5 e9 L
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只- h/ [/ g4 \. N% A9 q" [& `
scanf("%d",&q);* l4 ` P3 A& {$ B' y8 p
p=num;
! \# ^# o& w0 [7 ?+ z for(i=0;i<n;i++)" i1 ~; B$ `$ g% v) c
*(p+i)=i+1;# E7 P2 P3 y2 _; l" `
i=0;. j' d6 W) N& }8 F# R
k=0;
/ G+ B5 W% ~8 U m=0;
& O9 P' W# o5 g' a while(m<n-1)
: R- z, L' p0 _. `6 e' K9 `2 ~ {if(*(p+i)!=0) k++;
9 j6 @' B( J9 m$ f: \ if(k==q), k4 d/ y U; b2 [
{ *(p+i)=0;! T0 I p/ m9 f/ b1 e2 `5 b
k=0;
7 W* G0 m1 ~" I m++;
6 ^& v( |( u C9 k; b7 W2 o }
( p6 O& S0 W( _: k1 g) }2 u# w i++;2 y: h1 C, W- w4 c8 g
if(i==n)i=0;6 s4 s' _! M! G& R0 y2 e
}
. N7 e! q( J0 L, r* ~" I: `! a/ {7 s while(*p==0)p++;4 m) ]" C6 J" b, O
printf("The last one is NO:%d\n",*p);
! M* d& E; m# h% R' w# T$ D getch();
L. |( p+ Z. y
* W5 x$ f& z; I0 S" v} |
|