|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
$ l4 c! m. h/ e# R这几天我在忙着编一个问题,我用了一种方法编出来!* z' P) r1 Z8 I, b$ ? \% [+ B& x
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!+ v& ^5 j3 ]( S; ]; x
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
( t& x) H7 |7 Q
5 g: l) R0 X2 [, Y* W" Y, b. ]# N; Y8 y6 c! g7 X, H. |
题目1 i9 w. e) o$ K
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。' ?/ a8 V" V( `% V$ p$ T
第一种方法:利用循环链表( ^ T. r% `* W1 J5 m+ x, J; f% x
#include<stdio.h>
) j k+ S9 Z2 d9 h. q#include<malloc.h>
! N {* }" ^5 f. ]" [. X#define M 8 //共有8只猴子
5 g9 E$ M. t7 n& O7 l2 {0 O#define N 3 //数到3只时退出第三只
( r: L- b8 s0 h' Ztypedef struct monkey5 w7 z/ z2 ~$ ]& \- A8 F" D/ [
{int number;
" f7 G" L- {# F9 X4 k$ Y8 Iint flag;% d$ F% ?% t! R' z: F
struct monkey* next;
# A, ] g! Y+ H; M! W2 d2 K}MONKEY;$ Z6 S9 b/ T @. O% |
main()- F: A7 t: x3 l. F* v0 B5 o
{ MONKEY *head=NULL,*p,*s;5 B( t4 |( Q+ L' l4 B
int i,sum=0,count=0;) {: T4 ^5 g7 W m# H4 a D
clrscr(); //清屏
- A. w2 H% ?2 n( |) G, T p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存, n4 W3 B" j5 m. ?* r( [8 T
p->number=1;p->flag=1;8 h( E4 h( o E
p->next=head;
n* K! m1 R" _ head=p;8 ^) |6 { u/ P% Q4 }; }* w4 k8 P; S
for(i=2;i<=M;i++)
9 n1 _- S E( w" C9 e2 P7 p x% u2 Z { s=(MONKEY *)malloc(sizeof(MONKEY));
7 |# e) z/ b, @/ ], F3 h s->number=i;s->flag=1;( Q! a% i7 f9 N) F+ v& G& h6 \
s->next=head;
4 [: v: p0 f; `3 u* u* P p->next=s;p=p->next;
( L- ^6 V- V6 D( x }
$ G5 x9 H+ _' ^' e5 K$ t9 f1 }5 x p=head;
0 b1 ?2 \/ r. ]% G9 K, D4 v4 W5 w for(;;). {+ G, q3 A# K+ P& t, N' l/ M
{if(p->flag==1)
% V- _* p+ b* P- e/ S, W9 v6 K) P count++;! D- b$ @2 ^ U% Q) F
if(count==N)
$ | M5 `, E7 G6 u: g( b {p->flag=0;' G- D7 |. U5 g& g- R4 f: Z
count=0;
# w1 a) V8 A& l: Y/ [. W e1 U sum++;}8 H' F$ f2 S6 S7 s' U
if(sum==M-1)
( b6 r& z- d( x. ~0 p# _4 r break;% p: a+ n' k7 O( r+ D
p=p->next;8 }8 x3 P" N$ A8 m
}
" R* c8 ^* _8 [' Z' L" s p=
* w! W" T T6 b- f+ D1 M0 l" S head;$ ]. ?& K: q& u. A6 a; I
for(i=1;i<=M;i++)" e% d( m6 g' R/ N7 [0 v1 c' a
{ if(p->flag==1)( R; r" i9 J* f' J8 Q
printf("\t%d",p->number);
( D6 D k6 n1 T! r0 M! \ p=p->next;
5 j( R1 J) K% Y' m# k }
3 V, @& N3 K) `- H: i6 ^
) u5 }6 @3 v* T3 n+ n8 ?, u
5 f8 U% Q8 t9 B' _0 m" ]" `/ J& K/ P1 J, R4 E
}
- {: b) {3 M( Y `" {( }: _" N第二种方法:数组0 i4 d# T, f9 c
#include<stdio.h>( G! E. b# \, U/ f5 T ^4 ~
#define M 8
a1 l; ^" H+ {; X0 Kstruct monkey$ P/ G. L$ W: b
{int number;% B4 `# H: I" O% L9 s
int nextp;- n* C9 O3 w1 K+ e J! ~
}link[M+1];
) A9 F+ w$ {8 c( ?" D
; r% s) W) x2 |8 \4 R. @void main(): d7 D6 J6 E; b7 r
{int i,count,h;6 H8 k! j0 @/ \9 \/ {
for(i=1;i<=M;i++)* `9 J) v8 o5 t( p5 j
{ if(i==M)
& C7 [* v# ]0 y3 k7 _5 F1 r link[i].nextp=1;. `& u. w- s5 }+ {3 H) ?
else/ H6 S: l, r# O7 m! @
link[i].nextp=i+1;! Y& _2 f0 U3 d& w2 l' S
link[i].number=i;
/ T4 b* S5 o* Q+ G7 i3 S z& N}
8 L% H; ]- w- r+ X( N: Bprintf("\n");5 |3 {1 o8 Y: \" |1 Y
count=0;+ ^0 R5 Z) g" s
h=M;
. H6 i" Z7 G: S8 j2 E7 jprintf("依次退出的猴子: \n");3 H3 ~- X% ]5 p5 I5 @8 ? i
while(count<M-1)' z! Z; t1 S' @
{i=0;
0 e/ F8 c7 m2 t5 n+ e; `3 ]& uwhile(i!=3)
% f8 l0 f, z; B6 ]6 K8 {{ h=link[h].nextp;
6 i: b# s. y5 R5 u% X2 Y: r! | if(link[h].number)
( Y$ r8 I' I; e3 ]7 r9 T0 t i++;}8 q! S( |. P4 E
9 S+ b. f1 _4 Y6 m( I2 K
printf("%4d",link[h].number);
) j7 w+ m4 ^! @- c# r$ }link[h].number=0;
4 r7 s P1 a9 o5 r9 Bcount++;
- \: F# C. K. P! |}
. c' F' s( Y& T) b0 l7 m
" w7 }) h' r: E/ Mprintf("\n大王是:");
1 c! n3 @1 w8 n; F! {4 W+ d for(i=1;i<=M;i++)
! ~- E' L2 z, k0 s9 ` B6 I if(link[i].number)
( g' s) v& `$ w printf("%3d\n",link[i].number);, y3 Q0 j( X+ U$ [5 r! \. W8 ]6 u
) b+ j P. \1 d1 q% ^( m2 _, n9 H9 N) `" Y: S* t6 [/ P9 p
} 5 C( }4 A+ m' U
第三种是普通方法for循环+ F! \ G) i5 Y1 m
#include<stdio.h>4 h% A* E* A# r2 {; r' \! k- \* F
void main()6 |2 N/ u* i1 q# z9 i0 Q1 X L
{ int i,k,m,n,num[50],q,*p;
4 P! Q+ E5 {% Q& f clrscr();
3 d" i3 K& U) @* c, P& R* n printf("input number of person: n=");
5 W; Q9 N. i# M6 i4 M, w' V scanf("%d",&n);; V( \3 H% P* R0 M9 q% y
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只8 a1 Q1 u* n6 L
scanf("%d",&q);
+ ?0 S5 }4 d6 a' ?5 s. e p=num;$ Z! y7 K2 O( |& N
for(i=0;i<n;i++)8 E. }, d9 `- q
*(p+i)=i+1;7 i. u) r8 ^$ n
i=0;% J; q9 U. U& R7 h6 o9 E8 j
k=0;
P7 L( f- y2 b, H m=0;. f3 c @3 D# _9 u1 `
while(m<n-1)
) k$ @/ i/ I$ s: ]0 @# s) W8 [1 H {if(*(p+i)!=0) k++;
: u; |$ d' ~1 q if(k==q)/ p5 T c' s1 l$ Y. |
{ *(p+i)=0;" d3 {4 X' C4 W0 {
k=0;
; A( }6 {; S; g9 m; y# k( U m++;
8 Y4 o$ i- M8 O' r }1 x2 }: |3 Q% Z/ q1 p3 c% `: W& K
i++;
" [& m# k2 J$ F+ Q4 D if(i==n)i=0;" }# X& v" S! A% e Y# Z
}# x" s' a! }. H9 y
while(*p==0)p++;+ M+ ]. `" w( m7 E- W
printf("The last one is NO:%d\n",*p);
% u2 }, f* \3 s% l3 y$ Z, k% o0 g getch();
+ F# O5 B4 e+ A; f* V+ q: }! l2 e" y6 E: a% N+ }& x5 Z
} |
|