|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!& S1 w q$ q; j* I: A ~( H& U# J. i
这几天我在忙着编一个问题,我用了一种方法编出来!& N! [. N/ w8 P8 S* |$ `& w+ x, B. j
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
6 n& S+ z9 s. {' ^注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 * @3 a& j# x* M# K3 J
+ L# V E+ g7 C. P5 D" d6 v/ U) a
题目
0 c6 ]2 P+ Q, |+ X' M1 e山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。0 p$ O9 J9 X7 q: v1 L; w: B2 Z0 k
第一种方法:利用循环链表
$ q% c: @5 F' f5 ~8 m, p#include<stdio.h>
/ D% k6 x6 A5 k% `' N#include<malloc.h>+ C# _+ F; [4 m) F, p. U
#define M 8 //共有8只猴子/ u2 f% W1 F4 B0 O% h
#define N 3 //数到3只时退出第三只
& b! u6 ?$ `& {: L( @typedef struct monkey+ t* c% C1 w6 h- [4 q p P# z0 i
{int number;! L( y" j! X) s. C# F! M
int flag;- }6 V7 v. h7 w- R
struct monkey* next;
: J0 f+ }! r O+ I5 g( R- a}MONKEY;
$ ]- s. P" c" f9 O+ X; mmain()6 l) w0 h! G( ^# ?
{ MONKEY *head=NULL,*p,*s;
, ~/ d% U) B& ` int i,sum=0,count=0;# x: g+ U- [ W8 n( u
clrscr(); //清屏
: t! Y* w# [( U5 _1 u2 S p=(MONKEY *)malloc(sizeof(MONKEY)); //分配内存
c5 \1 g# G0 q p->number=1;p->flag=1;
* i; E4 h. H* _" x C p->next=head;
' f" k# z, z7 a, o' ` head=p;* I, M: t4 d) I" \1 x8 L
for(i=2;i<=M;i++)
( Z: B* E1 N: ?# d { s=(MONKEY *)malloc(sizeof(MONKEY));0 _- ]. v7 m5 x8 X3 W% `
s->number=i;s->flag=1;
- ~ u* m7 I# y. V s->next=head;$ L- s0 `/ E# [3 B T, Q1 b, C8 \
p->next=s;p=p->next;. o' H! v0 r& ~) f: P9 l3 R
}
' V0 E) b8 `. @% V p=head;
. {' O. \3 A; l4 j# }& n( p for(;;)
! T/ j5 ^& e7 P S {if(p->flag==1)
7 E4 R. x3 u, Z. \1 }* U0 c count++;
4 b2 ~# r( ~8 _0 Q$ j if(count==N)
+ Q" O' U# |) k, U {p->flag=0;
) B7 u% J( X8 {$ | n: L) x count=0;- J: H6 U9 R9 }8 t% X
sum++;}$ K2 [( Z1 ]* K0 [1 I" @' i. D
if(sum==M-1)( J+ p4 W, y! F1 e2 p( {6 v
break;
6 Z$ W( e6 W+ z& Y6 F; Q/ \# h p=p->next;2 l. }0 `7 @' a- Z$ c) i( _
}" a# F9 [+ Z. A( X& W+ G+ d
p=7 s, y* |) o, n
head;( f3 b8 S+ ?; k8 U5 i
for(i=1;i<=M;i++); m/ a- Z* o( Q+ j: U3 Z2 M4 l# K
{ if(p->flag==1)
* A; }; f2 _: ]5 g" E printf("\t%d",p->number);5 Q5 [# I" R! N7 w0 @8 C
p=p->next;; B$ q" x( N3 X2 p* |2 c+ R
}5 _) L: t- l9 G5 r5 e3 ?
& P; b% @/ B8 n1 e! D3 H1 U
+ V( F# ~4 d- T S9 H2 h
) ~/ }8 [( q: i" k
}
; _# d/ u; [; g7 E第二种方法:数组: L0 w1 U J; b( m9 y2 Z6 h
#include<stdio.h>
: o- g! G: L: f: L#define M 8
2 G; F4 l' \: g- W6 @4 k9 Zstruct monkey- y h0 F7 V: g
{int number;
! a* c2 w. [! {8 U- i" uint nextp;$ Y& K% A; P6 |. C/ \8 y+ U
}link[M+1];0 H7 A% [' X' T, ?1 R8 M( H* d6 w
$ ^- L7 t, |0 f6 V% p: G3 z/ T% ovoid main()
$ N' Z5 W* {& ~# E8 x& x{int i,count,h;
! ~3 Z. }- E' a* m, r$ [for(i=1;i<=M;i++)
+ P+ ?. X4 x6 F, O1 [ ^5 N{ if(i==M)+ `) [) X4 n( h- j: C
link[i].nextp=1;
" b" E. h6 t' S2 n6 t else4 A( |' d; k5 Y6 ~
link[i].nextp=i+1;1 r; o% t% X+ U2 A3 r2 P/ [
link[i].number=i;- B4 A I# b9 @
}# ]0 |4 d, R8 |4 w5 Q7 g
printf("\n");" W+ q1 i# B! ?3 }1 e
count=0;
' e9 w0 J- z8 xh=M;: J& @4 m* z3 N
printf("依次退出的猴子: \n");
' F2 d& O7 O( v' f2 q! Jwhile(count<M-1)
; b( Y6 m+ K3 c{i=0;
8 r" n' c/ \* k5 T" E0 C- @# ]while(i!=3)
- l/ o% w2 k) _7 K4 B{ h=link[h].nextp;
% Z' M- f8 i" j, v7 b if(link[h].number)# U$ B" z8 f0 a0 ~' W5 @
i++;}" w1 O# C# u* g" W! b9 s4 a
2 @' u8 C) p3 R c& G0 z6 [printf("%4d",link[h].number);
* D5 G+ i+ p1 }$ a2 s" U/ Flink[h].number=0;+ Q; I& Q* `+ w. a X) L
count++;# ~; M( S. l1 ]$ W N
}- K- s& z$ f4 u
+ ]" d2 `, ?$ ^ J# n3 c
printf("\n大王是:");2 r0 Y/ m* b) J3 A: i, q3 i( H
for(i=1;i<=M;i++)
3 D3 o4 x% z h' R9 b. r- b if(link[i].number)0 y& ?& ]+ S' H+ @
printf("%3d\n",link[i].number);" @+ n/ b) Q4 i4 g& j& b
+ z9 D4 D8 b3 \1 z, a
3 d8 L8 U3 M% i
}
# x4 J! Q; ~8 X! t C第三种是普通方法for循环) ?) e, i4 }9 A; b& _
#include<stdio.h>1 U) d8 l; ^ c+ z0 P) n
void main()5 G3 V" m2 H6 {- m
{ int i,k,m,n,num[50],q,*p;
5 `$ _9 E2 }: B; D+ L clrscr();
' v: c1 d* w6 f5 V# t printf("input number of person: n=");
5 U6 N) B! M* ?+ c! n/ J scanf("%d",&n);7 K- f/ y6 M3 p, Q% }
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
& d6 O1 ~1 [0 W' \: B0 ^8 M$ m scanf("%d",&q);
, s, T- d& O% _ p=num;
; x {: r J7 w% d- I! p for(i=0;i<n;i++)& I* C2 b9 m# [
*(p+i)=i+1;
- Z. U7 b% i w* ^6 C i=0;6 k; L5 A3 j" n% t+ B+ ?) f' s
k=0;) f9 A# d8 n h$ r
m=0;
9 o# P O2 ]) s" ^* a5 y8 y while(m<n-1)
. N$ x7 ]" v$ p: o( @4 \9 h {if(*(p+i)!=0) k++;
- K8 M+ i( `6 E2 ?( R* r6 E9 ^ if(k==q)" [4 R8 o+ V* m
{ *(p+i)=0;
+ u, e0 ~1 Q# s6 H3 ^& Y" i; v( N9 `1 p k=0;3 U( z' U3 F- a% W- n2 _* g5 e
m++;
& y. I4 k3 S! ]( d* M1 o }( o* ~ p0 X6 E* \
i++;
% \: R' O: i% D+ m' O/ \8 g6 A if(i==n)i=0;6 k/ ^$ ~$ Z0 C+ M' { l
}
- b. ~ l( B. ]1 Q$ y while(*p==0)p++;
6 V; M j- }) B* n2 ~; G( E printf("The last one is NO:%d\n",*p);
0 X" V% U$ k# {9 }2 \1 d getch();
. D0 I) i! m0 g1 `4 B0 C2 H
! R) b/ @8 W9 t) E} |
|