|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!) g# ~; L8 C9 u9 X! T0 o# S
这几天我在忙着编一个问题,我用了一种方法编出来!
2 G' y7 P' x$ v$ j5 B8 O( E但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!$ r0 O: k$ H8 T; H, j: M$ d
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 3 t( s$ G7 c# C
( e# f9 r) a. Y/ t: B
$ `! E# `& v" M% q& B$ } 题目
* L0 s: v `) H/ i0 g9 V0 r9 q山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
- Y0 U3 _: ] ~& g7 \) D1 c8 @第一种方法:利用循环链表" M* a0 {) S1 p- r7 g/ L. C! s
#include<stdio.h>
" Y8 X! ?" W) l0 w7 T- G#include<malloc.h>) L% C$ F' G$ b( C. a' }! p
#define M 8 //共有8只猴子
' S& b2 i1 O/ o8 z#define N 3 //数到3只时退出第三只
4 a7 U* F' P1 G' Xtypedef struct monkey
( l/ T) ]2 s% r, R8 } R{int number;- [7 n5 }+ \ j' \# H+ E# i9 }
int flag;( v, R' ^7 y- V- q4 E/ g. ]
struct monkey* next;
7 H9 s$ X9 h9 ]. W}MONKEY;
& ]" K4 z/ v6 V5 D; O6 ^# ]main()& f* ^# s# Q P. ]; N& K0 e6 v0 g
{ MONKEY *head=NULL,*p,*s;
# O3 D' J7 K' r" M, U int i,sum=0,count=0;
7 M3 [$ L/ D4 w6 ]5 c0 w1 z9 ] clrscr(); //清屏
0 w2 D$ P$ b; A p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
3 J6 F' `; G1 a, u! D/ t4 x e p->number=1;p->flag=1;6 B4 \; P* \) N% L' |5 Q6 e
p->next=head;
1 _7 }, x9 K: c6 N4 _) Q# [$ f head=p;
7 J& ~3 I8 T5 t4 Q/ u2 R0 v2 ~ for(i=2;i<=M;i++)
# A7 G7 [9 }- L$ K+ q1 t% }- t { s=(MONKEY *)malloc(sizeof(MONKEY));
% z: W+ Q B) c2 B1 n e5 w1 h s->number=i;s->flag=1;# f Y( g/ p) X
s->next=head;
+ O0 E. Y% ^4 X O1 f p->next=s;p=p->next;
7 J! Q- G4 I! i4 r }8 V( j: i: k# o; X
p=head;) B% v5 e* s3 }1 V3 @. u
for(;;)) Y, R2 x: ^# R0 L/ H# \, m
{if(p->flag==1)0 @8 b1 N- i3 V$ h6 d$ Y* `
count++;! Z9 R! e% V, y8 }0 Q6 A ]9 p! M$ {
if(count==N)9 J) d: k. Q3 h& s% X5 o1 Y' n& E
{p->flag=0;
& R1 ^4 }5 D! D2 j4 K+ F, L count=0;
7 O P6 p% H Q- h) h6 l sum++;}6 _# `0 B. ~, b: s- d2 K
if(sum==M-1)
& ~, g9 P, `( t/ h8 u! q4 r1 Z break;
8 U9 h; r$ D4 D) ^- q3 G5 x" R p=p->next;
1 v- B" s6 X+ j% r4 M3 T$ c }0 I- ?! U: i8 y
p=
6 J) N8 u/ C0 C) ^! Z3 Y$ i head;9 |, U# X$ N9 S( t& }+ ~
for(i=1;i<=M;i++)* K9 T) b% H# E6 ~, h4 b+ K
{ if(p->flag==1)# G3 Q8 C: x; _$ u" r
printf("\t%d",p->number);
4 t9 g I' }/ _6 m& ?% R p=p->next;( }- q( [" a$ F) w( Y8 q8 t3 r
}* `& D. O9 v7 o
- K- k4 M, d/ H# A! U1 G, `0 b$ i% }) r4 I
# o8 V5 Y7 K7 J3 j7 Y4 }# n} # I" t8 [. B8 U5 x9 `6 [' x9 K
第二种方法:数组& C8 e( D* `$ v; m' W2 z$ R
#include<stdio.h>
3 u. G9 i; Y7 ~6 i0 h#define M 8: L& Z0 K9 @5 w0 [! j4 {
struct monkey6 u, s" r0 w/ N' b2 i- y' X# [
{int number;
( C! |5 d y' V$ ~# f' Hint nextp;
3 u7 @4 e5 d5 R ?4 S0 U5 q}link[M+1];& @# B; y0 ]5 n* p8 }7 [
- C8 y( [+ Q) e9 ~$ d7 ] ovoid main()
6 C- Q0 l4 s0 ^; b. \. k, y4 q{int i,count,h;$ B* N0 G" S+ h1 {" s( X# ~' G
for(i=1;i<=M;i++)
) [8 J, N3 l3 `5 K- o. L# G% m/ \{ if(i==M)
/ F% n9 V) _. E" B. d2 O' H$ |* c6 x link[i].nextp=1;
J1 N" p% h: P6 L else
7 l# K0 ^% J; s- K3 C; m, V- K$ W link[i].nextp=i+1;# o0 f+ j8 f) V" ^3 Y% D: y: L
link[i].number=i;
+ T- w7 K- U8 l Y2 j! h+ A}" r# U; e+ j% j8 x# e
printf("\n");* h T: }* h9 w9 K
count=0;8 u% ?* n$ Y( C4 Y
h=M;
3 q4 r/ S/ ^* ^( L3 W) P4 M; j4 tprintf("依次退出的猴子: \n");
- n$ o+ B4 U# s2 Wwhile(count<M-1)+ i5 s0 F9 h7 m+ p' H' x8 I1 r
{i=0;
2 T! N( { f; e2 f- ~2 C' Owhile(i!=3)
7 H9 c4 I4 R: z% D{ h=link[h].nextp;
$ D+ @. D! M9 d* |% f if(link[h].number)
0 ~$ b5 P- T- ^/ L8 O! y3 ? i++;}! O3 s2 y4 ~! |& f0 h
4 Z- z( a, F- ]7 lprintf("%4d",link[h].number);
$ z: T. r9 E& w0 T- _1 S0 olink[h].number=0;( B6 X+ X7 Z. P
count++;
1 t9 d' g6 K) g" D5 J}
9 D6 U6 \3 S- L( }2 ]7 S2 o: a9 u5 @) E! P/ e* O
printf("\n大王是:");7 v2 @5 e: N1 l1 v/ \
for(i=1;i<=M;i++)
- d+ W5 y0 W3 d! @# L8 E if(link[i].number)
* R7 e' b$ [2 H% Q* f. H# i0 c printf("%3d\n",link[i].number);; ]8 e5 f$ P+ `
2 c9 V$ |8 q6 |0 s
, r G; }, e' J" v$ e$ V3 ~}
6 O- n7 u- h/ }) Q; Y第三种是普通方法for循环1 n/ ]2 }, j" [
#include<stdio.h>! x1 y9 z, c. \( r8 u" f
void main()8 y% C( ~/ y: c Y3 D6 [
{ int i,k,m,n,num[50],q,*p;0 f+ ^7 c" J5 v4 d
clrscr();
* e6 c0 L/ T, d- T e3 K printf("input number of person: n=");7 w9 Z8 e* h" t0 k" {
scanf("%d",&n);8 X" m; t \: z1 E. a- V! H
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
3 \7 R0 O% ?, V& `, m2 c7 z scanf("%d",&q); Q$ \- Q2 m4 O ~( x1 ]
p=num;
6 L1 {! O8 I2 N: i$ s for(i=0;i<n;i++)" v7 T u8 L& L
*(p+i)=i+1;
8 S, I/ {. S7 @5 C0 v: ^) k i=0;0 t, M% L$ A) j& I
k=0;
' l# H6 R/ H9 K$ i2 |% E/ L m=0;7 I, H& c; v) N2 K+ O
while(m<n-1): G, w7 f! {( [( \ ?* C8 I6 { P
{if(*(p+i)!=0) k++;* Y8 p$ t) V/ ~# j7 U
if(k==q)
4 q; N7 X: K7 I% e" }2 x9 ^6 { { *(p+i)=0;
' m9 H( N9 A' R2 m7 m* Q! H k=0;- H9 |0 i, o: i( ~! t: f7 q
m++;
3 \$ W9 q" q2 }( g }2 n5 J! S! {( j- g Z$ {+ }
i++;' T; G% {8 h' Q7 U, f/ Y; e
if(i==n)i=0;
5 m. T. v$ ^; `# L3 ?5 `7 O4 v/ s, ^9 Q }; m3 g3 b: c& B, J4 {& \# W
while(*p==0)p++;) p% f* f R4 o1 G7 m& h
printf("The last one is NO:%d\n",*p);, l: h' [9 d2 k% M# U$ X
getch();# J" r! Q' S6 n- n( J$ d5 p" t! q; m
; j) H( i3 ?, i
} |
|