鱼C论坛

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

猴子问题

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

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

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

x
大家好!
/ q0 n* X' P! ?) T; R这几天我在忙着编一个问题,我用了一种方法编出来!8 Y' R( z7 @8 \' L% f& @
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!* M, z: z5 V# R$ O7 f; F$ x
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 * }* ]: M! `2 a! o: o0 f" f5 b% Z" o
3 p8 Z! Y- O  L8 p& ~6 j

, D( l1 O8 K# {; K, a, h/ f5 r
                            题目
2 f; }3 h, E. z  A- I$ _$ ?山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。' ?1 \+ ^3 P% @* J
第一种方法:利用循环链表# _: \4 ^& P' o' y8 ?3 r
#include<stdio.h>
( ?. t4 D: c! e4 y1 F#include<malloc.h>
* E, B2 h' [  }, h' A' {3 w#define M 8            //共有8只猴子0 C6 \: t. h% ?2 j6 Z
#define N 3            //数到3只时退出第三只
/ ^* L1 m0 E& f, s; qtypedef struct monkey7 L# O3 {0 X/ x! K2 m7 s8 x
{int number;
: s7 o$ s) j3 p7 x" Wint flag;
, W$ |, @) p- x; z" E% \" Cstruct monkey* next;  z9 B6 y) q- b" L5 k( J
}MONKEY;' b$ n; h8 w0 X
main()
5 b; X$ T  R  e3 m{ MONKEY *head=NULL,*p,*s;2 d1 o( W0 }/ Q9 _8 X+ h- `
  int i,sum=0,count=0;, T6 P; h8 \( x$ A) B$ F! r
  clrscr();              //清屏
$ m0 d. |% }* Q5 ^  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
8 @, C% Z- _) X; _* _* |  p->number=1;p->flag=1;
  c0 F8 {. I- {& P6 d1 P  p->next=head;( _% ~5 s. X: _
  head=p;0 q$ B/ R! T! ]& C9 [' A
  for(i=2;i<=M;i++)
- R3 s9 ?8 G" x! {$ G    { s=(MONKEY *)malloc(sizeof(MONKEY));
6 [7 E; w3 O4 n8 a  t     s->number=i;s->flag=1;
$ P3 ?% F' d* p" B" e     s->next=head;
, B; ^( D. G( ]9 l: ]' r- X     p->next=s;p=p->next;
' E+ {, b8 t" {/ f( V" E    }
# J; d6 f; ]* n6 v    p=head;
$ L& ~; t& s! q/ G- y3 e   for(;;)+ k- u7 D8 ^  R
    {if(p->flag==1): @; w, v  Z; ?" L0 `
       count++;+ _4 o$ t4 S+ c9 [1 f
     if(count==N)/ ?: m% f. q5 x+ u9 z2 w
        {p->flag=0;
  j; ^6 H1 q& ]' F. ?4 w         count=0;8 Q8 z  _1 ~8 w* R" J+ r& e
         sum++;}! b7 ?9 q4 ~, s1 ^: x- C$ L7 y) z& W+ ^
     if(sum==M-1)
# w9 |8 d" \  K# F# O* R& U* e        break;
5 s) L0 T1 a) G3 Y. Z* H. B     p=p->next;
7 ?3 R) j  @6 ]9 G    }: q) e) C' @/ O) o2 b& K7 c
    p=
" X. `' F& i3 e4 S9 ^  B    head;6 F: z& `7 w5 e) X0 \1 m
    for(i=1;i<=M;i++)% c/ @& J$ s' R; t1 C
    { if(p->flag==1)
8 ^3 R! L+ C( X0 O        printf("\t%d",p->number);
0 ]. w0 i/ ?( D. M6 K% z      p=p->next;! H9 Y2 d# G" T' n, y, W
    }
$ J3 m& H1 M; G& p& L8 M
3 E/ w$ v+ C3 E# w
. B% h. _: z# ^& l5 S
0 d/ s. K2 ]0 R. D& m; z}
0 |6 }  ]+ m% I7 x% W
第二种方法:数组: q- j) ?" z7 k" M2 R3 A
#include<stdio.h>2 z) I$ t1 ~$ p; d- o
#define M 86 N5 ~/ x+ c) ~# \' f; k
struct monkey
2 I; t+ t4 {5 y' }{int number;
3 _/ i2 _+ s: u+ s. Zint nextp;8 ]/ |) \8 u' }- m
}link[M+1];
7 j9 Y$ x. Y" S9 W/ }- ?& U! E
) i' ^- n' J9 V7 R# dvoid main()6 r7 v6 F1 R  |
{int i,count,h;; d! _7 W4 N! n& U; N
for(i=1;i<=M;i++)
# d3 j. t& L/ R- x+ Y$ L{  if(i==M)+ M( z# t, t& S7 i3 ]# a- ]
   link[i].nextp=1;% @* D7 q  @- W1 D$ Z
   else$ s3 o3 B4 z* g+ N3 R+ z
   link[i].nextp=i+1;
& x* d6 ]9 d3 i5 H  link[i].number=i;
: K* a: t6 U* z}
  V' Y0 {6 [  P0 [( l4 C6 bprintf("\n");
