|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!
* r/ O: m+ r6 `3 ]: k' k; Z# @# f这几天我在忙着编一个问题,我用了一种方法编出来!0 X, U$ M* \7 |( }1 E: ]
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!: Q- O( g$ c$ i
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
& L1 ~% D: y8 D% G- e8 g
/ M7 s5 m1 k$ w" y; i8 T4 D$ N( Y8 \. M5 \
题目
! V" q r6 }6 d山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
. z) S' e% t7 i' L第一种方法:利用循环链表
$ S$ ^( e) `7 C `/ O" ~" X" o#include<stdio.h>
8 {- f$ i4 W4 @) n#include<malloc.h>
5 l. J: P! U4 ]1 N+ l#define M 8 //共有8只猴子5 k0 H4 d1 D; p9 G: h- e- k& N
#define N 3 //数到3只时退出第三只+ O+ ^8 {5 D" p& W% P+ x; q5 {2 A# d J; d2 i
typedef struct monkey
0 ^$ `3 o$ G2 J8 t! U{int number;8 {* T+ F! X2 w" |, H' m" Y/ B) O
int flag;
0 F, W& I7 v: I4 m$ Sstruct monkey* next;
/ u# B0 V9 r" c7 {9 Q: k" Q9 Q$ ]}MONKEY;
( t. |. U6 S# Q3 @8 U% D/ o# @main()
( f; @# `* K* G" t, `0 ~0 ^{ MONKEY *head=NULL,*p,*s;
- ?: \. @5 N3 |3 U8 {7 D int i,sum=0,count=0;( T5 B8 \" v1 s) ]. ?
clrscr(); //清屏1 Z4 h- M/ h: Q! B$ Y N d
p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
* x0 F1 G( V# x, M( J3 { p->number=1;p->flag=1;. g: H3 j# ^; B: l. v4 b9 H
p->next=head;
x S# G1 N" y) Y' Z head=p;/ g" x z$ d2 [& ^5 b
for(i=2;i<=M;i++)# I5 |: ^" m% h: r( u }
{ s=(MONKEY *)malloc(sizeof(MONKEY));
% n! {- t$ Y. Q6 F9 e9 O5 t s->number=i;s->flag=1;, T- Y6 Z3 l2 p* z. [. e& `
s->next=head;# F& w* ~( w6 o2 L
p->next=s;p=p->next;
V% P3 p9 U+ _+ O }
& u8 s) A! `, n! `- Y- t p=head;0 {2 _3 T% X. B7 b9 i9 V
for(;;)$ _ ]8 K. M" u, V& B
{if(p->flag==1)
# ]+ \4 d* U# @: F& D. X& P count++;5 Y' E9 E3 h$ S4 ]* n
if(count==N)- l0 j+ O+ k1 d# A% B1 s3 [5 P
{p->flag=0;9 c7 H* v! p/ g5 S {
count=0;) x* s2 ?3 n; o& l- b
sum++;}
" S4 z, v5 C9 i) @6 Y1 ?3 h( I u; H if(sum==M-1)
3 U. P: U: W7 \' X9 e% ` break;
' F7 F; A/ K; q; O5 P p=p->next;
& ?" h0 i. l4 ~8 M, A9 X- ~& ]9 V% W }
6 X7 B; v* v g0 J( | p=
0 B0 s. D/ C/ s+ T* Y head;
C$ o" @2 D4 h# Y' C! w for(i=1;i<=M;i++)& [# W8 Q7 |. [) u- l" A1 w
{ if(p->flag==1)
' G0 a" S7 v' ^) q4 z printf("\t%d",p->number);; [" \6 C% J; |( _4 f
p=p->next;% R8 w6 ?% y8 o9 {/ ^5 j- h* a
}7 T3 o6 \' j; x, U# P$ T# w9 v4 u
# s# G# m9 ?7 I& D, V1 M" J
! ~ l- `# M# ~$ O- W3 h' } H
}
+ p) [+ }+ U% u" }+ Z" m8 I6 H第二种方法:数组
4 @- a7 C& D. X: ~#include<stdio.h>- a* ]6 o( Z; z8 V3 J& T0 x
#define M 8( u! p- R N$ l# Y, C: Z9 g
struct monkey& j9 d) I9 g/ \- _5 [% ?
{int number;: f9 c0 P& Z' G+ M3 |+ F6 r
int nextp;. `2 @* }+ T" W! I4 I
}link[M+1];
7 Q$ H! ?4 T; y
& {; {- z4 h% {8 }2 B( uvoid main()
- |: G- k2 Z( R! h{int i,count,h;9 r/ M5 y8 J+ v; F
for(i=1;i<=M;i++)" a1 n1 l6 i3 Y, b0 K
{ if(i==M) s+ y9 J" x) q6 K( P' }
link[i].nextp=1;$ O% k' z2 D( P% d# @8 F5 C
else* ^: g6 o3 [* M
link[i].nextp=i+1;
, f" ]- B/ q6 _0 f link[i].number=i;- N9 p6 K6 ?) \2 Y/ v( J
}+ e' R4 l" Z5 Q; [( N$ ^ I
printf("\n");
2 ~) u: N" m0 @count=0;
; i0 m A: s3 m( ?* zh=M;$ }/ l6 x5 W6 f* V
printf("依次退出的猴子: \n");4 ?, C9 a* y1 s. Z- r6 A
while(count<M-1)/ T9 {1 E4 K/ ?6 V& ^; M$ a$ a
{i=0;; H$ u, a( C3 Y: _
while(i!=3)
5 I1 z- L1 ~5 \' y) a8 n5 h{ h=link[h].nextp;
# T' z; T% N7 g. O2 w if(link[h].number)
+ D- s+ w3 D0 P& J i++;}
s7 ~! F+ ^0 q3 Y4 M
0 B+ a5 m9 k3 k: i/ g5 P, dprintf("%4d",link[h].number);' p( z4 _ j% k( W/ a, A0 ]- Z
link[h].number=0;
# @) `5 O0 b" vcount++;0 k1 E9 e, T( G* X: z* W6 g
}
! r# r4 ~" u/ H& v5 M' R, _; z
; x: z$ P7 u2 Jprintf("\n大王是:");# ^& ~. y2 {8 ]
for(i=1;i<=M;i++)6 E, T8 E6 L7 n6 h) C- d& m: B4 x
if(link[i].number)
+ e* ~+ e4 T! @ printf("%3d\n",link[i].number);
0 V3 V3 {7 A' N7 E* U' w. |
" Z* f9 l; k; Z! _. I& p! V
: O' i& Y; \% e1 t9 W9 ~# Z} ) V7 g, J1 P7 k0 P/ C
第三种是普通方法for循环
$ U6 l6 T7 C0 D+ R#include<stdio.h>) X# E0 _% O9 S% k# l3 ?( P& F0 t2 g
void main(). p3 r0 z* W4 j
{ int i,k,m,n,num[50],q,*p;1 m6 Z! K* w. o( {! n! v; e/ j) ^. S
clrscr();5 t% Z, i$ X0 g3 M, P
printf("input number of person: n=");
1 i J Y: l# D/ ] scanf("%d",&n);
; i, B6 ^, Z) f% o7 @- q# mprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
6 s/ j" u. B" P( G e1 F scanf("%d",&q);' P0 g* `' }0 O9 o
p=num;, |; K8 V: K1 h! l4 r, f9 I. f
for(i=0;i<n;i++)/ C6 \6 c5 {, A' r7 S: k
*(p+i)=i+1;6 j/ [2 p* g- X% H* z6 k+ w1 x
i=0;
7 V9 L! s5 J: k k=0;1 R& F7 X% D4 U" \, F9 d. o+ d" \; u
m=0;1 Z* \2 S! h' S! y
while(m<n-1)4 f, m2 o. p2 _" \
{if(*(p+i)!=0) k++;: w7 e0 \) \; q6 w% B& _
if(k==q)& X% }; e( C( b, n7 V. J" n" q2 K) l
{ *(p+i)=0;; G( |4 I5 l; E* D
k=0;3 n0 s% ^' I1 c; X6 S- {
m++;
# v6 R! X& B) s$ l: k' U: c }
- k* @" H5 W1 U4 U8 F i++;
& p9 x4 `; g( ^8 y) x if(i==n)i=0;
( R9 x1 }# k( N/ u4 J }
3 h! Q2 h6 {$ S0 ? c5 z while(*p==0)p++;# ^6 N0 a8 ~. r8 r6 O- D
printf("The last one is NO:%d\n",*p);
$ S6 N5 M3 u! t6 j4 r( Z getch();; _1 h6 x7 H# I$ a1 `4 C0 \+ |3 w
% W: V9 F) F8 r8 r2 R$ P
} |
|