|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!/ l0 m) m& S. u
这几天我在忙着编一个问题,我用了一种方法编出来!
; A! d0 m. }# l6 h6 ? G但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!( K1 o: _6 D' Z/ a9 w2 q1 X. v
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
( J7 q6 k7 `+ }2 ^ T4 @, e
4 \5 Q- C1 e- L" d, @) e% X3 m, J2 t7 z* Z o/ o+ v
题目
& J, O" u D. b- i, }( s2 M4 K/ ~山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
2 J% F- n% s, A第一种方法:利用循环链表2 h* J! Z. y# T
#include<stdio.h>3 A* P& d8 }) W4 y, y
#include<malloc.h>9 d/ J0 _) c. F2 T
#define M 8 //共有8只猴子2 K- C. S( ~# E" H- _; s
#define N 3 //数到3只时退出第三只! }. `9 }( \5 x4 K
typedef struct monkey( t4 G6 n& q$ O4 s9 Q1 v
{int number;% n# ]( Y; h& c: ?( A& t1 u
int flag;
: _, r4 ~; M1 q Dstruct monkey* next;. o \: R! X ]1 P; H( I5 I
}MONKEY;
9 ?; K" s: e, D8 `main()8 { v: g8 L: r, E
{ MONKEY *head=NULL,*p,*s;# W! O- a( s% o1 D7 W
int i,sum=0,count=0;
' i4 o9 C& y& |: _( R clrscr(); //清屏: F( q. y! m1 s E, R5 r0 s5 ^$ x
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
7 |+ O. j7 _/ M: U p->number=1;p->flag=1;: C( i5 Q9 R, j! i4 b! c! M
p->next=head;6 k2 z* D1 x$ H( T$ F
head=p;- L/ W/ R! K; w5 ]& t5 i4 C6 h% F
for(i=2;i<=M;i++)$ u. q* R1 C+ \5 L6 B& m+ g0 Y
{ s=(MONKEY *)malloc(sizeof(MONKEY));
. W) ^& R* ^# z, U9 d/ E s->number=i;s->flag=1;
9 `1 d( A; M3 T X+ q( W s->next=head;1 O v! _8 q( n; @6 c! v% x
p->next=s;p=p->next;: u# G% o3 N; f% s% p
}
2 h+ ?' `* \+ k l' M p=head;
$ n" Y! V8 A$ \" `, r for(;;)
& ?& a# _" Y4 g8 z/ w9 f" i% y- H- l {if(p->flag==1)" R& {# U8 p s( n9 i- l
count++;" E; n2 y8 G/ v2 C, \/ Y9 D: X
if(count==N)
1 _0 t* @/ y, V4 r3 k, B {p->flag=0;
: X" S$ l# }' F/ J: C' O: ] count=0;6 _# B, j# {1 j* T7 ?/ ~: Y3 E& U
sum++;}
3 N# b% ], _; T$ N9 C8 K- | { if(sum==M-1)
* V( ?$ j5 \" v( V: m* r& }8 c: E& W& w break;
: ~0 k( g' y! p ^7 @! _ p=p->next;
- O* A; d6 C: e3 W- V. E3 s+ m }
& j% L4 j4 x5 } p=
, {. W$ L @# T' v) W/ m V1 w head;! Q- L* p8 X1 g0 ~2 P
for(i=1;i<=M;i++)
6 u$ V* [; w1 K; c { if(p->flag==1)
( N$ G) h3 \8 J! n9 t- I- t printf("\t%d",p->number);
: N* E L. [& Q/ |4 F) @ p=p->next;) `* S. O; d& T% H; D/ L
}1 h. P# x' y7 _, _) c {; K
% f6 e6 i8 d) W& [9 ~) ~ u# @3 L: {9 p& l: Y8 K
+ b$ B+ T/ d7 C7 X0 A
}
/ ?, K: O& k0 k9 b n6 T. F第二种方法:数组5 ^! z& q* }. {5 }9 N: v; `
#include<stdio.h>
+ y# T& s' V* T+ q. S/ ~9 d/ i2 y: ~#define M 84 @( Z; T3 {1 R6 G* @
struct monkey9 O& k! o8 x$ G, f
{int number;' l& ^8 p, j5 i, h! Q. ~
int nextp;' W, s- C( \' x9 q3 \5 K$ q3 l, E
}link[M+1];
: `# D( V, v3 F! x7 S# s
4 T1 K; j- }3 ~5 @void main()6 t, }1 Z) @5 S6 |# L: J# J# B
{int i,count,h;
7 e7 Z1 l( F$ q7 w0 }0 u2 Yfor(i=1;i<=M;i++)
" k' w- ~+ I/ \& E{ if(i==M); k" J5 D9 }0 }, v* \0 `- J1 z5 T( ?
link[i].nextp=1;9 n1 A; O% Q, m' @5 Q9 b
else2 {+ n5 G8 ^; H) O' D9 {" W
link[i].nextp=i+1;; I% T$ ?( s+ Z8 w7 U1 |
link[i].number=i;
$ d6 t9 h; |0 w m+ S}
7 P6 A* w% A1 I2 m( l9 {& @* hprintf("\n");5 g! Q% t9 W1 W% s
count=0;% Y8 E6 J* b$ r# {9 L
h=M;
7 c: L% f; T% z$ @printf("依次退出的猴子: \n");
: j6 |/ Y [' T1 d+ Kwhile(count<M-1)3 ~0 C3 G. h7 S8 X* C! c0 I: z( P: P
{i=0;
6 q* W' R4 \( xwhile(i!=3)
+ B5 ~& Y6 n" o, v) U& Y5 Q. D: e{ h=link[h].nextp;6 g6 r: ~0 ~! @$ p; l. M6 ^
if(link[h].number)
2 `1 V J4 m2 x i++;}
0 w# I% S: @, e8 T8 [9 i5 K! d* l% s1 L$ h7 D# L
printf("%4d",link[h].number);
# d, N0 g( T# G9 _2 klink[h].number=0;
' L0 ^: b2 b$ D8 `0 T) q3 Z# Ncount++;
3 o! q: F3 I' f# G0 l4 `& `}
; l* o- o; M: k4 P! }; b3 F# i3 k' Y/ t
printf("\n大王是:");2 `4 _, p2 G3 ]
for(i=1;i<=M;i++)1 k+ ?! f. d/ {8 a
if(link[i].number)
) B0 n( \2 r: j: t& H- z. ~ printf("%3d\n",link[i].number);* O* t! x0 S2 D$ k7 G# h# h
" w' q v. i. Y* i" G5 S5 a7 j* u4 `' u+ h* {9 X a6 d( p, m
} 7 Z* n$ U+ {& p9 r1 J
第三种是普通方法for循环
1 H5 P7 f! S; ?4 S, d+ P#include<stdio.h>
9 m8 v& P, G( f- U- p) K9 _# Ovoid main()
* B P* l3 z1 Z, A6 U$ [1 i{ int i,k,m,n,num[50],q,*p;
& T. ?& q' \4 R4 q& h clrscr();
5 O" r! e! Y& B/ a7 i printf("input number of person: n=");
! R, H5 \# L4 i: X/ B0 v scanf("%d",&n);2 u" r- j$ G# C6 D, t6 t
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
) z5 }6 B" N! {# R4 U8 V) L9 K5 } scanf("%d",&q);
( I. X! Z t: v- x9 e; n p=num;
8 g/ ?1 S1 f) h for(i=0;i<n;i++)
, j3 J% ^* W% [8 w *(p+i)=i+1;
: {$ x9 h6 E) }7 P* r7 ^( W: _9 h' I i=0;
* f& u; R9 }$ h k=0;% [. |& q; _$ n- @
m=0;
* i) o$ r! o' l$ g; { while(m<n-1)
/ P$ U* n3 n. y" \- b4 j {if(*(p+i)!=0) k++;
" |/ h/ Z: Z+ @1 E/ Y9 C if(k==q)' L s/ R4 a2 E0 S8 ?
{ *(p+i)=0;
4 | O `, g6 \! U& P; H k=0;# b. A* C' k y$ ^# N' d1 ~
m++;& _8 ?/ l( ? {& p- l; f' h
}, s9 p. C& y$ p6 ^: F/ c
i++;
& T. l- E% \9 w3 `7 U if(i==n)i=0;) |, h4 c6 Y" x9 d P1 x
}
1 g4 I/ m5 K. y; u- a while(*p==0)p++;
8 O) U7 j% @' F7 B, H( g0 |/ Z printf("The last one is NO:%d\n",*p);
' r# |6 w2 H6 l% r getch();
& d. l k! c- h) y4 `/ B% _& q- J$ |* W, r7 [- u
} |
|