|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!9 l& Y5 J$ ?0 J7 }/ u# Y
这几天我在忙着编一个问题,我用了一种方法编出来!
! u; r% ?3 `3 u4 T9 x; [: b但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
( Y' r. I( K0 }8 `5 K1 J! f注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ! A% Y' y* {! \. @
2 }" x" h( A& a0 J4 I
& P H* n8 |0 C6 z0 G 题目/ Y1 \! U* v' {
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
6 G/ P5 E0 E9 w4 e* \( F& \. S第一种方法:利用循环链表
R( `6 v5 ~% j$ Z" @8 Q. e#include<stdio.h>
V$ b" V: r+ ~1 H2 f y3 N#include<malloc.h>
' v9 o# ]& W( D y#define M 8 //共有8只猴子
/ Q$ z1 ^6 U1 M#define N 3 //数到3只时退出第三只
) S* ]7 K& v! [: V, a) T6 T. _typedef struct monkey5 W0 b5 n; S) y, L
{int number;9 K$ a2 T b( k- F5 i
int flag;
' N: M) \% M3 gstruct monkey* next;. n! U2 @! `5 l0 X d, p" X ~
}MONKEY;
- Q) z) c: q! @* ?; i T9 m5 Lmain()9 E$ F: U/ t5 X$ d# t+ l" F; @
{ MONKEY *head=NULL,*p,*s;
( s6 w. f" N% g" H( p int i,sum=0,count=0;
9 j t* a" R9 g/ p: g! m5 b clrscr(); //清屏
4 P/ ]/ j. `( V3 q; v p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存* o/ r: y1 M% Y6 R( [* v y3 Q
p->number=1;p->flag=1;
8 h/ @" z7 b2 \$ M6 ? p->next=head;6 `/ G+ ^/ C0 K9 T
head=p;1 ^" `" S" Q$ ]* r. H
for(i=2;i<=M;i++)! C5 z a2 i" W
{ s=(MONKEY *)malloc(sizeof(MONKEY));4 M+ \' U$ Y) W+ i( y
s->number=i;s->flag=1;8 [% M% r4 b3 m; \" ?* A
s->next=head;
( V& B! E- U$ ]( ^$ A p->next=s;p=p->next;7 S1 U% V \, M" k z- O
}+ o8 a' L3 m, H
p=head;" w# v5 d( V; a; E, Z+ ^" e, K9 e1 o8 a
for(;;)
$ P/ ~) k0 V# g4 J5 u4 A {if(p->flag==1)
; b( U; d) ^& o" [; _% @ count++;
3 z q/ [- Z. K- J" L6 ` if(count==N)
) [% Z+ M4 M; t {p->flag=0;8 r6 v( k: F! a2 W% V4 E& w
count=0;
9 s' v( C' g, f2 i, w sum++;}
+ v3 T( l3 c( B+ s1 H! Y1 { if(sum==M-1)) m: b& `% N @
break;
) z2 s* ]8 x) }7 c" U1 V1 u+ A p=p->next;
' I( w- q2 {6 Z9 m9 N, E }9 M" V# t/ R/ |
p=8 N8 b+ @4 U- ~$ `, @" ^, Q% C
head;
p: P8 ^- @; [4 A0 Q for(i=1;i<=M;i++)
. l3 f! l0 p) ^) U3 ?( A { if(p->flag==1) D: @) M5 P, \5 {4 u% Y
printf("\t%d",p->number);" x& }9 _" H- u, ~
p=p->next;0 e& e0 C6 S0 p R( ~+ f
}
! O( k; C( ~( D$ ^# D; x; m0 H+ i9 e% `
Z3 f4 W$ Z- Y5 W8 a4 S5 U9 x: x* \5 I& z5 v/ M6 D
}
* X+ [$ S5 R6 f }- m$ A第二种方法:数组9 o" k- g1 s- V3 e2 n, @
#include<stdio.h>
% h8 g$ u A+ G5 U; w# i#define M 8/ q4 l* b" H+ U3 J
struct monkey
# N6 H; t: t2 {; q7 I) s: i. G{int number;. W+ Y$ q0 d& b. j" T
int nextp;$ o' d' d% [' M. j0 p7 c# ^
}link[M+1];
* I2 u" M: m7 D4 ^4 e/ M
- @. N1 r( @7 o8 U! l' C" R: Mvoid main()
" `4 \# Z* H2 ]& s* y$ _6 [{int i,count,h;1 ?( X/ S& E2 `- y3 P
for(i=1;i<=M;i++)
( n0 T$ b, q% {4 `* h& H{ if(i==M)/ J/ X* i$ u/ K1 q/ l
link[i].nextp=1;# x1 V6 z; F) _
else
0 r" w. u/ |/ m. ?2 Y/ R1 l9 o link[i].nextp=i+1;, {: K9 Y8 Z8 ^/ b, b
link[i].number=i;6 I+ l; ]3 o- N0 d1 u% x" }
}( ^$ \# {, e3 _$ N
printf("\n");
+ s- [" I7 B% B" X- icount=0;
9 J' {& W r7 s# {& d4 Gh=M; \0 G' S0 a# G4 C A6 S! W% R
printf("依次退出的猴子: \n");; Y0 a2 |9 M4 |) g0 n" N: T
while(count<M-1). z* I' g/ V+ Q; E- g* p8 L ]
{i=0;7 m% |* T; k: f: {7 n
while(i!=3)& o& T' \: u6 J* O K$ _
{ h=link[h].nextp;. i% d, c/ K* S/ A, h7 @1 X; ]
if(link[h].number)
, B5 }& c- F2 c i++;}- m" _/ E7 @4 L
. O0 O( G( N3 eprintf("%4d",link[h].number);
: G* S+ T) ^0 b3 `: f1 h }link[h].number=0;
3 P1 k$ z) P: r6 u4 w) ucount++;: R" j$ c: \# Z
}$ P8 k; w) v4 g, D" Q( V
: H0 z$ F6 g4 h) o/ e0 v
printf("\n大王是:");
5 G: j( S+ V0 s) B for(i=1;i<=M;i++)
4 X8 y8 l/ _( t& |% |( `+ n. J: j if(link[i].number)2 S' ?3 V' t4 `" x1 \
printf("%3d\n",link[i].number);9 G0 L; I6 T* z6 T. l- I
0 {) u, w: q, O7 z, [0 b; g
[, q& @0 h7 X. a}
" s3 Y- D* N4 u0 L( ~5 V- F$ w第三种是普通方法for循环: n$ `+ b! G2 [% ~1 y1 g
#include<stdio.h> a: ^' F1 I7 C. U! [" l. \" {
void main()5 W3 d$ R$ V. p. k1 v$ z3 y9 t, n
{ int i,k,m,n,num[50],q,*p;5 U: N! n# ^+ n1 z! y
clrscr();9 `9 _ V6 A& p4 W6 N# {2 d3 ]: x
printf("input number of person: n=");
3 P# k! V* h! B- o1 F; W7 x scanf("%d",&n);6 e. r- V8 y& m' k2 r* C
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只6 h" ^& C. M4 Q4 Q
scanf("%d",&q);
; c$ `3 c* Z( g: L% C p=num;
. K' g# T+ `- f* U8 d for(i=0;i<n;i++)
" ?* R Z5 x) ~) @& ~ *(p+i)=i+1;& ]7 O- D1 }. x+ I9 m l
i=0;
6 y: Y3 `2 W1 D+ V+ T k=0;% ?4 Z2 o$ F4 i# U
m=0;
$ G' t* E5 ~0 I t while(m<n-1)
: G. U7 q! T' \* P4 k {if(*(p+i)!=0) k++;
% B. s3 @8 T) r if(k==q)
% p0 H, y& J5 y' C9 l7 X { *(p+i)=0;1 k: c/ `1 \0 O( Z2 k2 N9 z3 |
k=0;
" l" q- O0 S4 x2 R$ V4 T) K/ Z m++;4 i- s5 b) P6 P$ _" _ Q9 [
}5 q( y$ u! W" P d7 s) _
i++;: f8 v. f/ Z9 W
if(i==n)i=0;
1 {4 @5 }" i0 D9 A8 U; T- [ }
) m W" {5 J( T1 U. d while(*p==0)p++;/ y) b! ^+ W, F+ S; U
printf("The last one is NO:%d\n",*p);) C7 X7 T; e w) K' m
getch();: B& h, S; J3 ]7 f, q
% l' s" |; O# \7 h/ O
} |
|