鱼C论坛

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

猴子问题

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

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

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

x
大家好!
$ x, M6 n5 E3 D1 J这几天我在忙着编一个问题,我用了一种方法编出来!
: W- P# T: U+ N; h5 Q+ q: _$ o但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!/ x. l" F" P: `1 _: L6 b/ A: d: l" `2 n
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 . i- \1 Z. a& }. F5 V
) W8 w0 Z7 |" [  y- G( v& l' c

. p, J: w6 K, e
                            题目0 u% R/ D" t+ T9 O" Q
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
2 C% y/ W( H$ t& p+ h& F第一种方法:利用循环链表$ z9 ?$ I: _) y' t% {
#include<stdio.h>
8 W$ g+ y+ p1 T0 S#include<malloc.h>* U$ c. `4 ?! o1 D
#define M 8            //共有8只猴子+ H3 [+ n$ Q' p4 U; Q
#define N 3            //数到3只时退出第三只
$ G2 p; Y' q- _$ Btypedef struct monkey: K+ E9 k, s+ x9 U# S
{int number;
2 h; e* K+ Z) g# X) e. T  E, j& Jint flag;
0 o3 M- U$ r* Q% |. F9 @6 Ostruct monkey* next;
; n( U3 S$ S, s1 K) _$ L: H/ R, e}MONKEY;$ C+ C9 b9 T; }5 c; m8 P- o
main()
) `+ e6 C8 p+ @' r& N; X( O& B) E{ MONKEY *head=NULL,*p,*s;
1 g7 K( @+ [, H; a5 E% @  c  int i,sum=0,count=0;
3 x  L. |! o9 C  @& S  clrscr();              //清屏
0 s! e. Y2 h: b: @  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存# o' j6 y' S0 d- M- U4 E' y) S
  p->number=1;p->flag=1;" C1 j- u6 n% Q$ C# x
  p->next=head;
! y. q! k# O/ A8 _  head=p;' V7 j) c1 H* N/ \+ U
  for(i=2;i<=M;i++)
# b6 Z7 j$ _- d1 y0 H4 D( r$ d    { s=(MONKEY *)malloc(sizeof(MONKEY));* ?3 n/ z/ D% Z4 o# ^  K
     s->number=i;s->flag=1;
% T) }$ g! p& B3 [$ |     s->next=head;. C! ]; Q5 T5 Y# r; g
     p->next=s;p=p->next;" y7 h3 P; M2 {1 Y) ^9 [1 C1 p; {
    }
0 s5 ^6 |8 p2 d0 F8 H4 f/ ^  K    p=head;
; s# p. U" U1 C& ?* V  u   for(;;)4 m  M: j8 w# c& I- t- ?$ i
    {if(p->flag==1)
1 Q- t: {+ y2 b: r: _       count++;
6 j! C- e8 X" @4 w4 u+ c     if(count==N)  ^2 O1 }" S3 T! Q- _1 K9 }
        {p->flag=0;1 d# t+ @5 Y5 K
         count=0;
( k9 U7 H2 I* m5 j* C7 a2 \         sum++;}
. ~* {8 b; Z1 u( u- [2 s$ v     if(sum==M-1)9 P% x1 v* _- f3 U7 r
        break;( D# ~. s1 D+ w1 s
     p=p->next;
$ k& W! d$ U1 \6 x2 S    }$ T8 C) W# i; K  _; }# x  f
    p=
2 W5 ^0 e5 b8 l    head;
. H/ Z0 _. N$ X3 q    for(i=1;i<=M;i++), @3 l" Y0 _# O# S0 J
    { if(p->flag==1)' d& ]1 L; ~: L+ E9 W6 W8 n
        printf("\t%d",p->number);$ ?' f8 L1 a/ J* A1 n
      p=p->next;* _9 ~8 S( t) @6 t
    }
1 j+ e8 l: e2 \. P4 k2 U7 P9 q  A( D5 J. z: t- h

% H1 N& o- a+ {( l3 ~/ I5 F7 x* Z. S. S' ?# _% P
}
4 v1 u( Y9 |8 X8 x
第二种方法:数组( j0 m' f2 y) J2 Y# B  j
#include<stdio.h>
5 ^2 c6 ?3 w( w- V! H#define M 8
. l2 O6 b6 {5 d& s" estruct monkey+ m2 M) z" G, ]+ u) T5 i" R' H5 F
{int number;
6 g) `6 e/ d6 Aint nextp;
# c. L- c" X% @1 a}link[M+1];9 |* o9 K; e" E+ h( m; U+ u
/ D8 ^. Q5 B" T- c
void main()- f9 h. D- o. V( l1 }
{int i,count,h;5 T* F# ]4 y3 S/ i
for(i=1;i<=M;i++)0 \0 r- A+ u( U7 V* F
{  if(i==M)
2 ^0 x; ^8 J3 ^& w8 H: j; z   link[i].nextp=1;
2 h" l' f7 N" X; z2 J   else
# l% K) ]* s5 H. Y# i3 ?3 z! H& W+ i   link[i].nextp=i+1;; _2 Z5 @5 `  l6 H0 k6 L
  link[i].number=i;9 A0 ^  z" ]- C2 V5 r! V& Y
}
. K- R8 Z' ]  v: ]  lprintf("\n");
" \7 b# r" O7 O( o; \/ y0 Z: dcount=0;
6 Q1 ^' P& P) N# T' r6 ~; ]h=M;/ ?# _8 j1 u, q7 d/ A. Z
printf("依次退出的猴子: \n");
" f( }% b6 ^" L# O8 e* hwhile(count<M-1)6 f/ L" n" B) L( D' V9 V) j
{i=0;
$ N, r4 _5 M" r4 rwhile(i!=3)( y/ N: h2 {, f+ u' Q
{ h=link[h].nextp;" h0 e+ N  y# J, e
   if(link[h].number)2 M- B4 s* a1 E- S) `
     i++;}: K$ \! r* I6 o. `

! N' ^9 U, d5 C. e" _6 xprintf("%4d",link[h].number);4 s9 }+ v" x4 ^# o! [: X% c
link[h].number=0;2 D) n1 H, f# R0 W8 @
count++;. z  a, u: T+ [3 N* C; H
}" j  w/ a0 m1 S

/ b! J6 E" `  n4 j0 l% ]: ?printf("\n大王是:");; q  b3 s/ S! {6 o* ?
  for(i=1;i<=M;i++): h9 u6 j0 K! A* P$ k/ t& C
  if(link[i].number)0 F6 v: }7 V1 H' P$ b& A
    printf("%3d\n",link[i].number);5 _  x/ F$ T3 d4 e& K, s. l4 S
# Z* Z+ u* }# R2 ]

4 F" S1 ]! {8 F5 q( T}
0 c# y  b7 m6 {' X9 ?$ K; W1 F
第三种是普通方法for循环
( W  I$ A9 B0 I' }; r# I" H
#include<stdio.h>$ X- I0 |" A4 d; r( `  ^
void main()
# h( A/ f2 m( G5 o5 q; K2 o& n. a{ int i,k,m,n,num[50],q,*p;
8 C, {0 U6 N7 e6 {1 t2 \    clrscr();
/ d6 _9 X* l$ H5 H   printf("input number of person: n=");3 y" ^7 V4 l- ]8 ?+ O  S) |- |. Q! W
    scanf("%d",&n);5 T; u0 g! w" s4 Y, ^' i$ Y% n
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
/ O/ S, [: M9 ^4 ^% y# ]- H3 c3 @& W- x    scanf("%d",&q);
/ J% g$ J, k5 a# W5 R* x' C3 d   p=num;& @- v& O# P1 M
  for(i=0;i<n;i++)
( _( x* s8 R3 @& D& Y  I% P5 `    *(p+i)=i+1;
9 w- s: Q( b1 i  y* o2 q- l   i=0;
9 y8 W' i7 I# ]2 y   k=0;
1 g7 G, b! q4 O4 I   m=0;9 E. Z! X2 Y9 {; y1 d3 Q. e: b
  while(m<n-1), B' N. R5 r$ z# f$ f9 j! U/ o3 ^
   {if(*(p+i)!=0) k++;! W5 R2 ^5 z2 R. x# v( c- K+ F
     if(k==q)
- e. G2 C# D% L$ [      { *(p+i)=0;2 P. D0 M2 C- y+ o
        k=0;
, t+ `( c% A) |  C- e; c        m++;9 _! a2 R; b0 w6 L% h1 c. e3 S
      }
, q5 r) L' B- b' w/ l% R    i++;3 a% B  K; Z7 K7 H  [8 S, Z  \
    if(i==n)i=0;, w/ q9 w8 v1 l% m8 f% j  R
   }# ]" p' L- }8 Z/ y7 E9 e
  while(*p==0)p++;
, G7 W3 l5 d; J* _0 m' P4 u: w- T/ H    printf("The last one is NO:%d\n",*p);
7 l3 N0 a8 n- T     getch();& _8 D0 x1 C+ W) o$ P5 j1 b
8 d! ^, ^* F1 S! u# Y3 a
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;- o4 O/ Q+ K9 J
namespace 又费马达又费电6 {. R5 d: H) ?* l9 K2 i
{
5 |8 Q  m4 K0 Q, F' W2 i8 Z    class Program
1 d1 x4 Y& w7 K5 q' @. B    {) Q: j4 d" j. X1 x7 a
        static void Main(string[] args)
" G4 q9 N, m% a) X) F/ T$ b8 C        {. X  K9 C: u4 [8 ]
            int m, n;
1 w7 [; Y; g* S: M# |! z            Console.WriteLine("请输入数组长度");. P  o: X1 F" x. }: ^
            m = int.Parse(Console.ReadLine());//m为数组的大小- T9 J0 W9 H+ u1 x; O' A
            Console.WriteLine("请输入要截取数字的大小");
# J6 ^9 w: ?- j            n = int.Parse(Console.ReadLine());, h/ [- ~/ _- o# i: F- X
            int [] numw=new int; P4 c! M8 ^) i+ Y

  G; l7 ]4 j) B! s3 v" T/ J5 }&shy;&shy;&shy;;
" U6 g  R, s8 y/ X1 Q3 l! d" z: }            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数. g) l3 q9 b+ D/ \$ ]( D/ }/ I6 v8 s- g
            {# m, d% p2 A% Q" X  V7 ~3 l
                numw[j - 1] = j;
, c- z9 ]" E- @: u. G            }% V. p: ?- w0 j, ~' }- V9 E
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
8 S% T: C, A: j# A            while (d != m - 1)/ j, _+ W9 d- _6 @7 b  g
            {, u* u: f8 N6 W% q
                if (i == m && d != m - 1)
7 P( k% t( v% u# c                {( Q4 H. {* `0 |9 a
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
6 @1 ~: M/ C) }% N7 K                    continue;
. q/ o3 K& M  @. ~4 B                }6 s& X+ X' I, a
                else
