|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
z& u" F8 F+ v/ b! B7 m这几天我在忙着编一个问题,我用了一种方法编出来!
9 Z7 C8 i4 C. ?: H, w+ r" ~$ R但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
1 V, `0 \3 R8 N j8 _& p' w4 p注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 & Q2 R: B5 j& p$ r) n7 K
; z& V4 k' `& Y u
$ j/ @% N$ Y. C7 D- v6 E4 r 题目, @; D x5 H, k/ I
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。1 Y3 P$ h; ]) `! `* O$ ~, I
第一种方法:利用循环链表
" i* Z6 `) h; p! J4 u7 j#include<stdio.h>" p; g( W; r. a Z; z. ?8 n
#include<malloc.h>
" a1 P: c1 j2 @/ y3 T' Q% g, J' F#define M 8 //共有8只猴子
3 |% N: p/ P: y" N# D#define N 3 //数到3只时退出第三只
, V) e! t- u) a$ ktypedef struct monkey
) r: |& H5 G% F) {{int number;# k! s2 A* A% X0 ]" {; f6 |8 L
int flag;
( _9 }8 B6 q& }3 }6 ^0 Cstruct monkey* next;$ C' r0 ?: X- c+ K* T: W% }
}MONKEY;1 Z( i* i* H8 W6 @# N6 Y
main()
) R) ^; b; i# P% L4 o1 H4 q{ MONKEY *head=NULL,*p,*s;
" Z% {8 K8 Q! Z int i,sum=0,count=0;
$ b. e( L! u( d" G3 O clrscr(); //清屏
- b% J9 [- b7 j. h p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存/ m' ?; |2 S1 Q/ g' q
p->number=1;p->flag=1;
! \7 H) i# N% @" [ p->next=head;
. n5 d. F& ?& ` head=p;. e. w9 E8 M, i7 i
for(i=2;i<=M;i++)% [( m) [& w7 `9 |5 A7 v
{ s=(MONKEY *)malloc(sizeof(MONKEY));
5 [6 r# l8 U6 \8 Q s->number=i;s->flag=1;
/ _6 T# W4 q! N0 G& r: j4 a3 I s->next=head;# W( `. p" m7 k$ ]5 W8 X2 X9 ?
p->next=s;p=p->next;5 f$ Y) e8 l* u! y$ J: U8 c
}
/ G; d1 R8 }& j9 Y p=head;
% {, t6 Z; P3 v1 l6 w0 Z, ]9 i for(;;)
, `; L# G5 M, I$ W( f/ j+ ? {if(p->flag==1)
) I- L4 f. {) M# r4 @- G* V3 w count++;
$ j3 z$ c3 H7 o6 W if(count==N)* v( o* e4 p! E! @% E
{p->flag=0;
, \9 ?& h# |; T count=0;0 l% A$ i0 R7 p) f) F# u! P: ]6 q
sum++;}
8 g( A( ^1 Z) u2 f4 c if(sum==M-1). |, n' T2 \! A+ o
break;! `7 g% |6 J5 C c4 X
p=p->next;
+ M6 g4 ~8 L+ ^# b! W1 b4 N3 e }1 x* r2 i$ _ i3 H6 @6 v
p=
# v ?# Z9 g6 l& @+ B; @ head;
. A* j. k9 y" }* d for(i=1;i<=M;i++). E2 j$ H A5 a& w2 ?, b
{ if(p->flag==1)' p1 g, j% J4 ?. f
printf("\t%d",p->number);( o3 T7 T* u1 I4 N2 n2 E. s. u2 Q9 s
p=p->next;* w- Z8 O4 d, O7 @ O
}
+ w. L; W. H. c
# W7 w3 v5 _% B3 w2 q
5 c* [" Z8 W3 ` k; q( Y) k- \) M, l5 S8 A0 @+ J
}
, {( {5 }1 |. Z3 `0 W e( X4 F第二种方法:数组
3 |4 _/ H' I$ a8 n- z+ c#include<stdio.h>; e2 }4 |2 _2 @% {
#define M 8
5 Q w) ]/ n; ]4 Z0 Fstruct monkey
8 m# U* |5 I" `. |; A4 {5 H{int number;
7 `! ?* ?; f% U, w$ Lint nextp;
S0 f1 _+ \/ ~/ ?" \}link[M+1];- A/ o' c: C) @- z% K8 t" x
/ |, J- D" q/ ^; _% }void main()9 l* G2 T" s9 A( W. r% J
{int i,count,h;
( w" v$ J. t6 M9 U8 \+ ^for(i=1;i<=M;i++)
) v- K9 Y( n1 _1 q- O1 V{ if(i==M)2 L6 L9 H. B$ P, C w6 Y$ @
link[i].nextp=1;
+ R) u0 b9 }& J4 r2 w else
) X# d6 Z% y0 g" L) x link[i].nextp=i+1;
7 k# u* C/ [/ ~4 z' a link[i].number=i;
# H7 y6 P9 E0 o6 R6 N% f# ]}% q7 x% E% D! E: W$ i( o1 V `& A: A
printf("\n");
6 E$ ?+ G! C1 h( K- |8 scount=0;( ~. v" Y$ h" k1 H( m
h=M;5 J ^, }1 x, Z6 E X1 K
printf("依次退出的猴子: \n");
8 l5 h% a' w# |& ]& C& Ywhile(count<M-1)
: t' S7 k! z, m( [! A) M0 N4 k{i=0;
+ n8 L0 z, G. A6 L/ Dwhile(i!=3), m: C& a# U& G' J: R0 R( |
{ h=link[h].nextp;
& T' W- ^ ~5 U4 Y- P; t if(link[h].number)
1 C0 {" S$ y& ^2 S) n3 X; w4 Y i++;}
. ]9 C. [+ U) D' F/ |' j) g0 J* [5 h: D7 G' D
printf("%4d",link[h].number);
0 ~6 B' i$ v- T" q6 \4 mlink[h].number=0;! W0 j* F v1 L4 r7 k0 J6 L
count++;1 V# o2 H& T( v5 w3 j$ \
}9 [! {7 C% O. S6 g6 C+ `6 g8 N E
5 M% l4 N3 R4 z# L: T S
printf("\n大王是:");' }- G( O* y% W+ [/ p/ [7 v
for(i=1;i<=M;i++) |; g4 l3 \: f4 V7 G8 ~# O
if(link[i].number)/ V, e4 q/ K: \* }
printf("%3d\n",link[i].number);
: W" ~5 h3 F( C* Q' n" u* L* h9 r9 R0 K' d; w: n" A C- c4 m8 x7 }( |
) o5 V: D- x4 ^( v} + F$ n+ m; P% x4 K) [* Q
第三种是普通方法for循环
" y: U, Y) H7 g9 M4 s5 h" P$ |5 |#include<stdio.h>$ Y. v& `+ q1 E- w: j% p
void main()
/ L6 r. u( O" d. g1 K. L1 J{ int i,k,m,n,num[50],q,*p;3 j2 h2 [( G' H
clrscr();
( e4 o1 M& n3 {0 E* t6 A$ c printf("input number of person: n=");: |) \# I* o' |+ X6 \4 K/ O
scanf("%d",&n);$ u7 \ |4 h6 _- Q
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只$ h" B/ O- M# {) I$ [4 Q
scanf("%d",&q);
) Z, j: q4 N l3 H# C p=num;
+ t' H2 {4 V! F" d5 H0 ^& e for(i=0;i<n;i++)
R4 B5 O5 G4 `& T& j% T *(p+i)=i+1;
' `8 s V- P" J' {9 ^" }6 H2 Q& j i=0;
+ }" R% J6 g& R; S) p k=0;, Z5 O; S! V1 e: @
m=0;- p8 Y8 U' L" s9 I
while(m<n-1)6 \# x$ O6 D, B
{if(*(p+i)!=0) k++;" |( @: q/ a7 |: i' R. M; S
if(k==q)1 J7 @: E D! u% m! X
{ *(p+i)=0;
) R' e+ K- z( T2 d. R3 M k=0;3 @$ _# Y& n7 C b2 s6 S
m++;/ X" i* i; p9 M. S: J
}
" J% m! p5 C( D/ Z1 O9 S& x- T i++;
) i0 u/ X& f( E3 ~; w if(i==n)i=0;
9 H0 e7 D( ]4 f% e4 [ }
2 u9 J/ s( Y0 ?& r% k! W while(*p==0)p++;' f( s1 T% w9 O' ]2 H, Z
printf("The last one is NO:%d\n",*p);0 M( y- a* [, N, g! S9 ]2 C
getch();
% d, z7 @2 t" j% X# F" j5 O G5 u( H! J6 i: z& l
} |
|