鱼C论坛

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

猴子问题

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

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

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

x
大家好!
7 }" \5 ~6 L" x: n+ \; H这几天我在忙着编一个问题,我用了一种方法编出来!
6 J+ _9 p$ I+ I: I' c3 d7 Q但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!7 m! g; c4 e8 e2 @6 p
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 6 K$ D* x% v) O2 [' j; P9 A  q

8 }' f  w: q7 q0 {6 N8 ]1 L% z' o$ _1 X' E) Q2 {! U; |; l8 J
                            题目
+ U9 F# c8 ^: U7 g; Y山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
% ]) X2 y4 c7 o第一种方法:利用循环链表( g2 r) N+ b* Q$ ]1 j6 P2 S' U
#include<stdio.h>6 I$ [. e& d& b  Q; H' E
#include<malloc.h>
$ Y( B2 ~; x! F' o# i. F! ]#define M 8            //共有8只猴子
8 @; z. B1 ^6 A5 F#define N 3            //数到3只时退出第三只" t* A4 p) D. A/ H! C' V& o
typedef struct monkey
1 G0 q0 H- x; K; |{int number;0 q+ u+ ]2 R1 _  ~( ~
int flag;  b- {3 V% k% J: X1 d
struct monkey* next;0 I# {0 X( T' K! d6 ~2 P2 B3 q
}MONKEY;
, w, D) {# l: e2 |main()
! l. Q# l" u* b; A5 C{ MONKEY *head=NULL,*p,*s;
% a% y8 a. I& F) w! C  int i,sum=0,count=0;
1 w. Y* U- i$ b5 b  clrscr();              //清屏+ E# H/ Q, q1 i6 q6 ?6 t) k3 T& H  K
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存2 @. P% P1 G$ }; Y, m+ e" m( Q. f
  p->number=1;p->flag=1;& ]0 I3 b. e$ F% W5 e$ u
  p->next=head;4 R( P8 m" v# e' p5 G4 u0 x- ^- [' w
  head=p;7 v7 d9 Z9 X/ K, m1 ~# H
  for(i=2;i<=M;i++)
4 r! l- j/ A1 F6 ^; P    { s=(MONKEY *)malloc(sizeof(MONKEY));
3 K- W) r9 @! u, C3 [: c1 S     s->number=i;s->flag=1;* D% Q; D9 }6 {
     s->next=head;$ G1 a% Z9 Z' b8 [- z6 e3 a
     p->next=s;p=p->next;' F/ F: N# s* @0 R3 I( w
    }
, [, b+ T1 J6 W' \! Q5 A2 O$ |1 l# \    p=head;
3 q: O' T: k0 F1 o4 s5 Q$ h5 h$ v   for(;;)0 P/ S0 Y% y) ~
    {if(p->flag==1)
  N: S1 c1 X6 b  t0 B       count++;
1 w6 x6 e8 J( N7 m1 K: e     if(count==N)
7 H) Y4 t! [8 w! J3 p        {p->flag=0;& d: P, R9 A5 R! s% V9 g
         count=0;4 J5 U4 X- d! T: P
         sum++;}
" P/ T$ o& A7 G  ~     if(sum==M-1)
4 J9 I/ g3 k: M        break;7 k+ P: R& v7 _! @2 z" h4 F
     p=p->next;1 h. t$ j) `# S" ^
    }" B7 Q- A* R7 M# {7 B5 W# a
    p=
" G! l7 v5 z4 I5 B    head;
+ |# [$ g4 Q7 L    for(i=1;i<=M;i++)
- B+ Y% }* |& U    { if(p->flag==1)
6 y$ g4 X: g+ P( w$ v        printf("\t%d",p->number);' j; R* {. u3 @  z
      p=p->next;8 Q/ f* Y$ k# D
    }
" C0 s. @0 k0 Q; T7 M$ }
; o* |9 J9 T5 S& K3 o  ~& c- o' [, @# ^9 I$ {. v& `

" T( F( a; y& H  D0 l3 g}
, c; T" p+ ^9 }0 G" D  ~
第二种方法:数组
( b* A# V, h2 c; b#include<stdio.h>0 Z4 r9 F2 f0 h; B  i
#define M 8
+ y+ s  y* A2 A& `1 c$ n% tstruct monkey- N! V/ e+ D2 |- C( K
{int number;
6 }2 r/ _# [5 J  X3 ]! `int nextp;
+ f1 Q( n& F3 W9 W5 @; f}link[M+1];
( S5 u( B% L; ]' S, D* d8 I* @  M! ^
void main()
( N& M1 M, [! f/ r5 R{int i,count,h;
3 V. Y$ l5 `. x& A7 w& afor(i=1;i<=M;i++)" G1 o0 M, p7 ?5 X
{  if(i==M)  \0 g7 B/ R. Q+ s
   link[i].nextp=1;. W3 T" h6 h" R+ d' c" g0 i
   else& Z) V( h) G1 [3 V) H7 c
   link[i].nextp=i+1;1 e$ u& A& ^: D! I- s6 J1 ?
  link[i].number=i;6 ~- D3 `* J+ N& j$ K2 Y
}
# \2 s6 D2 p5 [  s$ b( _printf("\n");
: W' {1 W8 h; y8 Ncount=0;
; e: T6 I+ O( ~* w8 I# m6 Ih=M;
' t+ D# Z# ^1 y9 _5 M9 h) f9 E! M  eprintf("依次退出的猴子: \n");
% x# }2 R; s* k; A( |2 owhile(count<M-1)
6 Y  z1 X& {3 d! i5 S{i=0;" e2 @2 f  n% l0 ?1 k5 O7 [( O
while(i!=3)
/ k3 i: \3 K9 K% H6 o& w{ h=link[h].nextp;+ s6 H& }- M- w) D1 C
   if(link[h].number)8 a6 q9 L- |8 J- q1 M( S& S" C% A7 L
     i++;}
8 D6 S: j0 W  W" S  W/ P
$ [# S5 E2 V! d& l* j% `printf("%4d",link[h].number);3 s6 V* C; i9 |+ X) h* K2 y
link[h].number=0;0 G: y9 D3 A. Y) |% g
count++;2 H1 j$ Y1 F$ ]' {& u# e
}
3 C) M, V6 t4 H
3 l) H  a; c$ Y4 Z& ]printf("\n大王是:");) H" }( c- ?, B  h6 m* C
  for(i=1;i<=M;i++)
) f! a* C. B, v  if(link[i].number)$ J* ?" y3 c5 u9 E! `: E
    printf("%3d\n",link[i].number);. _, |+ n0 [6 G
' t5 W% ~  n$ M' N5 U/ R. [
3 E- M3 \% Z: r- v2 T5 M  y0 F
}

; T: `6 x% V" E  [, R% R# a第三种是普通方法for循环
4 g4 s# d* o! T- i1 {2 s( m5 |
#include<stdio.h>. r( g! I. L! c8 _
void main()  t, f8 W$ |. ?5 y0 a  q
{ int i,k,m,n,num[50],q,*p;( E! V/ |$ ~1 g) P  k* {1 u
    clrscr();" @1 |$ z* q3 F  Q5 n
   printf("input number of person: n=");
$ o+ h2 U" z5 g: k* k* T    scanf("%d",&n);
# o/ ^4 |7 W+ Y0 e; aprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
( L+ b  J0 s$ ]  p2 q7 k: I& ?    scanf("%d",&q);
, @6 {1 e. y: {3 [; I9 h   p=num;
( C( d! _4 x' r  for(i=0;i<n;i++)
% W  C3 R: ^# ^" t5 y, [, r# ]    *(p+i)=i+1;% A. A, ?1 A: ?% Q, i# s- l% R8 I
   i=0;# p+ _% a# X7 c1 k0 V) Z* O
   k=0;8 b+ R0 y1 a  O) J+ _
   m=0;5 U' f5 |' E2 W7 N/ V6 E" j0 p; d
  while(m<n-1)
. P! N8 k1 V: |$ Q9 n  m' `   {if(*(p+i)!=0) k++;
* S0 D: H+ m! Y& v# z7 S     if(k==q)
6 }, t- H# `! N) P+ r  y      { *(p+i)=0;0 P& m+ C- p; H. `+ [
        k=0;
- y5 y7 f" l: ~" d4 t+ R        m++;/ W, g2 J8 h4 ]1 _- q% ~
      }
% C( Q$ b1 W' R$ C    i++;
, K: J& Y3 z' Y: z+ V    if(i==n)i=0;
# Y5 ^  v, o. I& L2 P! U   }
9 N3 W* X* h: d: v  while(*p==0)p++;
3 P2 `, y0 L, t  k* ^, ~' @    printf("The last one is NO:%d\n",*p);
$ M8 x$ v: ?. n* r% `5 m     getch();% m) Z+ ~- O+ ]# K8 d5 |) @( e

