鱼C论坛

 找回密码
 立即注册
查看: 3069|回复: 4

猴子问题

[复制链接]
发表于 2011-10-2 03:45:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大家好!
2 ]' B  [# S' Y, {这几天我在忙着编一个问题,我用了一种方法编出来!
2 F2 O1 e, a. _( p4 y8 ~但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
5 H4 z) @  v5 w, w, k$ D注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 % `8 |' i" S- p

& H! e4 G: O2 u! \  W) A4 Q7 x# E3 b% h( h4 z3 s+ }
                            题目
' c7 [, R9 k- G& Y& l. D3 ~山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
% L# t: f: k# M, \第一种方法:利用循环链表- r, \$ x. W# b- ~! d, Q9 D" Q! V( n: v
#include<stdio.h>
1 D4 c: ?0 ~! g" t  L' x#include<malloc.h>
+ b% G1 w) f  ?5 u0 \, l#define M 8            //共有8只猴子
* z( v% q9 x  o3 N- Y$ D7 Q#define N 3            //数到3只时退出第三只. R9 o+ {: r' ?+ a, B
typedef struct monkey% `. ~$ A% s" k+ r+ O* a
{int number;
, D, C$ o0 l* O- g$ Yint flag;
$ p. W- V; J, ]9 H7 b5 l- Vstruct monkey* next;5 m, s' J7 S& L5 H$ i' p
}MONKEY;
) p5 K% [3 @) ?8 ]5 N' ~4 Y/ Ymain()
; t7 V; F# l5 e, d9 i9 ^. `{ MONKEY *head=NULL,*p,*s;# l( k8 n, o; j4 j, }9 Q( C* O
  int i,sum=0,count=0;
# a: v0 |4 }+ U* e1 f# |  clrscr();              //清屏
( i2 G  t# J4 a5 l" ?4 a: r  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
3 T  `" f0 R: }  T  p->number=1;p->flag=1;
* k* j1 Z& o( Q! s  B$ T& `( o  p->next=head;
8 u+ ]& y0 ?' h) l" x  head=p;) Y7 P* K' o2 R/ `6 T" S' n
  for(i=2;i<=M;i++), d/ c/ T3 I* [
    { s=(MONKEY *)malloc(sizeof(MONKEY));  q) \/ H. @" q7 ~" }
     s->number=i;s->flag=1;
1 ?; Y9 N5 j1 P1 \% A: R9 d  N* s     s->next=head;
1 U6 {$ }2 k6 y! i* G- Q     p->next=s;p=p->next;' p' x: c7 S* L5 n! z
    }2 ?5 F) w/ b; a8 E) H
    p=head;# u7 N3 ^$ k, {* {1 [
   for(;;)* @; D% P: e" H" J6 a  K
    {if(p->flag==1)( I9 W8 F& B, q
       count++;
; |7 z) o+ j* T7 j     if(count==N)4 J/ h1 [- ?2 O" n3 U: R6 M
        {p->flag=0;4 ]6 V4 [2 q( t/ _% S  g$ Q
         count=0;% X* w! e) _8 h# G$ ~
         sum++;}
/ s0 a( S2 Y0 [: L  G     if(sum==M-1)# Y+ |7 @1 o! D* j0 P
        break;
6 _' `; K/ z7 _) D- @; I     p=p->next;
; P) i4 h4 G% ]6 z8 z& r( u8 o    }1 B4 h8 D+ W$ V, @# N
    p=
