|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!! G% l7 S3 u' ^* y
这几天我在忙着编一个问题,我用了一种方法编出来!2 g# \. s5 b7 W" u/ I. p0 F) i! G* h
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!. k2 z S& k( c, T; S: E
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
1 r, y1 U A' }9 J; F2 N5 s @0 q( U2 q: T$ q: k3 k+ v
* g$ G6 h9 L1 y5 F% W; O5 Q 题目, L6 Y$ G# Q% n; `; `
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。% f+ _3 B* J2 E
第一种方法:利用循环链表
; Y$ \! g9 v3 Y: ^7 ^#include<stdio.h>$ T/ u! n4 t5 n- a7 Q
#include<malloc.h>7 w9 i- I- U! a
#define M 8 //共有8只猴子2 Y8 R5 }0 [! P K
#define N 3 //数到3只时退出第三只0 ?' w7 {& o# n
typedef struct monkey
9 A7 j5 V- i$ k: V+ D{int number;* `6 A% G6 N. ?- I7 f# j
int flag;" B i9 [) g% f# F5 A) l
struct monkey* next;
$ T }1 L; U& V* P6 Z, V2 O3 n}MONKEY;8 n) G& s4 q5 V7 G: h0 D a. n
main()
- g% X# }% I7 P7 c% c{ MONKEY *head=NULL,*p,*s;
% y, U, q% g+ _ int i,sum=0,count=0;
! X" T+ X3 X* N x clrscr(); //清屏! H$ d2 B5 t |/ s# B
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
& }5 Z5 \- K2 n. ~% | p->number=1;p->flag=1;
8 [1 {- h Q5 L9 |/ a$ P: e. X p->next=head;
! V8 M3 u4 t" K0 A. O/ o head=p;
! s! M7 ?, o+ [7 v5 W for(i=2;i<=M;i++)
?6 |8 {* v/ r8 [& T6 ~% _# p { s=(MONKEY *)malloc(sizeof(MONKEY));
9 P. O3 k- `* Z s->number=i;s->flag=1;2 l/ i! a: z: Y
s->next=head;: X: X5 o) w4 P P) B9 g
p->next=s;p=p->next;
& e- g+ x* N# R1 B7 l& a7 R* a; ^ }/ j9 _: p6 a0 x+ r ^. f6 v1 F
p=head;; @ y8 ?# R, z5 a
for(;;): T5 r5 x+ M) z- g
{if(p->flag==1)7 q0 Q& L v6 b( H/ \! L6 `
count++;! f5 g" q7 w- y- q( O4 k% C
if(count==N)* ~8 [. j& I. @* ^) _
{p->flag=0;( R! a" S" d4 A4 }$ P1 u; I7 `
count=0;/ d1 N- D' k1 D
sum++;}
: r. {1 }) X o* x2 V: d* Z if(sum==M-1)
2 O, d2 n) o! ^: f+ E( i$ P$ n( Y. j break;
- W5 k/ K! q4 [; t3 C/ b p=p->next;
$ R2 u0 @& z2 ?* ]) J }
5 M6 j1 E6 ~; H p=
! j* j+ [. e( h5 I- `& k' e head;
X. D1 z' s4 V9 z7 b y/ Z3 Q# Z for(i=1;i<=M;i++)& {1 _1 B( \5 a( G
{ if(p->flag==1)
* _/ i6 ~! ?. C9 m b0 J: V- Y5 F printf("\t%d",p->number);
0 A( ?. x% `/ K" A8 ?- H4 {5 I p=p->next;
. X0 Z, o2 `7 y. B* x/ K2 W2 I( s }
8 s+ ^; o4 W) x' J" l1 C& K& v
( V( X5 h7 N* I' B O, X( o \5 a ?9 T/ V2 g9 C
: L: C |0 _/ d3 P+ C" e9 N1 N}
& X$ h; O" e) x. t: R. Y第二种方法:数组6 u! m7 t, }) J7 g3 |, I9 E
#include<stdio.h>- G2 c8 b6 E, ]3 C/ c
#define M 8; ~* ~' F: X8 X
struct monkey( |1 c$ U0 i. L) i2 M
{int number;
3 n0 Z# k6 V# ^- D" I' `int nextp;( q7 f5 D+ x6 l5 h# {2 g
}link[M+1];8 s! G1 E0 @* j
1 ]8 Y. z& Z! P! S0 |
void main()5 ^" J( J0 ^, C+ b; P% W
{int i,count,h;
: o- y% E4 ]( d- @2 S; G1 W3 xfor(i=1;i<=M;i++)" U$ s' l0 G& O) G
{ if(i==M): \5 G6 x. Q! |$ u" j% R" Q, U B
link[i].nextp=1;! z6 N& {3 J# v. N# ?
else
" F$ p/ B; u) T+ J2 {: L2 t, a link[i].nextp=i+1;
( G$ K$ n x) A. z$ e link[i].number=i;
9 u- X; A* Q, s' R8 l4 R}/ b8 {1 X) C( Y+ f
printf("\n");1 w9 z' k7 S0 m) A' U- R( q
count=0;( n$ f9 [9 t' b0 `: U5 N
h=M;7 l) }0 M+ p, P+ z/ i7 W5 _! C. U
printf("依次退出的猴子: \n");
+ l& S( \0 q" }7 U, L$ Vwhile(count<M-1)) I, C1 |! }& f d1 l# d& j5 Z
{i=0;
( B+ Z$ k7 \. k& mwhile(i!=3)
) g3 }" ?, D; U$ B) C{ h=link[h].nextp;4 i/ [ r8 J, R% g, z2 _
if(link[h].number)
, \ h2 Z" W. E* ?7 E i++;}
+ o7 f- F5 O1 f4 ^' w. [2 O0 ^( r: z/ t7 W3 G, h- U
printf("%4d",link[h].number);) t5 D1 w- b8 `9 X' G6 u" M
link[h].number=0;
8 a: V Z8 S4 D0 ucount++;
$ F4 P* {) Z9 s( I* m}4 x% x) H% a" J9 _
5 n& q& n u Q0 Cprintf("\n大王是:");
( z3 d# P: P& b( q o5 H for(i=1;i<=M;i++)
- l& m: G( {/ {; X7 C if(link[i].number)6 W# T1 |( F$ d1 H- Q8 c
printf("%3d\n",link[i].number);
0 r |: l! n1 h, k. N: R
6 }, t5 e$ e& N
w. ]( s! f. @2 a+ G} 2 w* K* ]% |2 w6 L0 N* g! W: p
第三种是普通方法for循环 \( \* f9 n) r0 m, @$ J7 }* i% C5 I
#include<stdio.h>/ P. X5 V% T6 D9 J8 j2 n! H6 }( E
void main()1 e2 I% w- o z
{ int i,k,m,n,num[50],q,*p;
1 y, G% [5 ~( o. m clrscr();+ _2 ^- g* q3 A- J% h
printf("input number of person: n=");
* y2 j0 u+ o @2 X. G: c2 y" s scanf("%d",&n);
; H3 j. K& E9 M. t( y" Rprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
/ ?7 y5 \9 m8 b& k- e7 O scanf("%d",&q);8 O2 N- o: o4 z8 c, m
p=num;( q! Z- m. ?5 p* h4 O
for(i=0;i<n;i++)0 s! B- e/ s. l- R; `
*(p+i)=i+1;
( C7 b' J/ `0 C% t3 ^! y i=0;
9 K# l5 C( `5 g: L. R. g k=0;
) l( |& {7 X( G" H0 C m=0;# E. Y. f$ ?; |: x2 C/ l
while(m<n-1)
7 t; O1 c9 U. E: o {if(*(p+i)!=0) k++;4 p* p4 Q- h. c1 b$ A. M* R& S
if(k==q)) w2 L- E& F" G; f6 ?
{ *(p+i)=0;. W8 |1 Z8 T/ n4 m; }" Q( [
k=0;
: X/ `$ R% f! b1 z" v" _* E) o m++;1 N# X- H. r' A) L% _" }9 `3 D E
}
5 a' @' C9 p6 w: B i++;' S9 ^9 d; _/ E/ U H/ e# K
if(i==n)i=0;
8 `, t* l( [9 L* Y# L& N2 E }
4 V5 V1 q+ T1 Q. ~& Z T- u; c while(*p==0)p++;
0 o. T+ V! v6 x5 q! C& i5 N printf("The last one is NO:%d\n",*p);
0 n0 T- U# ^* L* w+ ]3 N getch();$ l9 d6 @! I W) {
8 S" D7 t+ |4 P6 D8 `( k
} |
|