鱼C论坛

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

猴子问题

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

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

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

x
大家好!& E$ b5 |+ T& Y/ a, Z% }- G! F+ \0 J1 m
这几天我在忙着编一个问题,我用了一种方法编出来!
, _- }9 P, o0 y$ `" x& B但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!- o% K+ Y" G3 y6 _1 ]) x: E- ^7 Q
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激   \, E- @! T# i- M4 `' N& x
  C# R) \* }$ j1 N+ k7 S

2 m8 h1 f9 \) X6 K
                            题目* P* Z! S- O: V
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
4 a% o0 Y6 Y# l5 K$ [$ g第一种方法:利用循环链表7 q- N5 B8 o$ V& H
#include<stdio.h>
9 M6 a0 S1 V' [" \#include<malloc.h>; [6 p. t9 T( k3 M3 ]1 F
#define M 8            //共有8只猴子
2 V" P0 {- x) n: e- I5 S4 t#define N 3            //数到3只时退出第三只3 K% B0 a! |( g8 \2 R! v
typedef struct monkey7 m' e7 F+ ?2 U1 S9 ^+ X' D
{int number;7 q3 f& o+ l0 o: r. P7 {
int flag;
4 r3 H2 T2 \9 b8 w/ Z/ g$ K9 Hstruct monkey* next;/ s+ }5 c2 R# L/ L8 X1 V
}MONKEY;5 ]4 t" J0 e- a8 H6 R5 Q3 ]  S
main(), c* {8 z) ]' P( ]; X* ~2 ]5 q& M+ M
{ MONKEY *head=NULL,*p,*s;8 r% C+ M, \8 p$ D
  int i,sum=0,count=0;7 g& F: [& S: M7 ?
  clrscr();              //清屏! |5 x5 }+ {$ l! ]$ X( K5 r/ U1 ?
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
, X+ w8 y- R  r- o' Q# y# u  p->number=1;p->flag=1;
7 {* U: l' |* E0 D* ?- t  p->next=head;
7 I& C. O! c! F/ T7 t  head=p;
, w/ H) e/ C8 v$ c0 ]& R; n! |  for(i=2;i<=M;i++)! ]' Q0 J& h+ x; v. N! }) l+ _
    { s=(MONKEY *)malloc(sizeof(MONKEY));0 C( o/ h- `8 f( v& H! C
     s->number=i;s->flag=1;6 S& Q8 Y! ~: D& E3 e1 b) W2 T: a0 i
     s->next=head;
7 s9 \$ q8 H( j6 n. r7 a     p->next=s;p=p->next;
/ x6 E5 C3 @# {% E3 H/ ^' s    }. h" a* F6 @; D8 k4 l! x
    p=head;' w$ J) [( {* B$ _1 D: W- U
   for(;;)
$ J2 p& W3 A- l" V2 m    {if(p->flag==1)) }, O2 N$ ]) @4 u' k3 j1 F
       count++;
2 Z5 A* g3 ^0 O) I, j     if(count==N)' ~& \2 a6 f+ \
        {p->flag=0;- x4 [0 E" }: G
         count=0;1 l% _5 Z0 s- S5 X0 t# ?5 l
         sum++;}
. \( p: X7 v! W0 a! Y     if(sum==M-1)' ^2 e; K, l4 L. n9 P
        break;
" s6 d8 i) I6 B. K     p=p->next;
' U3 L# k: c3 {3 {+ V3 G4 d9 R0 v    }+ b1 l. Q0 j, a( {  b' c
    p=, c* v, p; r, f  f1 X$ Z- g
    head;; l4 w' R2 t: v$ J
    for(i=1;i<=M;i++)
' d4 y) v& u8 z/ @* S' N: c6 R0 F    { if(p->flag==1)
5 L1 Z$ G% x6 T3 R6 J3 m5 K        printf("\t%d",p->number);
0 B2 Z; C! T. a      p=p->next;4 R, n. O, P  a& ^# ?9 N1 x% k
    }
. I2 j, e2 R' O: ]. b; t& Z9 W, q% |7 Q& j' V3 r% Z( t, D
( E5 c4 [( C, R2 L1 [% ~9 g& |" S
1 o9 L  n/ t# g* C/ ~! o5 E$ P
}

: R, o7 e2 ^: g! K4 _5 ~! d8 o第二种方法:数组
3 t' x) k4 c$ S* I% P+ v& }9 l#include<stdio.h>7 c2 D) Y0 z7 R7 `
#define M 82 {8 O0 n3 i$ @5 }8 {
struct monkey0 ^8 B) U6 s# p+ z9 X
{int number;7 E( n$ D% B) j
int nextp;2 ?; a/ \# F- x6 r9 L/ A  J- _' u7 g
}link[M+1];$ m' O. Z8 T8 ^- S, r
2 S( ^! ~. Q! Y% ?1 ~0 C
void main()
$ N4 y: R3 T! E! p7 r4 m5 P. s{int i,count,h;
; d0 j- m7 L1 a4 cfor(i=1;i<=M;i++)& Y' u5 b5 U7 q5 L
{  if(i==M)
: A/ z7 `+ G2 [& t. U% a5 V   link[i].nextp=1;1 p8 b  q8 J9 L7 ~+ l
   else
. I1 D1 O! S! @- g   link[i].nextp=i+1;- O9 [: q1 e* V4 N5 {
  link[i].number=i;
3 c* D$ q: ~& U8 U" y+ I1 l8 |* c}
7 u3 S. _: X7 H# q8 S( n1 nprintf("\n");6 O6 `! `* O' x( S1 ^% z
count=0;- X; Z" m5 S; X5 u* L
h=M;
4 y  ]; R' R5 a- Eprintf("依次退出的猴子: \n");
+ K0 W) r  {2 E6 t/ {5 V; xwhile(count<M-1)
  v: h* g( W" m$ G2 Y  d: _{i=0;' @. E! {1 U* g+ F+ H' G. J
while(i!=3)
. u, |1 G) ]; {4 L9 h# t, \+ v% c{ h=link[h].nextp;$ ]. b" J' x; O: G4 T( |6 p$ ~8 g
   if(link[h].number)
  X* f* W* l' X! e4 g     i++;}
+ P* o/ P" G1 d" u1 p
& z; J/ b. P, ~" `printf("%4d",link[h].number);
' C! p+ ]  h' j8 ^+ [3 `5 V! ~link[h].number=0;, g9 t! R0 N5 z+ R. B$ Y- e
count++;0 |* r; Q/ p' a7 g# p
}
9 |7 F1 f7 j" i3 u
- Z. u8 x  C1 W8 F+ jprintf("\n大王是:");
: d  Z( l( g, M- u  for(i=1;i<=M;i++)4 p. V, `7 D( R0 z0 }' m
  if(link[i].number)+ d- J2 K, [4 ~- l% K6 g
    printf("%3d\n",link[i].number);
8 o! \. k( G0 Q1 s2 b* [& a% N  {" J

7 W5 p" B7 o8 t}

! V  U; B$ I1 n1 Y9 B) U( J* M第三种是普通方法for循环

0 @4 K" u) d. P# M#include<stdio.h>
# b7 b5 f4 U) g8 g: f  E: e9 B6 Yvoid main()
" Q  ?0 ?( d, a1 `1 f{ int i,k,m,n,num[50],q,*p;$ ~, A  L. o; ^+ ^" s; @1 `) A8 F
    clrscr();
3 i& ]7 @1 a% G' W$ l8 x( J5 k6 g. ]   printf("input number of person: n=");
0 |/ G$ S6 O, n* d    scanf("%d",&n);
0 L0 i- {* F/ Z: K9 N) T6 M  _printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
- d% }# i; a7 k  A, A) V    scanf("%d",&q);. O8 _7 E' U& n) L& l2 _5 u0 y$ u3 K
   p=num;: I/ M% F+ A9 J- N
  for(i=0;i<n;i++)
# I1 c2 \0 B. S- ?7 g- [    *(p+i)=i+1;( a' d. s( b3 g
   i=0;& Y7 G- J5 C$ G% ^
   k=0;
5 E0 f" D' B8 W1 m9 z0 ?  u- ^   m=0;
1 w# c) [. S2 l! F! ^  while(m<n-1)
3 m1 j3 A2 q( N  d- l7 s   {if(*(p+i)!=0) k++;! b( P! X* }8 M& R( J- _
     if(k==q)
# `) ?3 d! t0 X! n" p      { *(p+i)=0;" f& q5 k' {! O4 [% A4 x" L
        k=0;
, l* F, @5 b# e6 C+ ?, M7 j        m++;) r  k2 K* ^, W- Y; e
      }
: O# B; n3 T7 T- F1 z8 M. C    i++;
; ~9 U* E. E8 T) H: Q' h    if(i==n)i=0;7 R4 w( M" F# k* ?8 w
   }
1 ~) r1 j, _# _% ~) z* o, l. Q# }! u  while(*p==0)p++;
) y" U/ W' n6 Q/ {8 S: T6 }    printf("The last one is NO:%d\n",*p);: @  ~9 V/ Q% `; {
     getch();5 T9 w) p3 |* L/ e/ K) g/ {
, w$ J) x; i0 d) W$ b
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
- _: D1 x; h2 K( |3 u% tnamespace 又费马达又费电
  Z& z& K5 w4 B" {  S# L5 a  G" ?{
3 e- h% h* C" m% k+ {' Q9 `    class Program
# |7 h% Y% p9 j8 @/ w6 k    {
/ y( ~" @& v# \) w* Z        static void Main(string[] args)1 O1 o* N6 B9 L
        {0 W" X7 D/ D7 ?1 C, E2 u
            int m, n;3 r" k, [$ ~2 b& c5 Q( `
            Console.WriteLine("请输入数组长度");
8 J: I, [# r% X4 H            m = int.Parse(Console.ReadLine());//m为数组的大小7 f" `# s  Y, X# l6 q) u* ^; a
            Console.WriteLine("请输入要截取数字的大小");
+ _4 C7 v6 m. w- `5 r! S; `5 R            n = int.Parse(Console.ReadLine());
0 }- Q7 e1 `- V0 A' v            int [] numw=new int
5 I0 E, L4 K4 d% a* z
) q, f5 X2 V! {&shy;&shy;&shy;;! ?: h9 O; g- B* @
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
) ~( K+ _& A/ Y' C5 `            {- F; i3 i6 }7 b+ }8 e, j4 T
                numw[j - 1] = j;
% b# @2 ?( A8 O0 ?, d" V: X            }* G% F7 J- Q" c" k4 n  T9 l
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
6 A$ ^7 \0 T- H/ n! f            while (d != m - 1)2 w% e2 e$ R% n& i& x& I$ Z) G; T
            {$ R$ ?/ D9 z" d' o# L
                if (i == m && d != m - 1)
: n3 l$ Y1 S" t$ Y                {+ }( N% u  ^7 P6 X: Q
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
; A9 T' a4 F) f9 ^% ^                    continue;& W* \: _% P: s
                }# c0 _7 |3 z4 ~/ e* ]+ q9 Y# F
                else
' c5 r# B( }% T3 l: x% ^9 o                {
, B2 Y& y0 _# w0 i                    if (numw[i] != 0)
& y- T# ?( m( T  j# N% e& U                    {
) ^) i; @& @. w* P3 N8 [8 T9 ]                        i++;4 Z9 y) B1 Q, q% z- a7 h
                        k++;1 P# x5 l: X8 G# C
                        if (k == n)
