|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
" U7 N; V6 {0 h7 [* r这几天我在忙着编一个问题,我用了一种方法编出来!; E* K( H5 T ]- g0 m ~. H
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
$ F( H0 u: u% H/ |- Z# @; V/ Q注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ! g# `6 B5 a# m7 t8 W7 L
; t% ^- y7 X( s4 D% b4 V7 B6 a
4 i/ x& [3 ^% e$ D9 y 题目
# d ^6 e" c& {. s% q山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。/ j. v) i2 z. W; D! N
第一种方法:利用循环链表, w* j! i8 u/ N2 F- o: S' L# `
#include<stdio.h>- s, j% B4 z' _
#include<malloc.h>
0 M7 i' L f( b8 w! O, h! E# G#define M 8 //共有8只猴子) ]8 K+ N, Z0 @; B ~0 B0 J
#define N 3 //数到3只时退出第三只2 n; H0 v/ M0 g/ a- S j: P
typedef struct monkey0 k2 l; B& u: T" R: a+ V" U
{int number;" O/ ~% a; W. G6 r& R
int flag;+ C% y5 H! i z: @" M/ w
struct monkey* next;/ u: M4 N# t. [8 a2 _" x
}MONKEY;. j8 O# g( z6 m: ]# W& _& h
main()
- n- ^) A) e2 L4 V8 ?, Z( O$ M4 B{ MONKEY *head=NULL,*p,*s;
; H/ B }7 I0 w int i,sum=0,count=0;
& _0 O3 q1 I+ I, i clrscr(); //清屏
: @8 A! n3 f% u+ e4 E5 ~ p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存/ l( W4 C# z) \) `* |
p->number=1;p->flag=1;
1 Y/ C1 @ C' A) }) \# T3 i) y p->next=head;
1 M7 K n+ ?) ~- J8 W* q. b head=p;
|2 B$ @# e+ Z7 [: R; ~5 J for(i=2;i<=M;i++)
0 m) g% X0 W+ F1 P b: E { s=(MONKEY *)malloc(sizeof(MONKEY));8 b3 M2 e* ~: C
s->number=i;s->flag=1;
6 G/ s7 y. Z4 d. [2 K y s->next=head;
T: W- W5 ?) E% H o p->next=s;p=p->next;, E% a. q! e5 |1 e1 [: `4 ~4 W- {
}! s/ e' t! q3 f
p=head;/ r9 X2 G2 y& o! C2 Z7 r
for(;;)
* J) c `+ L! c- I9 ?7 S {if(p->flag==1)! f& ?& l, ]; ^3 ]( a
count++;
" Q0 u5 z0 J# F if(count==N)& U' {* b! y# {
{p->flag=0;
2 v* m3 k; p5 o( ~2 j+ Z/ M7 G count=0;
' w+ c2 c0 m. P: R% g+ R1 x6 y sum++;}
2 @7 W; ?6 _5 d if(sum==M-1): @1 b. I7 Z' L4 l$ X
break;, P$ d: j: J/ ^0 n. E6 [
p=p->next;7 |" z# v# Q2 V* I$ n: D' P! ~
}" C2 B/ d4 V2 v3 `. x
p= k; m# J# v5 @; s Y$ h
head;& u. h" _$ ]* c) J
for(i=1;i<=M;i++). Q+ M' k+ E, K; t5 x
{ if(p->flag==1)
& r F* z. F* x, j! m: Q- x printf("\t%d",p->number);
4 r% ~$ A* u$ z3 | p=p->next;/ t6 X( P6 o! x. J
}
- @- z. {- d- _- o0 n: c, Y# L' I$ d7 U$ _
. R$ y3 s: d% q* h
1 z' t. F Y5 h- V) C/ [+ |} $ t; y6 D: `# Q8 A8 A6 g9 y, W$ a& X3 d
第二种方法:数组5 t( E! O- z' h( ?2 @# e' @
#include<stdio.h>
( Q# [ l3 \: g$ M) q0 p#define M 8# U- M. P1 |: w$ Q* u8 a
struct monkey7 H0 E+ c# P5 ]( v8 x
{int number;# e5 K. @8 R7 ^! A# |5 W0 T M6 \
int nextp;( ^; g2 k O( r5 G
}link[M+1];: H; n! y- V! G$ P8 m# _+ O
) u' g" E; u* F% n+ u: p, ~7 c; zvoid main()
( X% J6 m7 Q* i* }! |7 U6 Y{int i,count,h;
N, S1 p/ ], p' ?2 ]4 lfor(i=1;i<=M;i++) g7 p$ m8 s u/ B7 E+ B; Y/ y
{ if(i==M)9 U0 A% _/ S z
link[i].nextp=1;
|4 S" t2 J1 H0 Y# K2 g d" y else: H0 Y8 c6 t. H* ^
link[i].nextp=i+1;% g) k% j" ` q/ u/ c6 B
link[i].number=i;. m9 F4 a1 W" Y" Z8 b4 F ]
}8 d6 p, ` @; A" l' t/ u5 ]
printf("\n");- w3 o% ]7 q4 e
count=0;
& h( E& N8 i# L6 O) vh=M;1 d; q6 `& a$ n) A
printf("依次退出的猴子: \n");6 E# h8 G" L: k3 x+ |- E* Y( v/ O
while(count<M-1)6 e6 l4 c/ \: _$ t. d/ {
{i=0;0 M$ X: A X$ R! Z5 I' B
while(i!=3)
; U& w& y( t/ B: l I& A! s8 Y{ h=link[h].nextp;* z5 F, p, T( V
if(link[h].number)
; c" _ u3 {$ w i++;}* K5 Q5 I8 M. [. M% u
) [: q4 K* N0 _0 ^
printf("%4d",link[h].number); m0 U3 R3 ?* X' ?
link[h].number=0;: X9 _" U6 V7 L+ [
count++;0 N5 Y1 D! \5 O; b0 o! y: @
} h* u! y4 b1 o
5 K% M% T/ r& A; a
printf("\n大王是:");
+ [8 K3 W2 K2 ^. L3 { n: p for(i=1;i<=M;i++)
( t. q# ]: \$ ^ if(link[i].number)2 N# W( g& \4 s' t7 m$ I+ f
printf("%3d\n",link[i].number);
4 W; i; E' C( O
; A3 I: p. x. s8 B t- \
6 X8 {- |; o7 v/ _% U, |! j}
5 I: z8 U2 w" Y7 @! L# a( ^. o第三种是普通方法for循环
' v" C7 h8 t7 i9 y3 V#include<stdio.h>8 I5 i7 m6 }2 S) c- v8 ~
void main()
& Q: }% _$ a4 S; _4 \{ int i,k,m,n,num[50],q,*p;) k7 F g0 D. y4 E2 N4 J6 z
clrscr();& V; d1 o; w. H; h5 m6 `( @7 F
printf("input number of person: n=");
) J5 `! E' D+ x3 i$ i4 N- I scanf("%d",&n);
# W" U _. A% Eprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
; }; e+ q+ W& t; m2 b4 T& ~ scanf("%d",&q);
/ |) Z5 A8 C+ ^4 B/ W0 P p=num;
9 M! z8 O$ C$ A/ D for(i=0;i<n;i++)
! Z0 F" J7 o. F r* Y *(p+i)=i+1;
( I L8 R7 W& G) N1 D i=0;: t6 J3 P' \/ N
k=0;' S' W# O% F6 x0 `8 \/ j' G3 s
m=0;
5 d7 u% G) v4 Z- j* g& y while(m<n-1)
# F" S# w' \/ ^ {if(*(p+i)!=0) k++;0 {9 i. q4 G- J
if(k==q)
/ r7 M0 ?0 g2 f \ { *(p+i)=0;% N* h$ n' l) W# d) V
k=0;
4 g* j) `# O; m5 S- w$ I) P m++;+ d( ^& j( I1 V) u! ?
}
& o; w* X1 @8 _+ r i++;1 d) X* P% g+ \# _5 `* x& a
if(i==n)i=0;
" V) L0 @4 A2 i" ^ }; c" c4 P, k7 u
while(*p==0)p++;
- J$ R w# l0 Z+ q, k& d printf("The last one is NO:%d\n",*p);
5 E2 j, G* b6 G* z+ a, k& s6 | getch();5 p% \, ^% _$ B/ O
' k ~' Z, F# |: Y3 i. f! [4 G} |
|