- V0 w8 ]0 [; C( y+ c/ h, u! z. vcount=0;; J& c9 ]3 Q/ y( v
h=M;
* B9 d" N( r  i( b8 b  cprintf("依次退出的猴子: \n");
/ G! ^- t* H6 C# ]4 Nwhile(count<M-1)
. l  g9 g& ^$ U* ^{i=0;
; d1 ^! E: a1 ^) I7 E! \while(i!=3)
: z8 D$ b; }" O{ h=link[h].nextp;
  W0 V0 P5 i7 ~! ]3 ]* j9 W   if(link[h].number)/ _# \9 E9 A. Q$ k1 t
     i++;}& h, P6 @0 Z! ^: u

) a4 k4 T% d) k; v) Yprintf("%4d",link[h].number);
/ Q. d- E, K% a8 b& E, s9 _" qlink[h].number=0;* Y: l5 c& t6 |, ?+ Z9 _
count++;1 P1 M8 Q9 p' s
}" y* @2 ~( k2 g8 f/ ~
: X# X7 P: x+ h* ^" o% d6 Y
printf("\n大王是:");
! J# R/ Q- K( C. q! b& P9 N2 b  for(i=1;i<=M;i++)* p) B: |: l! C- S6 p
  if(link[i].number)
, e* U' K7 h( a    printf("%3d\n",link[i].number);
9 u5 D. J* m8 Z1 D  q4 X
2 y" `* d/ R( P; I  ]7 ~( P# ^3 z9 E7 J6 V# @
}

6 L' `, ~0 v: [% f' N第三种是普通方法for循环

