|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!/ `9 P" h5 p% ?) [9 |$ }( L
这几天我在忙着编一个问题,我用了一种方法编出来!
0 G1 }6 Z+ N4 e0 A3 F( M但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
( ]6 |& F2 ^$ ^) I3 Z# m' E8 T注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 / M3 l) V2 B# \5 l F
4 Z! q) o( n5 N8 @
6 D: d2 S8 O5 m1 H 题目% C7 W Y7 f( y5 f5 V9 j% o
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。6 P# b. @! [! p
第一种方法:利用循环链表
0 t7 _1 x- @9 K/ X: b [#include<stdio.h>0 ?8 }$ b' x2 F3 Q; z: e8 ~; K
#include<malloc.h>
; W& B7 V& I8 v7 ]#define M 8 //共有8只猴子
3 e3 G4 N3 ~- x" R2 @#define N 3 //数到3只时退出第三只) }- X9 r6 r6 E
typedef struct monkey
' U, g8 ~" {/ f{int number;. R ]4 f& x! ?- x, W3 j
int flag;3 U' @( D" E1 U( C* ?; k, Q
struct monkey* next;8 v7 O5 y- ]' k! ?
}MONKEY;& e( ^* U3 s5 o" g% ?2 D
main()
& a0 ]3 q2 L4 K" z, V4 y{ MONKEY *head=NULL,*p,*s;
; F! Z3 f6 ~2 K0 u1 O E. r8 c int i,sum=0,count=0;% g" z$ G- f! ?8 B, d* e
clrscr(); //清屏
& d. L. J% v E9 [" O p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
- @& k6 d5 c* H5 S- n% a8 j" P, m p->number=1;p->flag=1;3 O/ {' @+ g3 D9 P9 P
p->next=head;. v5 B+ l( ~7 `& q; ?3 k4 s6 G$ G
head=p;1 z! [2 B& s' s% Z+ W
for(i=2;i<=M;i++)
% y& V% G3 I7 F' [& h' j" G( c$ K { s=(MONKEY *)malloc(sizeof(MONKEY));" j9 `: A5 b1 j
s->number=i;s->flag=1;
& T* B' g; `! u: z2 f# b. A, B s->next=head;
& G+ s0 `. Q' r: a' s9 r. Q p->next=s;p=p->next;
! V* N$ b, D5 a' @/ I6 {' [" l3 N }
4 `- d' }& K, ~7 U2 M p=head;2 Z& F0 e% y' ^& q2 x& ~* {/ r
for(;;)
, u& u# J# o7 I& Y- Z% y% ` {if(p->flag==1)
, o3 R" [( b2 N+ f# r2 ? count++;
6 k2 p. \9 h+ {6 ^- S if(count==N)' N1 Z% @& M$ @# h* D) X
{p->flag=0;( I$ ?/ B, H5 x4 X
count=0;
, T. m8 }$ `7 K0 @+ f/ | sum++;}
. ?' L; Q+ e% N7 v if(sum==M-1)% ]3 A" R4 K' }) L0 K8 P
break;% Q+ d# u+ m5 Z+ G
p=p->next;
0 N& D. W1 H1 h6 p Y& N7 i }
% ]7 }- m* U1 |: B; V p=! g% h4 ?! N- S7 ] x* E1 i
head;
! ~# O' s1 T) ~% R! P! r2 l* ]4 O for(i=1;i<=M;i++)) j( N& W* Y7 [5 C" w
{ if(p->flag==1)
( Z* F& B9 P( `( | printf("\t%d",p->number);. D1 i: M* T8 J# L" u
p=p->next;
0 m" i* N; r: u* s, }! Q }
3 p6 `* s( p; P9 X0 c( T3 _8 b2 K5 O6 U1 p
% Z* W& S! @8 q1 {; r# H/ p* y8 X; t$ n. u* [0 K: `. Y) a' R
}
/ _. g/ Y* ]' Q2 j$ s* F7 m8 d第二种方法:数组
" ?1 m- A' ?4 e' d#include<stdio.h>3 d# E3 F& `7 T1 O0 }8 b1 `
#define M 8* \3 s( K2 Z8 z& k l8 Y& }
struct monkey: o3 O( m$ }. @/ a; `# [8 L2 n2 |" K
{int number;
4 R/ a" Q9 B1 J' L/ A* eint nextp;
5 X% \/ D# k- Z9 F$ ?}link[M+1];
- }5 i) j& Y* K; p1 S, t& |" }! X* u2 H! \! B! P
void main()
+ j9 R, k) Z6 Q# C0 {$ g9 F) V{int i,count,h; ^8 j$ i3 t2 R1 U8 a
for(i=1;i<=M;i++)
' X' v- q9 J- `! v$ k1 |0 e, r{ if(i==M)
z# J/ h& |5 L2 E @* { link[i].nextp=1;6 O4 Z( t' w9 ^& j) k/ z* P7 ]% _
else
& N0 ?$ Y9 Z$ h# o& k; t G4 k link[i].nextp=i+1;
8 z2 v" h4 ]0 G1 j link[i].number=i;
O8 P4 j1 [. c; k4 c$ ~} }' A4 p0 ^" u2 V8 R+ M' L
printf("\n");7 t2 j. ?: Q2 ~7 n4 }
count=0;
: K8 {' K3 A9 k$ }# s7 Fh=M;1 M; `1 B# c8 _, H5 k
printf("依次退出的猴子: \n");
( M% H' ~* t9 B6 g$ z2 O. g8 lwhile(count<M-1)
% |# @: K: A/ g& ^1 W7 n) z{i=0;
$ e: \% f2 R q$ awhile(i!=3)
0 {6 I8 M. u/ E, n' J& l" A{ h=link[h].nextp;
5 X1 @" R- L, i/ ?3 [$ | N% q if(link[h].number)& B* u" A5 _- n5 E6 b
i++;}
& M. g! P9 w3 N. z# K
7 j }* ?7 T5 F/ @9 B& cprintf("%4d",link[h].number);
7 U! \! e1 d* q! x7 ]9 C/ b. v; wlink[h].number=0;
9 H. y7 H- g7 D! U N( bcount++;
6 |+ F g6 }2 `* t. `5 K" ~}; |1 H% X; b4 B
9 a+ t/ ?+ |- Aprintf("\n大王是:");# \% W% u& o! t `3 z5 w9 `
for(i=1;i<=M;i++)
2 U6 z$ K: G" M$ Z" g9 T7 i1 a if(link[i].number)' \. j6 H5 D+ I. y; ]/ p
printf("%3d\n",link[i].number);
- y8 ?; L5 F, V6 y+ O) i% F. H, k3 Q
0 V5 }8 `; l; ^ o. k
" K( P8 ]) u& h1 `) \, g} 4 C2 F7 Q4 Q9 b% D6 F; w
第三种是普通方法for循环
- W# ]$ ~4 r3 s H#include<stdio.h>7 h) y2 } ]5 e" r y
void main()
$ u# ~) Z. r( _9 G) ?{ int i,k,m,n,num[50],q,*p;! t% B4 @5 e8 O4 a- Z
clrscr();
. `& p! N$ G- x% ? printf("input number of person: n=");1 w0 |+ t6 ?6 g* T8 t! {
scanf("%d",&n);
# \/ e! y ~! D" j! [; }printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
0 ?8 O9 S2 s& \1 B" S scanf("%d",&q);
, w4 b7 R- }, t0 q, h3 h( C6 Y p=num;8 x; K( O! S9 ?& v2 Z
for(i=0;i<n;i++)
* u: `8 S( B; g *(p+i)=i+1;. }' B3 C9 X# j- v9 I1 ^ f9 B
i=0;
( V2 I$ a4 j T7 F/ e9 r( v k=0;3 F8 `5 r; C% u, J, P# h
m=0; ~* H4 i% z* I: }: y8 ^
while(m<n-1)
2 [4 L! B \: G, ?2 g0 z {if(*(p+i)!=0) k++;2 J& T U+ m m! r
if(k==q)1 T" ^/ H) i, f u- V9 O6 u; v2 u9 v
{ *(p+i)=0;
: O( b% B! \, M1 S/ ]& ` k=0;
' I- {9 |. N- s4 s2 s m++;' F: g' N9 {( k# ^% P" Q: B1 m8 b) G+ c
}& p; T; N5 `- e! H6 U1 \! D
i++;
9 n# a& e5 l, J. ~ if(i==n)i=0;
+ k2 W: `; Q7 w }- q4 A$ ^ d7 O5 Q) W% ^
while(*p==0)p++;) {5 i8 E5 M* f4 I
printf("The last one is NO:%d\n",*p);" y- M" S! `! A r
getch();
" Y2 e0 d( m- s3 a7 [, l7 k( A6 x3 X1 H& m# B5 \: u2 j: |, \
} |
|