|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!# J2 |0 o8 c" F9 `6 m
这几天我在忙着编一个问题,我用了一种方法编出来!
3 A1 w+ b* I$ _9 O但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
. s, b" |4 w% `' _' x( i# v5 n注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
, B7 x' e1 @4 i( z c
9 p) w; h P& { ]' ]) l7 E. C6 B6 C, Q0 ]6 @2 O
题目
* X/ L; ~; ~- \山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。9 n' e; }( \7 \8 n j# c' ?# G
第一种方法:利用循环链表' w4 g- O! V) Y& m/ |
#include<stdio.h>
0 Z% i. O% [; y7 N) y# B#include<malloc.h>4 w& K( {6 R7 @6 q2 e, Z! ?1 C$ f/ i
#define M 8 //共有8只猴子7 q& ~% D( r. z" W
#define N 3 //数到3只时退出第三只1 ?' Z1 l' B' m1 M% D9 M% @6 I
typedef struct monkey- y+ M- o- p2 F. N" M
{int number;" G9 h8 `1 b$ r& c5 l
int flag;
5 D; M5 j k4 b6 d$ z/ e9 Nstruct monkey* next;
( T8 M* x2 M' i* U% q& P1 g2 n/ J}MONKEY;8 n5 }( A2 @+ q) S: @2 a, P, A
main()
; Y ]& P! w9 O# H" E' n' i{ MONKEY *head=NULL,*p,*s;
0 u1 s1 C g2 P int i,sum=0,count=0;
) B, D/ b1 c$ }+ m8 k clrscr(); //清屏% ~6 Y$ `) G; ~- ?4 Y. Q! a4 [
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存' b- U) K' O) o2 U6 [$ h
p->number=1;p->flag=1;
n- }0 f5 C9 x# @' z8 W' v p->next=head;0 u4 n* D4 c! ^. A1 t1 u
head=p;
3 Q7 \9 ~8 V1 a for(i=2;i<=M;i++)6 e& j. ], ?7 v; \5 Z) N2 Q1 ~
{ s=(MONKEY *)malloc(sizeof(MONKEY));" n" `- n: `2 {
s->number=i;s->flag=1;
" p) m8 j' _& C# x! n) u) I3 E s->next=head;5 U: B |' X. D4 _
p->next=s;p=p->next;
/ j. O3 x/ p. g0 \/ K6 P" I; Q }
7 Z7 {( ?4 y9 W H7 d% T' Q/ y p=head;
. v4 y& L; Z! u1 [( a9 S' x+ r for(;;)
7 \" q; v ?5 O. q) n$ Q& t R {if(p->flag==1)
5 F. h6 ?2 v" K6 Y count++;: {4 ^) w9 k5 N7 o! s
if(count==N): C0 U( D0 `- ~/ v
{p->flag=0;
8 L) O; {7 c4 U+ T* P N count=0;2 G; g3 C6 j5 K% q5 J3 z
sum++;}) N; L" r6 i- P0 g W
if(sum==M-1)
* g* l: E. p( U% r break;" H7 L5 |5 v. k# F
p=p->next;
) n) n, N! r0 G. b& m }
& {1 `, Q) c2 C p=
/ S, Q* M8 b6 h1 }4 J head;
4 Z" n! L# V8 t2 C3 |8 \0 c for(i=1;i<=M;i++)
) D2 o3 R. C& l% u+ e& Z { if(p->flag==1)
' D7 d) k4 B& o, }* y7 h2 e9 q printf("\t%d",p->number);$ q; B# h7 b. y) }1 W
p=p->next;% r H0 j$ ?4 |' Q% @
}
& L: A- m5 B! Y7 O/ l( O' W* J6 ]6 J5 P; x s
' i, p( k2 `4 a/ W
/ x& D9 s' n7 K) P5 ?} 2 I" J) `: ~$ Z( F/ ~6 ~% ]
第二种方法:数组! w, b$ M6 C, | f
#include<stdio.h>1 Q8 F: A* u! {' p) { p" w
#define M 8 E5 v* z1 [8 R" r' ^3 Z( ?# [
struct monkey9 ~3 t/ K5 A, s/ U3 h5 E6 M; `
{int number;
' F8 y2 W6 }8 S/ V$ c( _int nextp;2 Z( i$ W9 @/ y: s0 F
}link[M+1];
1 d% B$ Q- \7 m' C5 c9 o% g+ @0 ^. k( Y/ B; c# i3 ]
void main()
2 [/ i9 J- _! k$ d( I{int i,count,h;
' W1 t5 D. h. B! Sfor(i=1;i<=M;i++)
( L6 L# f' d8 w% L) O/ i; o{ if(i==M)$ U; l0 t4 v& n6 S) I" f
link[i].nextp=1;
) S( j# h( D6 O6 K+ x- p else
/ f9 G# T+ C4 z `( M4 w3 D1 U link[i].nextp=i+1;3 c: q$ I$ Y; \) ^* f! u6 i4 n
link[i].number=i;* E% M0 ?4 }8 I$ p& P4 y, B3 v
}
8 [6 w; _7 r! r. W/ E; |printf("\n");
" v- o- ]! y( x5 p" ]' K6 n* x' tcount=0;' Z4 _# ? m% e8 e
h=M;) Q4 D6 s7 o, y7 q+ l
printf("依次退出的猴子: \n");" K6 {% I; E, q7 S: [! p
while(count<M-1)
+ a) @; q9 z- t{i=0;
" x, U8 B, K3 J' ~while(i!=3)2 i; o) L4 w& s' u0 `- p
{ h=link[h].nextp;
3 Y/ V, K+ y) z( Z- x if(link[h].number)
- o! G S$ I+ z$ O2 n5 `3 L) |/ Z i++;}
+ D q7 [) M! p7 X$ v- @5 J1 n r0 x2 S, x4 f$ z/ L
printf("%4d",link[h].number);
- x, ^" ~' ]# N( plink[h].number=0;! b3 F+ u% |! `% H" \! [
count++;
( [+ [' c X5 i" {}
3 R ~3 `2 \; P# E- |% W0 Z- v; [+ }, Q3 g( x# N# g( }, m
printf("\n大王是:");* O0 r3 L3 L9 z1 V" b
for(i=1;i<=M;i++)
0 n$ ]! h6 \( S( D9 E! H1 J if(link[i].number)
" G7 F" N& l3 n/ m printf("%3d\n",link[i].number);
5 x( j# g% N) o: `7 v+ t* U }
/ c+ r3 W; |- y% `# ?& y: w3 t6 D* L; Z, e* f1 W) d
}
- h: x. F2 E* l2 ^第三种是普通方法for循环3 \/ i2 U! H4 G, ]0 M3 T0 r2 U
#include<stdio.h>
* d- Z) f8 {' I* Cvoid main()
# b, z9 r+ x' M7 W3 H- k3 Q{ int i,k,m,n,num[50],q,*p;
( F; w' A D5 K/ z# Q( i P/ O clrscr();
9 A7 {0 x- S3 L. D3 ? printf("input number of person: n=");2 h1 K0 T: t. z( c$ L
scanf("%d",&n);
, B- l: H0 A7 u7 B% T) m! Y! j# Oprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只# K% R$ G3 g1 d0 c+ J* _
scanf("%d",&q);
8 u8 @ W/ K! D2 N7 r! x p=num;4 g; O$ t: A5 h }
for(i=0;i<n;i++)
" M. a) b8 o+ }/ ?5 H% p *(p+i)=i+1;
. j) q( X9 F _) W" ? i=0;1 f$ }& F7 u2 \. z; H% q3 M
k=0;
5 R: e9 P) W2 D% }' `: d m=0;
* r3 q$ C- i0 r3 l while(m<n-1)% _3 r' Y2 z% M1 x# n3 h/ ]
{if(*(p+i)!=0) k++;
4 i5 y t/ |* c6 z" v& l2 z if(k==q)
$ ~1 C. Q0 I' t5 p { *(p+i)=0;
* H# s0 g) T% l) W- s k=0;
8 ~4 h& H7 B, }6 j+ c m++;
0 P/ ?6 ?% \0 T" m$ U: @ }
5 B j9 {* A4 \7 Z) Y' R i++;
8 n8 b& i7 M0 ]( R$ g8 i4 T if(i==n)i=0;
0 s5 R/ h; }0 ]. V }/ ^0 L8 n v% ?" |# w% K
while(*p==0)p++;7 C( Y( q7 `2 b6 k; ?# t
printf("The last one is NO:%d\n",*p);1 d, `- a9 ]/ u* H0 e% ^
getch();
5 O* B; }* ~& n$ u, n/ \
( q* Z+ }: H3 A/ B4 i# ]0 O} |
|