1 `/ n$ o/ [3 o1 P6 G#include<stdio.h>
& x- D3 D7 R6 [$ e: w6 Hvoid main()
, z) K. r* E7 ~$ P; p9 s{ int i,k,m,n,num[50],q,*p;
( I7 ?# h, C+ G* }    clrscr();; C& T; {6 ~7 f$ \. S# |
   printf("input number of person: n=");9 E7 Q  K% f. K) ?# e
    scanf("%d",&n);, Z; B: ], J/ w. f
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只; g3 u" r2 i. M9 l- i; L6 R
    scanf("%d",&q);
1 F  y- G* v# W  \3 X   p=num;1 ~' y0 W4 m) [7 a! h& U( S$ C# L
  for(i=0;i<n;i++)/ L/ p! R1 y. Y8 v& @7 a
    *(p+i)=i+1;' ^( g: D7 O/ z+ I5 _. g8 @, g0 m
   i=0;" S% f4 p" m4 a. M5 E' B* k
   k=0;
  p5 j" j0 t2 C4 M4 V5 W   m=0;& G7 i/ W( l% y/ a8 G5 s3 F  U
  while(m<n-1)+ Z: v0 D3 L2 {  {8 O0 Z; ~" `$ |
   {if(*(p+i)!=0) k++;; S4 J6 v8 ?9 S% T! H% R$ {* h5 u
     if(k==q)( P8 {! c6 J. K' Q& A
      { *(p+i)=0;% P# x% r- v; l0 K$ ]9 E5 r
        k=0;6 C9 m: b9 N3 `# f. C( i7 s
        m++;: d. h) ^. O, l2 p
      }
+ \; L' x3 z/ i* Y6 ~    i++;9 @# D/ A: m9 i* B# A/ ~$ Z" H
    if(i==n)i=0;
* |% ]0 G/ {% e" E   }
: h' l0 x, L# s, l  while(*p==0)p++;
! u' f2 H$ [6 c! I& Y8 H    printf("The last one is NO:%d\n",*p);, H+ _; b1 {; }6 t" e
     getch();( l6 ^/ o' X8 N0 U, U

2 `4 r0 C; X2 u0 {. w0 [}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
7 N& j7 z# w# r5 y5 z) `! \namespace 又费马达又费电
1 O% m% V% B! X8 f1 U+ k. L{  r) d+ {+ B# W
    class Program5 v. F! B8 B2 h6 |7 [1 M
    {
, T1 k0 o$ i. x% Q        static void Main(string[] args)
/ i7 _! L3 I- i; M' R# [        {
% x0 M' ~8 s5 ]( {, M- ]            int m, n;
: ]4 L! a/ S* Z/ L            Console.WriteLine("请输入数组长度");
3 V2 t# y% w( F# n! Y            m = int.Parse(Console.ReadLine());//m为数组的大小
: |& d" R6 F2 e4 ^5 L5 p            Console.WriteLine("请输入要截取数字的大小");
( |6 g1 O3 ~1 J            n = int.Parse(Console.ReadLine());
3 v: S9 W: d  W' r! D( l            int [] numw=new int
; i, V6 k4 b5 T0 C# x$ N3 U
6 S( m2 w( M: ?2 i; N) d) w&shy;&shy;&shy;;
& S( A0 I  X9 t: O- n* |            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
. Z, H. j* ^% L( H4 c            {
3 T9 B3 ?6 ?8 a' e" {- Q/ K% T                numw[j - 1] = j;* T* g9 @: _: w+ ?% M7 X8 z
            }
3 S) L4 D4 S7 h, U+ i8 C' l$ a/ ^& ]            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
2 M. m! m: C8 T6 I            while (d != m - 1)
3 p, {% r: \+ e# m6 u: [            {
9 Z2 D8 |' G1 W5 A4 }                if (i == m && d != m - 1)
5 {. [% O' Z6 V# W5 Z4 x1 ^                {$ Q2 g9 U$ @/ C! p! q$ F1 h
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!0 h1 R1 [$ d: y# r$ [$ `
                    continue;7 Z% j6 r. O2 N3 z3 I
                }
7 A# w, i% L+ F' F: s                else3 a. z+ j3 n  G: \  A
                {: R6 ?1 L& t9 P, B, U! \) e
                    if (numw[i] != 0), P! N# X" l% L2 C5 k, @
                    {
& v$ \/ x4 B0 ]3 c, M' L# J7 [3 z                        i++;
! c5 i1 K, r+ n( k/ F/ K: t$ X) x1 p                        k++;
- P3 Z3 d0 ~+ @0 U1 d4 q                        if (k == n)/ z6 y; {* ^9 b9 u
                        {
9 I/ F7 v( T' b$ F* M4 e' P                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
2 W( u+ [0 L# ]/ w                            k = 0;4 ?0 J" R" I3 {% j* W' [: R* \# ]
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
- i7 _! l/ c% H% D1 p                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);. G6 V$ r: i; u7 b: f$ O2 E
                        }. y) L2 T% j0 T
                        else//输出暂时还没有改变数组元素的值3 }3 N0 |% L% E( |
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);+ |& [1 E; T( T6 S
                    }
2 n  V, J4 v6 H9 n                    else/ j3 U/ w4 ]0 D3 s+ ^
                        i++;//数组元素为0,直接跳过,不计数。。。
) F- t: Q& e# p& ]8 g                }
* `% w! ]& v  P5 w) M; x , [/ B8 i7 Q/ E' h5 j

2 `, K2 f4 V: ~- ?# a$ w            }//结束while循环
0 B6 ~8 C" G9 Z, i/ u' N- x6 j2 P+ s            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦4 q; F  b! O: {8 y: o2 T
           . T/ d; ]9 V1 _# |3 f$ R
                if (numw[i] != 0)9 c0 p. R/ g" J% J; q
                    Console.WriteLine(numw[i]);
8 d2 }( Q: b5 E- N) j           
# h. W, j( G4 k% a            Console.ReadLine();3 t% ^: H3 y6 J
        }8 ]( ^, O" Y' g# T" ]" h5 `& ?
    }* z) O$ [- T5 W* E
}
; ^1 I$ b0 p4 y& J) {" w; e6 |
小甲鱼最新课程 -> 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-6-30 09:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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