7 l, w( T1 D( }0 z7 T9 G: d    head;
/ E& w- I# X4 t, M! T. r$ a    for(i=1;i<=M;i++)& r3 I; x5 }- K7 [# V; u$ j; w
    { if(p->flag==1)
) y+ g' i: E9 j0 l        printf("\t%d",p->number);
3 h' I. T' e) S5 a5 R6 B      p=p->next;3 u0 g5 c: K& F% V2 J+ z$ z! B4 q
    }* I6 w4 r8 c4 J; F; `2 {+ i

& j$ o  P. S, L2 e& K: d% m2 R1 e# M# s9 ?

3 e% h4 j$ H' U  X! g8 @}
  K5 E) K. a. j& s" G
第二种方法:数组! J; H! Q2 k8 |/ M2 F
#include<stdio.h>
, _5 b$ G. x  ^6 x" i#define M 8
6 u2 y+ p5 c# k+ G; v3 cstruct monkey
! K: n' e/ W4 f7 S9 p) k3 K) u' Z{int number;
( S) I; R5 d/ P2 O4 v9 h& zint nextp;1 H( i& ]5 v3 s; S4 P5 ]: M2 x3 `
}link[M+1];) D3 W: X) I, N7 v
# I1 m2 R4 Z6 [- t$ q3 n. ~* \
void main()4 M2 B* U6 u, L2 F3 K
{int i,count,h;
3 d! V: {# P% u; k8 o1 Ufor(i=1;i<=M;i++); B+ ]6 x3 j5 g) V7 A) T  |( @1 N
{  if(i==M)) b8 O" I6 y7 k$ e) p# C. {& ]
   link[i].nextp=1;3 [4 J3 m3 j7 p. h
   else4 m$ P( ^$ X  Y! {5 b4 l
   link[i].nextp=i+1;, [' }$ I2 z+ Y6 A# v
  link[i].number=i;
: N$ v+ v* r$ T" ~! f* D}2 |8 ^& O4 Y3 p& c
printf("\n");
7 \& x3 m& z, B: tcount=0;
% |" x( T" `: m; P4 Y: w9 Gh=M;. C- `2 I$ L. U; P' h
printf("依次退出的猴子: \n");2 ^  d9 x& m1 x# Q1 V0 Y
while(count<M-1)
: c  [4 I4 C: m+ \* y0 U' R6 r{i=0;
# D/ x3 u% m7 M; iwhile(i!=3)
; W3 V8 h; ?3 ^7 H; E: I& d{ h=link[h].nextp;
- |, W$ J' z& }7 [   if(link[h].number)
  `. I& d1 `  r. c. N4 {     i++;}5 t. L3 U7 \% s% ~/ Q. J$ o) q3 B

! W( `. f8 A# pprintf("%4d",link[h].number);9 _6 O* a8 h+ A/ `
link[h].number=0;
% u$ h! P1 g. {+ q4 X( Dcount++;
5 A& _! I+ D! G. k; @, A}
" m; Q3 r! F( G, f3 I9 x
$ _/ B" P4 f3 n  m, c7 E6 }printf("\n大王是:");* r: u0 X) ?) \) N: H
  for(i=1;i<=M;i++)
  K2 K4 L3 z+ I9 m: B  if(link[i].number), @0 N( M* T; x: ?4 n& f
    printf("%3d\n",link[i].number);: l- i  z5 ?6 h% Z& s( C

+ l3 D( m2 a: k7 @
2 J" ?3 e$ e- W6 R# b5 k}
, m' Y* r% B/ t! }: b2 w
第三种是普通方法for循环

: _: h' U, A8 @( f$ `* {6 T. `#include<stdio.h>
' I4 f2 q3 \, b! n6 svoid main()6 m! f3 O' z0 M1 [% @
{ int i,k,m,n,num[50],q,*p;
/ O, M! @& P* i. h/ g- n8 o3 s    clrscr();
; I; }0 |/ U1 l% [: I; p) D/ R# F   printf("input number of person: n=");( `/ r& L* X$ o
    scanf("%d",&n);1 e4 \4 b# N9 g4 g
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只: B2 E  K# A9 u8 t
    scanf("%d",&q);
- n4 L) h& j+ O   p=num;' L" E8 c! _+ V4 i# g
  for(i=0;i<n;i++)
- w( J. o: B3 j2 N! {1 M5 L/ @3 q    *(p+i)=i+1;
- }+ k- G: w; f/ C   i=0;% a# Y; E1 M3 y# h# i7 m
   k=0;
8 z  L! Z- m) W+ m  K   m=0;- h. R3 p' _8 l  Y, k
  while(m<n-1)6 L, D8 E2 o7 e+ @* E
   {if(*(p+i)!=0) k++;
. U* G1 r8 c* Q8 }& _- I3 h     if(k==q)0 p* t. e- w6 G
      { *(p+i)=0;
% S6 H) a" N; e$ }6 K2 H  E        k=0;/ e! f: C& d9 B; N( e+ H) |9 B! a
        m++;
3 V, I5 S# }/ i3 M      }
3 z9 N5 f. u% ^$ g    i++;# m/ A! Q  O% f: m
    if(i==n)i=0;6 A, J. U! A2 z2 b1 o. x( i! I# R, j
   }* o9 R* R+ @. N( [, x
  while(*p==0)p++;
. Y, `4 f2 ^" Q( ?9 U$ @    printf("The last one is NO:%d\n",*p);
2 `  I, `, ?/ W4 i8 e4 J+ \) N7 ?" K     getch();
( [5 G" H2 J5 H, a9 X8 j0 e$ v) L7 W5 H
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;  a7 ~+ ]1 T; ~: t) i" Q& h! a7 _
namespace 又费马达又费电
! D, O: B, {! f6 L. V% u+ L{& w9 K, [7 N# \+ m% t2 S
    class Program5 a3 z0 H) ^0 L) @
    {! a' F& [7 |0 W, F
        static void Main(string[] args)& B9 a) x9 {/ c* l
        {
; M" u+ ]! ?9 d9 W            int m, n;
, G# u' e/ [9 E+ V) o            Console.WriteLine("请输入数组长度");0 x) i" w" l' X7 }* b7 @
            m = int.Parse(Console.ReadLine());//m为数组的大小
& ]; H" [0 ^5 L! Z% s# g) b1 t            Console.WriteLine("请输入要截取数字的大小");
/ b7 v, b/ h  P            n = int.Parse(Console.ReadLine());
8 p6 k' n+ I6 C1 [6 m4 O7 |& B: Z9 W            int [] numw=new int
7 z1 Y$ X9 R6 n0 V3 D# N) N4 d; P2 ?: r
&shy;&shy;&shy;;
% Y" [& t* B! T+ m$ x            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
$ n& I5 T  _0 H            {
, T0 c0 S# I# ]8 k$ u                numw[j - 1] = j;
3 m6 |* c, E. W5 s- Y/ D            }
6 a# b3 [  Y6 e. _$ z* n            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!  G) r' _, g; ]; f( k
            while (d != m - 1)( x) ~3 S+ h8 U* j
            {
/ E% ^& D# E. {                if (i == m && d != m - 1)
+ Y. ?/ x- \  W  I5 U) c9 Q; Z- K$ R                {8 O: L* I. L& T' `/ _* \, S, j
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
5 w5 r) T: c3 D; J8 R# D/ ]                    continue;$ `9 J9 J( _  h  O6 X5 q1 o
                }. C1 S; h! c# r
                else
9 [$ K/ d  V& n4 B                {
0 k- U9 Q9 z- g$ R                    if (numw[i] != 0)
- w  m( b, F; H6 x                    {7 E$ w( u- ^, i7 {
                        i++;1 w. \2 ^% b9 b  E/ @4 \
                        k++;0 t8 s% X# `, Z6 d& n9 e) H
                        if (k == n)% p9 x3 H/ A6 z. p4 ]+ w1 t
                        {5 [7 d2 I& i' G/ |! O$ l$ v# d
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了# v/ m/ N8 Y. b
                            k = 0;
/ G* i& c  S' J9 Q1 H              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1! ]% [* T* ~% f, l* _, h9 r  m
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
/ \9 m7 p" F: s+ `7 d% o! D  W                        }" r# ~2 u- k/ P+ K' v3 f
                        else//输出暂时还没有改变数组元素的值. f0 \7 |/ l; i. A  ~
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);6 I# k- r& D6 H) t1 B# p
                    }
9 J" m' q2 m* F9 Y                    else
& }5 o% f) n; k. }; b                        i++;//数组元素为0,直接跳过,不计数。。。, H, M8 t" I3 w: K$ u
                }
' T, d9 Q  V8 `, N
; U$ o5 @2 e# q3 |1 F" R' j
4 g: W- c; a1 F. Y% e8 ]' Z" G3 V            }//结束while循环% i$ k8 s4 }' V* I8 o
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
. Q. k6 D- e7 z* [0 x" o0 J- E, f           / n) R. ^5 R" G9 `4 X( d
                if (numw[i] != 0)
. e' G! X- O- w* `5 A                    Console.WriteLine(numw[i]);
- c3 I1 m+ y) W/ y( }8 M1 t           
& M7 C0 ?4 i- o! J# h$ Y; h            Console.ReadLine();
$ H7 K7 V; X  h3 ?8 _        }/ {9 a  @6 I" _- h
    }. m: V* N7 a3 d8 r1 P
}3 j3 g2 I" Y/ ^: {, B! e& j
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
小甲鱼最新课程 -> https://ilovefishc.com

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-21 22:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表