|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!0 P# i: D9 I/ _* ?
这几天我在忙着编一个问题,我用了一种方法编出来!
0 B/ j6 b% Q: q, ]( O6 ?& t但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
( {9 y* a3 o' ~注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ) o, Q- _4 y; P/ v; c( F
# C" ]1 m9 G" _ G6 w6 ]! @ A
9 V$ e9 }8 A; P# U/ C2 x U- i
题目
/ S S6 [' E( e F+ I2 h山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
1 O# K H8 T+ w+ Z9 x第一种方法:利用循环链表0 Q: M& Q! s/ t
#include<stdio.h>
" F- b& G, a8 Z! r; F x @: ^: R#include<malloc.h>
B2 d! |2 m4 y9 x6 W#define M 8 //共有8只猴子! F" W+ E" K. D. B& i3 P( o2 c
#define N 3 //数到3只时退出第三只7 K5 B* R1 z# Y* {
typedef struct monkey" h4 \0 ]: W8 x5 {& l6 ?! x
{int number;- @% ^5 ^1 p: i5 L
int flag;0 C8 G; ?, ?2 h. Q3 |- X
struct monkey* next;
0 s/ {3 z& w0 n3 ~5 k}MONKEY;; l! G ?5 q! o/ V/ D( D3 E
main()7 S$ b. @! W2 P. S0 j8 j
{ MONKEY *head=NULL,*p,*s;
' k& t* H7 q) l' E: H* J4 Y int i,sum=0,count=0;
. Z9 d1 R4 [9 {- d0 U$ h2 H: M clrscr(); //清屏) s; t5 G4 s8 l1 d6 E
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存* W* W u+ ^3 R! ]- P* z
p->number=1;p->flag=1;3 Y2 V# \! ]2 M1 t- `+ P
p->next=head;8 m5 F0 L8 G' k$ E9 F- X
head=p;/ j T' b/ _) @
for(i=2;i<=M;i++)
. ]1 z }: |) n { s=(MONKEY *)malloc(sizeof(MONKEY));
, O4 J/ l$ | N9 ^ z& L s->number=i;s->flag=1; F0 `* e5 _! S2 p* O
s->next=head;! U- W1 R& s x6 ]$ U* k- Q
p->next=s;p=p->next;
2 ]0 v' U- e9 B f7 a: L* ~ }
! f7 c# T4 b6 _" W& B8 e0 s p=head;4 f5 t- R& t( @9 `$ \# w% I, X
for(;;). A2 B$ g3 I- B5 j# R, }9 j% s
{if(p->flag==1)
; R8 q: _. i/ R) w3 Q count++;$ _8 F/ m4 Z9 `+ @! m" \
if(count==N)
! d# D: O5 m& ?$ n& m {p->flag=0;! \$ o. {0 A9 ^; c+ M! y) t9 z
count=0; w& K& C7 z3 S5 i' Y) r* q
sum++;}
9 S' a4 g/ B; @- y+ d7 C if(sum==M-1) r- F1 U7 h$ p
break;
; Y7 h* e8 w1 q* i, T% w* } p=p->next;
. I2 m* b, x- [9 _$ P }' i1 M) x3 @4 B
p=6 s% p6 E: a* T: I0 h3 p l
head;
3 v Q; h: v7 D3 U: w for(i=1;i<=M;i++)
$ M c6 Q4 q$ O { if(p->flag==1)
% z# I; w! v& g. L printf("\t%d",p->number);
& _ R5 k' L2 K0 W, f% R! w p=p->next;+ t5 K7 j1 z# V$ U& g6 ^
}
! A4 ?/ v' ]7 F! U0 Y, ~- m/ E9 Z+ B& u0 D
! h1 ]( w2 M* Q- n0 Z* K; L% B
+ |3 t/ d5 F; k8 ^. v2 R! M
} $ u1 \- j( i+ @ a7 W; B
第二种方法:数组& V% z0 i$ N- J% V6 V3 j
#include<stdio.h>
9 ]0 v- J+ S* ?2 c; x( J, @#define M 8" z) {( ~* N: ?5 L2 _4 M
struct monkey
2 _7 B5 i, A- o! h, y. _{int number;* {8 O) c; g2 B: M0 h% S! f
int nextp;0 {" N( P# n2 T9 u
}link[M+1];
* I. I+ v8 }7 D+ U' y; E! a8 p
* A V& N! P9 @1 ^* lvoid main()
. N3 [" ~! b# u! Y- M{int i,count,h;
& B% q! a' C9 x& i" F' K, L Bfor(i=1;i<=M;i++); y$ i! m3 }# Y
{ if(i==M)
: I2 v" }4 x! Q& t link[i].nextp=1;
9 Q6 k1 I2 T7 {" M8 d/ o9 n: T, K' F else& x% X, g3 j+ Y% {4 Q" a: `9 w
link[i].nextp=i+1;( c1 Y) L6 j6 w) }8 M4 u! x; t
link[i].number=i;! v9 F, ]: i4 `7 ^% K" x2 D
}; \6 z: f6 a& U8 X, i
printf("\n");
2 C4 i, j( x# Y9 n8 gcount=0;' e& Y4 U- P2 H. e: n! l. e8 V
h=M;8 L' b8 H! F7 h
printf("依次退出的猴子: \n");
2 O+ B2 Z1 O% A% lwhile(count<M-1)
6 s0 o, e+ |2 M* o& Z! _{i=0;
' ?7 m" |8 c) qwhile(i!=3)* e. n. K1 @0 |9 F: z$ _: G
{ h=link[h].nextp;
" d1 M$ [0 j1 {: u if(link[h].number)0 `) V' _( I) P# L, X7 @
i++;}
% v# a* }. f! y+ h8 H, k6 w+ f- d2 d
printf("%4d",link[h].number);
2 J1 X2 s% Y; d7 A& J' Slink[h].number=0;7 F) a+ b" O( z) a
count++;
5 a+ _) k! J" Z2 f# ^3 q/ K}
* ]* @7 l7 a" r: G
$ O6 M3 V4 }; X* h( |9 Zprintf("\n大王是:");
1 X s# z& i; b1 V# D4 d+ Z& v for(i=1;i<=M;i++)9 s( t9 D1 u+ }; k! o) J. i& `
if(link[i].number)
3 Y9 L: V- [4 c2 c+ e% g* P$ F0 h printf("%3d\n",link[i].number);! m& s% z* g8 ?# _; J9 c8 J
7 l$ }. [& M. X5 g
/ |+ H6 s; ?$ M& e: u$ ~
}
7 u q% \5 Y5 [- }: H! z第三种是普通方法for循环. ^- y( P0 l& p. D: Z
#include<stdio.h>
3 P9 I0 @4 V" ovoid main()% F/ O z$ s; W" }# h
{ int i,k,m,n,num[50],q,*p;
* N3 n0 L! E+ l: c! x clrscr();
& f) L- L1 T% o; A) } printf("input number of person: n=");- w: Z- i& x1 g, S0 i
scanf("%d",&n);5 _/ B% M* R! L; R8 o2 p, s
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
6 I' r5 Q$ _- g$ D" v$ k& w scanf("%d",&q);$ q. K" t4 {9 l0 |0 }2 `5 X
p=num;- ]9 F$ ~" S, G
for(i=0;i<n;i++)
2 n* I0 U! {9 d7 d5 t6 N *(p+i)=i+1;
5 P6 u+ V8 A& x" ` x6 t S! }" r i=0;
5 y- c5 H( _6 _4 h: V' c k=0;+ i& a4 |' q: ]- d- f6 k7 i" ^
m=0;
& v) |5 R3 U! }5 u( @0 P while(m<n-1)
6 i4 @- f3 K% C7 Q {if(*(p+i)!=0) k++;
" d! }% T h/ M" ^% R3 S# w3 w if(k==q)
3 _* R( _$ } x! B { *(p+i)=0;/ J: k5 Q7 q; M
k=0;
" W; g! U, }/ x4 e: C7 D m++;
2 T- T5 Y) M, a# ~7 s, L }# L/ T3 G" r; S
i++;
. Q& f! O$ h5 r& w. N# B+ }, I if(i==n)i=0;0 @7 L2 ]1 a% p" J b3 z
}! e0 a0 L9 K8 K3 P8 Z( B" d
while(*p==0)p++;
: z& ~4 t9 p$ P( Y printf("The last one is NO:%d\n",*p);
# G1 d; c( i# d9 I" T getch();9 h. k" R' s9 Q, l% N. J
) d" s6 C/ W0 F. S9 g; M; D( v
} |
|