" F9 k3 |9 r0 }5 o, J; E                {
1 j% g7 m9 @& T: j" c: x5 E                    if (numw[i] != 0)1 e! }) O  A& t8 |! i0 ]6 F  q7 I
                    {0 R6 i! a' w4 j
                        i++;
0 K# V4 X( f" A- b( }                        k++;
8 e- T! Y' _" y/ B# c* o                        if (k == n)) T* V5 ~3 [% @$ A/ `
                        {
: |! Q  g1 X& T" ?                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
( y5 r: e3 R  o3 w$ n                            k = 0;
- o4 X. ?, h. o! w$ O/ ]7 R1 T              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
0 ?- g) D" a7 c8 q; H                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);. ]* R* W/ ~! h$ C' E/ A. c. [9 N
                        }" F* q$ `: p# n7 J) ?" p  }# k0 ~
                        else//输出暂时还没有改变数组元素的值
6 ]( {# I2 n1 Y- ^/ Q8 I                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);8 }- t3 \  R8 Q" l$ R
                    }
& Q- ^8 |4 A" m                    else
# }: c: r4 S/ U) y& m( _5 c0 T                        i++;//数组元素为0,直接跳过,不计数。。。
, H; t. N1 w8 j2 u) i                }
1 @) {1 I/ L1 ^: U4 W& \# ~
; K% O& _2 a0 Q  W& h9 j" L9 N' K3 D7 h4 R1 m
            }//结束while循环+ n9 q0 r) Y4 Y! g6 J5 i
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦) [6 h! o) F! H" [6 j! J
           
" X3 k* O9 |5 W4 J2 u) E                if (numw[i] != 0)
; w' p' x% ^" K+ v6 ^                    Console.WriteLine(numw[i]);
* Y# Y. }! @5 O4 [4 h+ ^3 I           
9 A# k3 b& T8 e2 B4 Y3 T" G            Console.ReadLine();
* `2 ^: U( v8 X0 Q        }" e# W1 e; e4 ]1 e2 t1 e
    }
, Z8 k+ o9 S$ U+ W. X}
0 M( V$ ^% ~; ~- D1 J+ i
小甲鱼最新课程 -> 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, 2026-5-28 23:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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