3 M9 i- [. ~- d4 m: u: l2 [9 u                        {
/ ]: l% c! L$ ^# ]                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
' b: y1 T4 P1 q- u* Z; ^, ^/ R! P                            k = 0;
; P$ e+ v& X8 [+ @/ y3 ~$ v              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1! {) H0 O) A4 J7 t" K( V
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
$ B' M: E" t% Y                        }$ M, C" e: v9 U+ N+ y2 E
                        else//输出暂时还没有改变数组元素的值
2 ~& B' l& [9 r0 s& w: T6 H                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);9 ?% B8 L$ J/ y8 v: y
                    }+ z3 W4 C% S) W* H  V
                    else' C  U5 n2 n! d  }* x
                        i++;//数组元素为0,直接跳过,不计数。。。& C  X3 S9 P' B# W
                }
* _, c  b* \% v& o0 ^" H8 Z0 [
2 n4 g. b) _: C) z! O: c9 w
/ T4 o% c* f6 z' w            }//结束while循环7 t1 J0 A7 K: I7 m: e  A$ z# f
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
/ i; M, {( }* A% o4 o$ O" ]- A           
& p! S2 {* l  i+ |) y                if (numw[i] != 0)- k9 V8 o" g3 L8 z
                    Console.WriteLine(numw[i]);! C: h2 v! k" K: i3 Z) _
           8 @- E: q* C; L7 U+ F- R
            Console.ReadLine();
: ~6 G# y7 b+ u        }1 F( F! U" c- B7 r- M7 x
    }* s$ w- T3 H% g  o. q# {& m
}$ o3 i6 M$ W& _9 ?8 Q3 C! L4 V
小甲鱼最新课程 -> 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-7-13 20:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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