|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
* r$ s+ ~0 g; B' R6 j/ |这几天我在忙着编一个问题,我用了一种方法编出来!# l5 @" o$ G0 [3 t" e1 O
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
5 g) z: B4 z0 o3 z注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
+ `' I3 A5 r; w5 K! d8 l2 N& Q1 q5 T& h7 L" i1 J+ G
+ S5 E+ [ [; @
题目
: p' x: H0 x7 m- x山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。& Y7 O2 x, N& q
第一种方法:利用循环链表
d, J3 J8 p* q! B#include<stdio.h>
3 n3 O# @7 n" f/ I#include<malloc.h>
- I4 B# b2 n" p, \6 C+ I#define M 8 //共有8只猴子
! }/ c, d( m# n c5 i# s+ s9 w#define N 3 //数到3只时退出第三只
# Q7 o+ V! L& E# W% L) C% @typedef struct monkey( { d& j, a& A+ R' z
{int number;
' i( N2 C3 W7 V h3 R8 x3 Gint flag;
" ~$ e% [& u" a) cstruct monkey* next;# c+ ?7 E, P6 N0 d7 Y/ g
}MONKEY;7 J4 W n0 g$ w1 {- ^9 v2 b
main()
7 r& e$ |! W# t{ MONKEY *head=NULL,*p,*s;
8 B: u/ Z" O- @ int i,sum=0,count=0;: p f9 \! t! O/ @ t7 U
clrscr(); //清屏
9 O# F) ?+ V, z, M! S# ~5 B p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存5 V* Z" i& X0 T% S! ]2 [8 [
p->number=1;p->flag=1;9 n5 v" O4 z9 }) `% D
p->next=head;
4 r6 W9 r. Z) R, O1 e- {# H head=p;0 `8 d# ?8 [* C3 z" Z4 r/ C8 n
for(i=2;i<=M;i++)
6 Q7 y9 x' U& K4 {! f4 L { s=(MONKEY *)malloc(sizeof(MONKEY));& q2 D) n a1 P. L; d8 e
s->number=i;s->flag=1;
. r% z: W2 v7 k6 e) G5 F1 T) l s->next=head;
" Q/ g7 u8 b: i. E1 S& z2 a/ k9 i p->next=s;p=p->next;1 U- C+ K# a/ n2 \9 K1 N V! k
}
3 Y) d* E* I6 e6 h/ i5 A p=head;
1 ]9 E. O1 `4 g- H" G for(;;); C5 Y1 {0 F* Y6 n
{if(p->flag==1)
! v; L8 f( s7 n# }; U5 r count++;( g; ]7 f I# l% Y4 K
if(count==N)& J. w2 q; C8 @+ f! x
{p->flag=0;$ i# d1 C: x. A; c
count=0;
9 Q8 \, v' A( h O! h sum++;}
6 [2 w- t1 N& v0 T) f' n if(sum==M-1)6 q4 ?$ X: `: Y( |6 {
break;
" F* \0 e, N3 Z9 G2 N( @0 c p=p->next;
) @0 Y9 r) y7 I }8 P! B1 T8 ` D
p= C6 m, u6 s1 R0 X$ f9 ~2 |" j. }
head;+ ~) s2 M% a. B& Y! z
for(i=1;i<=M;i++)
3 J9 l+ Y: I. ]4 M/ G- J: q { if(p->flag==1)$ z/ i9 @1 e6 w, s
printf("\t%d",p->number);
% O4 P: u' y8 ^ Z' e p=p->next;/ S H* @ u3 q/ c
}; X; F% Q/ C8 d/ `) c1 q# j
/ G: P, U0 D& n' Z# [) D! n, Q. Y/ s' l6 d& Q& ~+ o" h' q, j
7 B4 J$ s# _7 z' U! ?0 N& \9 u}
0 Y% I3 e! j; L1 d% `, Z& B U第二种方法:数组( h* d" N8 s: `& R8 M
#include<stdio.h>
1 F7 D7 p: ~6 ^5 Y5 z#define M 8& a5 r6 S3 T$ a+ R' S
struct monkey
$ _! Y& [% S9 Y+ ^, s7 U& Y( G{int number;
5 t3 v2 G$ h5 P5 x V0 F+ ?) u9 mint nextp;
7 H' Y7 Y( X: `}link[M+1];. I% b, K: r7 v/ ~; c
4 c" H& E, `: L. m1 g/ b" |& Fvoid main(): I$ G, K: T# d, z% n/ u4 W- C
{int i,count,h;" P; C) z( x o1 h2 ~9 C4 j s
for(i=1;i<=M;i++)
. e. J. Y: H' u- A2 i0 b{ if(i==M)
- P4 Q% `# m4 ^$ ?; u2 k7 P6 ^ link[i].nextp=1;
/ G( L: I0 [) @8 V9 o! I else3 T! ^3 O6 U+ W
link[i].nextp=i+1;
. ^5 s' H& s0 r; p. _; s link[i].number=i;5 X+ |% T7 i, C
}8 }3 X+ f! w/ [0 ]) q
printf("\n");
8 S# n% g/ O% @- Hcount=0;) _" }1 l( |1 V
h=M;& @6 r h8 {6 o C( k3 ?
printf("依次退出的猴子: \n");
8 y I; T! e& Y* Awhile(count<M-1)
1 b% S; h7 A) ]! v9 @{i=0;0 p% Z; I$ a/ r+ n; p% _
while(i!=3) B6 J* j* t8 _& a0 ~
{ h=link[h].nextp;* P7 a* d/ ~2 t+ h' S F. i: a* N
if(link[h].number); A/ }5 P' n( R |
i++;}) L8 N" Z- q/ T' d% e$ @
+ {! q' S6 I. u" i' S' W4 Fprintf("%4d",link[h].number);6 w- I: z- v1 i3 \! n, q8 H
link[h].number=0;2 O, S; O0 a# b1 N
count++;. U; X) u. [$ L! h3 ]
}* k3 L* ]4 r9 T0 t8 c H
$ `! T2 ~& S- z- nprintf("\n大王是:");
# z r% Q. G0 D1 H3 _+ Z7 p+ W for(i=1;i<=M;i++)
& t) c5 G, f% T4 {& |2 v2 [ if(link[i].number)& C. Y3 W- }/ D( |% T( z6 l/ J. X- n; s
printf("%3d\n",link[i].number);% ^5 H/ z# [" c# @0 t- {. z
1 A! Q( {9 c( y# F
. j, Q/ i& Z+ l- C/ R0 v" S} 0 D/ z/ H$ U3 R8 T
第三种是普通方法for循环2 o: @. [0 P% D" B
#include<stdio.h>3 Q% R$ }; y3 ?: M: A
void main()
$ V" c8 O% i9 \8 _8 r3 E' _9 Y y, t{ int i,k,m,n,num[50],q,*p;& i4 F8 R+ `+ t0 P: \
clrscr();
) X @( C: k( C# h0 u0 P printf("input number of person: n=");
* M( b8 E- c' g h* M# U scanf("%d",&n);% A2 H8 T9 G: {2 R3 {6 b
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只- j W( }/ g8 ~: q
scanf("%d",&q);
! T9 u1 D1 N! w: ] p=num;7 y3 n$ R' B W0 t- L. b& o) ~
for(i=0;i<n;i++)* k. Y; V3 k6 R/ F
*(p+i)=i+1;
% C S) g6 `( g5 ?) ~ i=0;
, M3 P. }/ U5 n0 `; @$ h/ D$ C k=0;1 c7 f, k# ^3 \* m
m=0;
+ x( Q, u4 X8 ^ O$ B7 m: E! O while(m<n-1)
, y l- d4 n/ a& }! t A) Z+ ~ {if(*(p+i)!=0) k++;3 F @! S7 S' g3 P+ F
if(k==q). S3 \8 t9 }% [5 z1 o
{ *(p+i)=0;# C: ?, I+ Z l4 w. q# n
k=0;2 `* N" Z, T$ x# n* W% ^1 A
m++;# E& ?( \# S! R
}9 Q: K& R8 j0 n2 U+ F6 \* }. Q
i++;
4 u3 a! W, w* P if(i==n)i=0;; f: Y) `9 y+ Q& W0 Y% |) V
}: @0 }0 `1 o e( u% k5 k
while(*p==0)p++;
. O5 n8 E4 e1 D8 s1 A printf("The last one is NO:%d\n",*p);2 @' `3 C4 F' I, H4 M3 e
getch();
0 E$ Q: n8 N& m( U
) l' y' I, W( F* \/ w' `) q$ k} |
|