|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!) V# [* \+ r g9 {3 T8 ~ [
这几天我在忙着编一个问题,我用了一种方法编出来!
/ A; S/ t7 y5 t% `但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
# z9 K9 a. [% H% s( [+ @' o注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 7 j* W& ]; K) J, I2 Z
8 |" x/ [9 s1 p' ~& l
7 c; {0 S1 T2 g& o6 T1 o 题目
" |. u7 U B# }" a( ^0 W山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。' `. O+ @0 Q- e& g4 h
第一种方法:利用循环链表
6 G( p! R; ?$ r/ W#include<stdio.h>" c* U. @- V5 G( e8 t- o
#include<malloc.h> f& E7 \" \! D, c5 e1 r# e
#define M 8 //共有8只猴子
9 n+ O R3 S$ M; e' p+ ^" |1 S#define N 3 //数到3只时退出第三只9 ~3 T$ O6 @6 Y5 |
typedef struct monkey0 a8 k7 u4 m- D; j. R) J
{int number;3 M' i# {2 M0 m# N! W0 k
int flag;- A! ~6 D- K7 t2 l
struct monkey* next;, @ a) X0 g% w( B
}MONKEY;+ z- s# u9 l: ~6 O( |
main()
- |1 f8 Q) j6 a& ?. a) Q _. C{ MONKEY *head=NULL,*p,*s;
o$ @* B% D* x int i,sum=0,count=0;" Y+ r0 i v( `5 ?# A: r- J) N
clrscr(); //清屏
5 I( g: W$ [4 W, F p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
H; v K3 _ }( k3 c3 _7 O p->number=1;p->flag=1;
4 P* P) |9 ] n0 Z& a% g p->next=head;; o8 H/ c8 q: s: \
head=p;7 `2 J% G# Y$ H) \
for(i=2;i<=M;i++)6 Q2 X5 y6 U7 b2 A) ?2 R* \
{ s=(MONKEY *)malloc(sizeof(MONKEY));
( `+ i& r- w V; [/ A( g! I s->number=i;s->flag=1;9 Z9 @& J$ g& p' @: F5 h
s->next=head;: |4 P H: l& Q
p->next=s;p=p->next;
* k. i3 z r* {9 X1 w0 R. E. [ }+ D7 i1 R' M: \2 b
p=head;/ v9 {( D+ H% o$ O) m- a
for(;;)
) W5 l8 s% M* m$ G* H! E0 ^+ Y( C! ]) J {if(p->flag==1)
) j: z; ?4 @- G count++;; I; A: z/ C K) d& T* t
if(count==N)
/ E7 t9 `; n I& i& N0 X% t {p->flag=0;
* Y! r" i. W7 n3 W3 u count=0;
1 A5 [3 S$ C& N. G7 [9 m sum++;}1 f% |' K5 Z |; ?* |# j8 W
if(sum==M-1)
- ]" z+ K# I8 g2 a break;2 i2 D2 C4 ?; e/ Q
p=p->next;
0 w& c. H- H1 e" n& X F" \$ t5 p; A# t }* V) y$ ` M1 v1 y4 j
p=
+ _; P' P% ]* Z7 s; l* Z head;) r% B' u: N& N7 ?( c {
for(i=1;i<=M;i++)
& ^2 y- d. ]' S# X { if(p->flag==1)
% G; U& s, N( n6 N0 l7 ~( ~ printf("\t%d",p->number);/ ?7 `. J+ E. d. ^( x1 N
p=p->next;" q( y. r% g7 C; t6 b; O6 w
}
( W- r/ N) V. s2 P" C1 x* i: ^9 @
( D( `0 j! `" P! Y/ R1 g
* B' j! H2 i8 u0 `) o V( T5 q% d. D( B9 n! E+ K5 s; S* Q
} 0 b: c/ B& m# P+ k, M3 l
第二种方法:数组
( N; P, g+ ]0 b: o, ]#include<stdio.h>
# d+ q K# e' Y) Q( P& P e5 A& f#define M 8
# L& R5 A5 n1 nstruct monkey
& ]2 e) L/ O3 u% o! ?0 t& y{int number;
% o, V: V: C0 e" f/ W/ Z1 rint nextp;
/ `1 A9 n* \3 F}link[M+1];
" H. L* x( G6 b6 ~
4 k- o3 ?) q& \; Rvoid main()
5 [/ b" n9 M0 |# O{int i,count,h;
. U; L# G& Z3 F# K8 zfor(i=1;i<=M;i++)
$ v& k/ e0 w9 p{ if(i==M)
3 c$ D6 o! Q5 j! J0 s link[i].nextp=1;; x. w- l% e/ }( q: S! g
else; K0 d4 O8 r1 a+ V2 O
link[i].nextp=i+1;
5 @/ C% c3 W( G N/ ?: w' \7 |0 F link[i].number=i;) Q8 h5 d* S0 K0 M, }
}
: D( F. d4 R3 u2 w, g J2 wprintf("\n");9 e& @) h1 h( H) ~4 X! |* F
count=0; p3 n% O( f- ]( W. Q; i
h=M;
9 p$ n' I6 N- D& @' Z$ Bprintf("依次退出的猴子: \n");1 c+ u3 E* D6 R5 N) u$ ^3 y! N
while(count<M-1)8 R0 d7 D; h9 M8 t6 q y# L; C
{i=0;) g U+ ]; t2 C2 ^; A
while(i!=3)
( O1 b: x7 e6 u* W" y3 E{ h=link[h].nextp;
. |& w5 t) ^; G2 j2 t# w if(link[h].number)1 C. H3 J0 m: n/ Z7 e, ] G
i++;}7 k( ^ q' H' O/ Y
" Z+ E( g. Z0 ~8 s7 C8 uprintf("%4d",link[h].number);9 |. ?, \4 h! h
link[h].number=0;
0 r% r9 U/ W2 a( G1 Ucount++;
% N5 ^6 e) @# h1 `6 o. V) X9 B: Q}: J3 [, I8 } k$ N% `3 r. Y
+ Q5 z/ {9 e7 d# V/ G
printf("\n大王是:");
/ x; ?! X5 |5 e5 F, Y7 w" y! r for(i=1;i<=M;i++)
/ ] U0 S: {& C if(link[i].number)
# q" A- p. Q W( s. L printf("%3d\n",link[i].number);! N/ W1 s9 x" y/ ]
& ]. V. V! l7 Y6 n- u
- X+ s( r) _: Y9 {& o! X3 G}
2 e# F* v( E# H* q6 r1 M第三种是普通方法for循环0 C) R2 E L6 J0 w6 Q+ R
#include<stdio.h>: E" w) h2 F' w& o
void main()
- l7 g& y1 D$ e{ int i,k,m,n,num[50],q,*p;3 d. F0 M$ b; q. I2 \4 j9 n
clrscr();
9 i$ D! c5 M8 W: T7 q- W1 _ printf("input number of person: n=");
7 a2 D0 ?0 v+ X4 f0 B" o scanf("%d",&n);
3 m- I% ]1 [; ?2 Z$ aprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只4 v$ L0 }+ D# y4 r- h5 d& Z& k3 E
scanf("%d",&q);
: T( n5 S, R( B% ]+ E5 v p=num;
- f) s0 e+ C7 s' c( I: L" D for(i=0;i<n;i++)
' s6 e/ ~, `, ^$ @. _3 w4 K2 e *(p+i)=i+1;
! q3 ^( w( y' v7 L C- t i=0;
1 b" t, M. E& \3 Q$ m6 g \4 {7 C k=0;
# Q& N1 d, P8 Y5 K: P' T6 w m=0;
6 y4 [6 s, s) M0 l4 I while(m<n-1)
' [: m t4 _( p7 x1 @ {if(*(p+i)!=0) k++;
, ^, V. B: I1 y2 C( m! } if(k==q)
9 f* ?& y9 p! ?2 i { *(p+i)=0;% n& W* R. \ `: G0 X C
k=0;: f/ C& ^8 k8 ^: \$ F$ F9 o
m++;
: D$ A3 H8 M) M0 _6 b0 t' Z }6 `9 G: f# x, R8 [5 D
i++;
1 x! s Z, h4 u/ Z if(i==n)i=0;; k' ~* t& O/ N1 ~9 v3 d& `
}; I( Z0 D( k' t8 F. W) V
while(*p==0)p++;5 o! W b- _9 }8 Q1 S j
printf("The last one is NO:%d\n",*p);" t' s! x% o: {: x
getch();
$ @2 C5 N5 V D, H; R4 j& u2 @1 T1 n# c3 B
} |
|