|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!% J b5 v) K3 s8 G* i) w( O" S
这几天我在忙着编一个问题,我用了一种方法编出来!* d" N5 |. ^ m0 V" Y# a
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!5 G+ v! S1 Z5 W! D$ m
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
y8 o- R. O0 D
/ ]* r0 l8 x- T9 q8 N( m
# h8 a$ `4 G& }/ \# S 题目
3 d# |! A# f5 j" K2 Z山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
" ^* d8 L3 `& P/ \; j# r第一种方法:利用循环链表6 \& [9 K+ q4 q. O& f6 w
#include<stdio.h>' i/ f% t" S9 ^3 E' P! k; [% u
#include<malloc.h>
4 _( I; t' ~( e, S+ `7 c#define M 8 //共有8只猴子
( i; d3 N7 V1 P#define N 3 //数到3只时退出第三只
! C5 c* L- J2 W/ d1 h% Otypedef struct monkey# B9 |/ Z8 ? @7 L6 C: h6 b/ m
{int number;
9 y w; |( p$ m9 jint flag;8 Y" S+ ^/ \ F' m
struct monkey* next;
3 j) h9 e. W: F* N3 K3 ?" i- ?}MONKEY;$ V6 G, D- r( W# U
main()
/ u# b' {" T4 e: _% T{ MONKEY *head=NULL,*p,*s;
6 |3 v. y5 n; m9 P0 a. F2 f* J6 N* Z int i,sum=0,count=0;
; V* M! ^1 I% h) d- U5 `, t clrscr(); //清屏4 f7 n5 _% v% @ [ R) s
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存! l+ Z2 q6 o( d: |8 o7 H( U
p->number=1;p->flag=1;
9 g: B! P% e& Y! {# c x p->next=head;, r! e8 g4 q8 B4 p
head=p;
# w. E: Y" Q: Y for(i=2;i<=M;i++)
% F; N' B3 {1 J* a( L2 M" T) P { s=(MONKEY *)malloc(sizeof(MONKEY));
+ V& y; g# V9 [2 n5 l1 j6 ~ s->number=i;s->flag=1;
+ {+ C; \! z' s, c+ y8 y7 v, s' I1 r s->next=head;
. A p3 `- B) C6 B8 O' g/ p* c p->next=s;p=p->next;
8 Q2 k1 h, z" E# E, B, C8 p* I }0 B5 F6 q* t r) p+ c7 S% J
p=head;) G$ F$ F8 ^* I
for(;;)2 P8 P; \' Q9 V8 l9 f) k
{if(p->flag==1)& D6 ?( q7 z0 w9 m+ d. ]+ Y) h
count++;
; h& Y# B& l1 |7 \) P# b' l if(count==N)
1 f1 Q6 |" h! _7 O( E3 ] {p->flag=0;
& t# X8 @! h$ w& i7 c! r count=0;- B, S) O0 D9 \* T& c
sum++;}( X/ m+ N% _$ ^, I) X9 A$ @
if(sum==M-1)
4 f1 F( d* Q, U; m8 W z break;
! X5 x6 S6 B8 l4 y2 I# L% k p=p->next;
$ i8 [3 |/ D8 a1 E+ x3 C }
+ A8 j( s6 M: _ E3 } z p=- \/ v/ B# j% q. l
head;8 Y! N) s, m" ?
for(i=1;i<=M;i++). |$ u3 A" @9 E! Y+ n
{ if(p->flag==1)
% _$ W/ b4 `5 m" b printf("\t%d",p->number);2 p; o7 J* s" i+ b( l: X4 i
p=p->next;% _4 X' h$ j% O
}+ o- {* Y) ?1 k
! J' v$ L( [7 s0 {9 a- F
8 ?/ a8 {- u [ l( v
. i8 l8 c* l3 c$ k1 l9 F) E} $ |% P) } K2 O- E) t
第二种方法:数组
$ g) Q7 C9 p8 ?6 d- a#include<stdio.h>
+ b4 K& L% h. u6 P#define M 8
9 b9 J1 e' g6 U9 ustruct monkey+ N& b# Z) e; ]; [( f
{int number;
+ m. \8 \% t; _! f7 dint nextp;
) R; d8 M' X A% L}link[M+1];
: s, S+ ]0 Q, V$ R; l
8 O) `9 h- j5 c5 ~& @void main()2 B2 Y ^ h }* E
{int i,count,h;, b- v& }, A' N
for(i=1;i<=M;i++)/ C% n/ H* v; k- W! \( k4 z7 e: a
{ if(i==M)+ A0 \& Z1 H% N4 W, f4 f
link[i].nextp=1;
+ e/ b H" ?5 Y% r else
! _2 m5 Z j+ u9 O# q" S link[i].nextp=i+1;; ?7 }$ r' f5 V F
link[i].number=i;
$ i- T9 Z, \% z; s}
6 L. s& Z& j$ B1 p, dprintf("\n");
! W0 d" ~' L* g! `# U" ecount=0;7 Y+ K. J9 l7 q2 \0 X1 N; H
h=M;8 `+ x: q# v) c* R' |
printf("依次退出的猴子: \n");4 f5 n) w2 W* w+ D9 ~% ~9 }/ e8 {% F
while(count<M-1)
" G# P) Z; {+ Y9 {+ S' h! i9 M{i=0;
. ^. i9 |9 b d+ h& J3 twhile(i!=3)" M+ g& x% Y* q6 D
{ h=link[h].nextp;
4 s2 W* G. }; }4 H, G- T if(link[h].number)$ }2 v( K. h2 ?1 h' A0 c" s
i++;}
) H8 ~' q5 h l2 o, i
3 ~' ]! F1 I: F9 zprintf("%4d",link[h].number);' n. G& h. L6 K! F, H
link[h].number=0;& b' K" A! }+ b/ R4 X; u* R9 S& G
count++;
, B3 h* q% y% b: A, r. o% }; Y}& i* G: c( e5 W% ]9 E$ n8 E- h6 L
7 u/ ?* j3 V# H9 Wprintf("\n大王是:");
. l5 ^6 [2 w4 Z! e' F for(i=1;i<=M;i++)" R0 C K6 I W8 ^: g1 r R) C
if(link[i].number)8 G1 w1 o0 c4 @8 \
printf("%3d\n",link[i].number);6 {, Y# g# ]8 C0 e; U
) u0 y; F: N5 H6 w) e4 b) N* f# P
" M: L7 K5 O+ z4 f$ K5 `% T
} 0 l' V: z/ E* Z) y. o' L
第三种是普通方法for循环
2 j; i9 H: R4 k$ U L4 N#include<stdio.h>& ]; E' t) n( N5 h; I d, ]) W
void main()
" u" {: c+ Q9 k- r7 c{ int i,k,m,n,num[50],q,*p;
8 |8 ]; F, ?/ y1 O: A$ o" n; q clrscr();
" F) g# G, N. w# g8 y# A- } printf("input number of person: n=");( H7 k0 d$ V9 {$ Q
scanf("%d",&n);
" @" P# P& `8 N }+ wprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只) _ K* @' ~, q$ Z( J- \1 u+ @9 L
scanf("%d",&q);
) M% E/ _( y: a' \/ ]0 V3 H0 P p=num;
4 v, |/ N& ?4 f# K, [( d5 x! Z( l for(i=0;i<n;i++)% O; ?: B9 `, C! D' E
*(p+i)=i+1;0 h* Y- L6 \$ ]" o6 z; Z L. D
i=0;8 G. B: B/ o% f& F8 y' a1 x
k=0;
1 q+ A# U O1 X m=0;
; t( ^, L T! z' ~5 P while(m<n-1): C. k* H% ]2 M P" S1 g
{if(*(p+i)!=0) k++;+ x/ s, l! e# n, Z4 X& e% |% n
if(k==q)
( U& G5 `$ J1 Z! h0 G5 Q( C { *(p+i)=0;) u% K; V) x. x0 C* z6 ?
k=0;( X* t2 ]% L( b) Z" h' x6 b3 u
m++;; ~- J5 ]1 {/ s8 C6 B. Y4 G& M) C
}; k$ B. l, @$ ~5 h
i++;/ o) Y; B, ^' e, R
if(i==n)i=0;
- B% j; a: b9 L! T }
n( P6 A; \$ q, P) S4 G# s8 z while(*p==0)p++;% A2 ]5 K" m; j6 Z
printf("The last one is NO:%d\n",*p); c" c% u, Q8 {6 |6 c; K: |- y
getch();; G9 d( h$ E0 p) y# X7 W
& ]2 |6 P! W& i% G) K} |
|