1 f# Q9 x+ q) {}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;6 H0 e3 {1 D+ o7 Q* X  p( b
namespace 又费马达又费电  b4 `$ i" r; W, y7 K% _
{
# G2 v+ M' Y- J- E% F3 |    class Program7 S& }3 J+ `; w3 J) h
    {0 M' {( ~' K/ ?* w1 N. B" J) X
        static void Main(string[] args)
5 F" X3 e* G* T/ c, ^        {
, O5 Q5 g# b" |5 M" o            int m, n;
, _& o- J% f* U            Console.WriteLine("请输入数组长度");
$ I5 q8 x$ _! A4 i; H            m = int.Parse(Console.ReadLine());//m为数组的大小
( A& R8 p) B. m            Console.WriteLine("请输入要截取数字的大小");
' }3 F2 s0 Z" s/ M' l            n = int.Parse(Console.ReadLine());/ a' r* `, s( \
            int [] numw=new int" H) H5 Q$ G# |6 O& ~) y, [  T

7 H9 v; t' p7 F+ b9 V) I. U&shy;&shy;&shy;;" V0 S' x, d4 m9 W  x
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
0 o7 ]5 i  j) p- \+ O# U            {
% J7 P9 ?( j3 L% ~7 [9 `: _# c9 i* a                numw[j - 1] = j;
- l0 J9 v* l6 U, a6 k' w            }
% H% A2 p9 X% e5 O# Q; n            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!5 w8 t0 |' w0 o
            while (d != m - 1)
9 Q& q5 _8 U8 C$ U' _            {
- S9 r8 u, V6 P+ n                if (i == m && d != m - 1)' ]; A: p% M. A4 D4 }( [5 l
                {
6 q. K/ z$ w# U, m                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!2 l" I# {/ D/ _4 j0 M4 @) h
                    continue;
( T4 G7 _$ a/ P4 S5 \9 j, \                }
( S( P. }1 C4 @" L% E# y                else2 w0 v7 J/ Y" B! R; w2 n
                {4 R; n- O; G  x: [) f0 L
                    if (numw[i] != 0)3 ?& H4 c' N( Y! I( U4 p
                    {
6 S, k# x' _* C7 e3 n                        i++;
  ~  E  _6 `* P. j8 l                        k++;
; N$ ^+ g. m) l& F0 ^' Y  i                        if (k == n)
8 _& V9 u4 E. ~! m                        {
' K- b7 v) R# G4 I( o- Z2 e& ^% M                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
/ Y7 [3 Y3 |7 s! i" m                            k = 0;6 T8 @$ I) g3 S0 O) f3 H
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
, ~6 ]  m  \7 `9 s                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);+ O* i3 W0 l& x5 r: K% H
                        }
0 }! D' x: M  Z1 u) S0 E/ x                        else//输出暂时还没有改变数组元素的值/ y! [+ i6 Q: Z" x/ k( D  o' F( S7 k0 a
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);) U8 |" F; U0 T3 ^  L: R
                    }
) C- F- H, z4 z% O                    else8 y, @4 K( R4 ^' U, V; L: q
                        i++;//数组元素为0,直接跳过,不计数。。。
3 N9 d4 k% v% ?, k  l4 ?6 |! k/ r                }& ~3 P5 k; {/ @2 Q
5 m( t0 m+ i. c6 m4 x
, p8 ]3 U1 i7 S9 g" E
            }//结束while循环
& h2 i  B4 ^' i. M4 D0 X1 w            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦3 j6 s* N* l- B
           + U  b. }# T( C6 K6 C/ ^8 ]% ^
                if (numw[i] != 0)7 W, |# G1 S" @8 B4 ]
                    Console.WriteLine(numw[i]);$ v" C$ d+ M7 [5 ^$ T
           
' x, ?7 ?: B  i0 ]            Console.ReadLine();* \2 H8 t' p- `, Y9 J% A! u* u8 p
        }
3 U2 K6 g' t+ R( k- w2 t4 A7 B    }$ @4 _$ l# q/ v7 H$ i
}( {0 `" F! I6 l5 K" a
小甲鱼最新课程 -> 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-3 23:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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