|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
?; b$ e% Y; j& z8 S这几天我在忙着编一个问题,我用了一种方法编出来!
" w8 q+ C7 q# }! ^: K5 k但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
6 K9 y, v0 l: A. H4 m注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
, o3 X$ ] Q$ e- K: E ~5 |
+ o9 a W4 d1 k; d: _; L/ @: H5 _5 H; I# k
题目
! |* v K: U3 P' L5 s山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
! f! j. ~0 ^, z3 ^7 \* b9 o& j第一种方法:利用循环链表8 P6 U' ~6 R5 M! R7 |7 ]1 H9 C
#include<stdio.h>6 Z* J! S; I- ?6 d
#include<malloc.h>. _4 Q h) R3 b6 q3 C+ {' G; ~
#define M 8 //共有8只猴子
) F% M# z$ d1 q9 q$ L. O7 n#define N 3 //数到3只时退出第三只
0 x! t6 m2 r! B: d9 itypedef struct monkey
) R* ` f! e7 f+ f! P9 R{int number;0 e3 q, c; F# r; r2 Q' S0 O9 U. f9 `
int flag;- Q( N0 e: E0 B- i" g* \ b' X
struct monkey* next;
) x8 a+ ]$ A0 Q3 R1 M: p}MONKEY;
) g& l9 U* K( U! Imain()
' C' U3 u: R" l1 Y; v( S6 y. d9 \{ MONKEY *head=NULL,*p,*s; i9 }% K( W' T$ b( U
int i,sum=0,count=0;
$ E) d9 D! F4 u$ Z2 T4 f4 V clrscr(); //清屏! a8 @- }$ }4 H8 e4 k9 k
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存. E- P0 ~. R! A& A' o8 p% v4 v5 n0 t
p->number=1;p->flag=1;
9 ?5 _+ D7 {0 |9 G3 _7 v7 W p->next=head;+ j# M& @; o' C
head=p;1 g7 v& h2 w: A5 p, W: e: T
for(i=2;i<=M;i++) k c5 {+ U8 g2 h% V' Y& {8 f/ ]
{ s=(MONKEY *)malloc(sizeof(MONKEY));, {" C F- ^; K: v: \
s->number=i;s->flag=1;
- h' ^4 ?' U4 y! s9 m. Y s->next=head;
2 v. l; w# v7 r! c" }) \! V+ G p->next=s;p=p->next;
5 J7 w4 U$ r" |8 ^6 y4 b }4 F* k) [; h7 z
p=head;
5 v/ D& [$ d2 j% g- { for(;;)- f1 c5 p; p$ e. x/ S! i/ V2 q
{if(p->flag==1)+ {; ]$ S$ j& \# z( d y$ C
count++;$ a' D' \3 D$ n- s# i$ N* C; R# u
if(count==N)' U' A- _ [# C6 b5 R+ u' e: r
{p->flag=0;
0 m3 e2 @# W- ]# o, j count=0;6 E9 F* u5 k C! W [+ O ]+ T
sum++;}
4 W2 Z: z$ Y' G. m if(sum==M-1)
: ], c% o) D) O8 C break;' {$ n% d7 \$ I8 e
p=p->next;- {! p9 G8 X! k# z: [
}
0 b5 v8 z) g& [5 U p=- i$ }8 N. M# u& n
head;/ V! T" N8 ?/ ~2 |% m# S" e
for(i=1;i<=M;i++)/ d$ R- t- Z( }& j. F9 d
{ if(p->flag==1): {- Q- I$ |8 [7 K; E
printf("\t%d",p->number);4 v9 c d! G+ `; I' M: F3 t
p=p->next;
2 U [0 k1 \. P9 v& B2 u- \ }
, G1 i& I0 B0 T5 ]
% O- J8 J0 F4 F$ A- Q, d2 v" |( b, ^% \
; z. ]7 k$ Y& c}
" \: I; `$ a- J1 \- v第二种方法:数组
( f+ f7 r' W+ S1 W b$ |7 o#include<stdio.h>
& b- k C# T2 H# F" N) r& l#define M 8. e) a+ D& s6 l' y7 t4 q
struct monkey4 }, H& Q% n, S) E0 |6 X4 P
{int number;
- \- q/ r$ m+ Q5 Q* yint nextp;
; Q& z6 K/ k! M) V# L/ i/ x) D4 w}link[M+1];3 T# g2 C! }) W2 o6 u. l
2 C7 b) j: r3 t3 Y& V2 A) n6 wvoid main()
$ m0 y% ~( H( I2 D. q{int i,count,h;
- {2 q- Y/ W* k u. b$ kfor(i=1;i<=M;i++)6 A4 Z8 [& k! Y9 e$ ~% C
{ if(i==M)
6 v$ Q7 I; f. G/ H# g A) t/ X link[i].nextp=1;
, K% P6 Z* B; k# B; G9 k% @ else
# t9 h( x$ f7 G link[i].nextp=i+1;
; c6 T3 L4 V7 X% M1 A0 G link[i].number=i;% c" b6 z" n% k
}
y9 L; U9 l: c7 l; R5 Hprintf("\n");
1 b" `+ v: A* {. n7 t V" Ucount=0;
- m, M! Y# [' E( Gh=M;
2 V# d; g {5 `1 [$ W+ i6 }$ Qprintf("依次退出的猴子: \n");+ a# i" T1 a# s5 R% ?
while(count<M-1)9 f0 v8 ?/ ~# X3 ]
{i=0;0 Q$ H+ I1 J* O" Z9 q$ S
while(i!=3)
% @& T. v q$ D: {+ L. C5 I# ?{ h=link[h].nextp;
G1 h7 Z% H9 N: D8 ^0 K W3 h if(link[h].number)" _+ L* Q' s+ i$ _
i++;}( f, R) O6 O, U! J/ Z' o% I9 u
w+ y% Q/ _/ A3 i
printf("%4d",link[h].number);& c# |+ b- W% b( C. m+ N1 E
link[h].number=0;; ]: o+ j0 ?7 i" @
count++;& W! t. s- R: M: o2 s
}0 L& S1 |9 E* ?+ @% R* c1 o
* B4 p, s" u( W4 u6 W$ q8 n8 ]
printf("\n大王是:");
) U3 J) O& O/ f' p! Y4 { ^8 |/ G for(i=1;i<=M;i++)
0 L# N; ?( ? N6 B if(link[i].number)
1 g$ H0 }2 X* e; z: n2 M printf("%3d\n",link[i].number);
% U5 e* s5 m v D( C! K
8 r6 _- y) \: g
. C- m3 L- ]2 B1 R; b) `}
# d. K- n" ?0 [7 J0 c第三种是普通方法for循环
/ [$ q& G6 L! ]/ | w9 K& X+ g#include<stdio.h>+ @3 L3 [& {% e; f5 i' }( p
void main()7 }3 M' c3 E; `& I; u4 L
{ int i,k,m,n,num[50],q,*p;/ E3 y% O: @* Y! y) q1 B
clrscr();" v9 A _6 H+ s$ I
printf("input number of person: n=");
8 a& i, y2 [* j% i* V4 B' p scanf("%d",&n);' j' h2 t- R$ p$ Z/ p9 @- v
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只% n5 c" p: ^+ j5 g7 M4 B
scanf("%d",&q);
" g" u9 b& n. ? e5 m# w9 g p=num;
6 ^* z' [- e* H- c for(i=0;i<n;i++)# Y, l) P& s ]& M# x9 r2 @( P
*(p+i)=i+1;
; j1 n3 X5 k9 U, K% d9 ^$ @ i=0;
- Q+ m8 Y: O$ K7 f! b$ g$ k k=0;: W& ^8 J7 {9 B" R$ M
m=0;
4 ? E8 s" B% p) f1 C$ X while(m<n-1)
" G; N- G0 y, ]5 K: i+ n0 H: E$ O1 T {if(*(p+i)!=0) k++;8 ~& B& i4 z; ?) G! e2 U8 M
if(k==q)% a' ?' ]' S: Y, T9 m
{ *(p+i)=0;8 J7 o2 c! e3 ` `; ]4 F [
k=0;
7 s/ T$ `9 o6 R' N* |: q m++;
/ Z# S0 @5 Q1 g+ G. ?) w. z% H1 t }. ~ K1 N$ j# t, W
i++;
4 |: m0 x- [8 D* b5 g D if(i==n)i=0;
4 i. d5 n7 X4 N; b2 l5 V5 u }- Z& T5 {4 `5 T+ ^6 F
while(*p==0)p++;
! j" n% ~+ q1 W0 I2 F/ c printf("The last one is NO:%d\n",*p);
2 d- A7 f4 ?7 C3 }" V3 i getch();
( B$ m7 T% B1 J% ^. i( P6 m
( n9 w+ R; P' \# ^' Y+ V} |
|