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

猴子问题

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

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

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

×
大家好!
+ k+ ^+ X; s' S( }% n这几天我在忙着编一个问题,我用了一种方法编出来!/ W6 U0 ]  }  n4 x% @. ^5 A. Y
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!3 r; u+ s+ B  a1 @2 @# V4 l
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
( T) @- i7 |' ]# F& x0 S2 b( i0 J: m9 ]
+ ~0 l2 {9 v4 C5 ?
                            题目
+ h$ q1 u1 g' {2 m山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
6 K1 N, c3 Z" x& f. b. ]第一种方法:利用循环链表
4 }* M, z8 s: Y* B8 b0 u- T4 V#include<stdio.h>, s7 B3 i0 L2 t' E6 p$ i
#include<malloc.h>. V; Y4 C7 e8 M* _5 v* v5 v8 u
#define M 8            //共有8只猴子
7 N* Q4 F, A, F+ e#define N 3            //数到3只时退出第三只
; p" Y& W6 K. m/ l: u0 ^' Btypedef struct monkey6 A/ m6 V" h) F, m% B
{int number;
; Y( X: Z/ z! ^int flag;
8 j' |* x% j# {- }4 P5 estruct monkey* next;( l7 h- i: ^6 s6 t. n7 R6 `3 v
}MONKEY;9 g7 p* q6 `8 D! a4 G4 L
main()
% S: R* D6 j* e* L5 w! S3 H: b% W{ MONKEY *head=NULL,*p,*s;
' `& Q: l" M9 {$ T  int i,sum=0,count=0;
% G. }( ]/ M; b: ?/ z- r$ z  clrscr();              //清屏. }2 }3 U0 Y* F% t5 ?( ]
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
; o( |) w( S' T0 x! I  p->number=1;p->flag=1;# L3 t5 r6 E1 ]& z
  p->next=head;
' m  H* g2 ~: L  head=p;
- C' M8 J( Y  V! n9 {0 k  for(i=2;i<=M;i++)
" u4 |2 D  K& I: K% c3 s  A" R    { s=(MONKEY *)malloc(sizeof(MONKEY));! F; L- c/ B% P
     s->number=i;s->flag=1;
. H4 c" X( Q! o4 e/ j: m8 r     s->next=head;. k. O. Y; F+ N  H/ M, ~+ M
     p->next=s;p=p->next;
. ~  y6 F* p+ S6 C) `    }
6 h& |3 B5 S8 Y* E    p=head;
4 y; ?% s. {' n# C, l+ c) {$ Q1 R% U   for(;;)
+ w4 ~) C& ]: v- o0 d9 m    {if(p->flag==1)
: v1 [+ T7 S0 V0 L4 j       count++;. ?8 U7 q. |4 X. \+ D6 Z: d* D) i
     if(count==N)
( y! R3 a  G2 E9 I2 d        {p->flag=0;" l8 ]5 c3 m. ~( S& J
         count=0;5 r- C( l4 x1 h* ^% e
         sum++;}
  d0 ?) `1 o0 T9 |9 `1 O     if(sum==M-1)
* e9 Z+ w$ z! w2 v5 n" K. [        break;) a" i9 x/ k. ~5 i
     p=p->next;
+ K$ n! L$ g8 W: {. f  d$ z    }) ~2 S0 w. L/ T% v
    p=
& z$ S3 z" v( K3 w: ~4 c    head;* ~* l$ [8 c5 i
    for(i=1;i<=M;i++)
! O+ s4 y3 ^. @5 i) W/ b    { if(p->flag==1)
. Z0 @4 Y! q8 k        printf("\t%d",p->number);
$ F. n$ |( H$ G, ?. n8 O% D0 E$ W      p=p->next;
, y" k  o9 K: o4 N2 @    }0 m, W5 W; d) N7 I7 ]  v! \6 a- q
" Y& f9 K! J# ^

, O1 E5 n: x; p* Q) g5 @3 i, l8 R3 ], v$ C1 L. o4 G: _1 b& o8 P# S
}

, Y! T$ m3 V/ M2 L( |! r5 x第二种方法:数组
8 y5 m( F' O* K: ?9 m#include<stdio.h>
% S, G; Y* K! R9 i: h#define M 8
5 J1 G+ H. K7 I  x' y, n8 ?% a4 {3 [struct monkey
4 Y$ ~, E7 E3 E# s: |. r: b/ h{int number;6 ^* a+ Y2 g" N9 r6 K
int nextp;' k( m" T7 ?$ V2 W( z# G# i0 \
}link[M+1];* b3 G, Q, W; e% \+ O8 v

7 g: g/ w4 k# q$ U. s$ Cvoid main()
3 C% U/ k9 y2 L. K) U{int i,count,h;
+ c$ Z! J& e* @# J% Zfor(i=1;i<=M;i++)! y1 j& h+ R2 \! a4 G8 G# Z
{  if(i==M)0 ~# T/ r1 R' r% u: B  R
   link.nextp=1;
2 Q* G( }4 c, m0 W* ~' m   else
) {5 ^' A( C  A/ R( Y2 R) H* D+ t3 A   link.nextp=i+1;8 ?3 r7 w* v" v1 I: W0 C
  link.number=i;
; A; ]% R* R# E9 G8 j}
2 O! ?% A) y3 ]8 `2 U! K5 `printf("\n");
4 D; X- j( {8 ~0 Hcount=0;' A. h7 n! |6 G( Q9 b6 d
h=M;
; ?8 ~- L8 }( ]- n" X) {7 r- ]printf("依次退出的猴子: \n");
" C" f$ O7 e3 |while(count<M-1)
2 ]' N6 Q. z; a4 e$ p{i=0;4 _# n# _5 Y! L; c% G& ^
while(i!=3)  h9 e  l* D* I  j; C3 Q/ q, U
{ h=link[h].nextp;1 Z$ m9 {/ Q* n5 a8 ^2 F
   if(link[h].number)
- E- o9 B2 ?& L: x* Q  z" H5 Q     i++;}
, D  m' T, o6 g2 [4 v2 d% p; G9 [( {! z
printf("%4d",link[h].number);5 p" t, c: j/ `3 \$ a
link[h].number=0;
/ z4 [' T& \7 @, g3 r1 Acount++;3 |: Y6 R0 o" j  E" k; }
}$ m+ W1 x. }3 e" W7 d2 Q

$ l" `7 X. w" ^# Lprintf("\n大王是:");, |. j# N8 ]& T6 e/ `9 t
  for(i=1;i<=M;i++)
8 [7 \+ L* F4 Z0 v1 I8 I  if(link.number)
9 b5 w. W" |' e6 r    printf("%3d\n",link.number);
" r7 J8 f3 v: R: w
; O: b. ?8 |* L/ P
* C9 l. I. `- d1 e7 j}
6 X( A! @. `, E0 ^( o
第三种是普通方法for循环

/ N0 K) D# ^( P! R( c0 w. e- C- G* P#include<stdio.h>
4 b# H( V2 Q% |1 p2 z& A! @9 cvoid main()
- g3 g+ p' W5 ]2 ~) f* }! y$ B{ int i,k,m,n,num[50],q,*p;- ^! U- D3 f' B& M8 ^
    clrscr();
4 V& j$ L7 `! k! f6 M   printf("input number of person: n=");) ~; @7 D9 e) k3 T
    scanf("%d",&n);
: o4 f' m3 o& k4 |printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
: B7 O9 V9 w. Y, L. u$ Q; x    scanf("%d",&q);, ]1 s* g$ O6 P: u5 X4 }0 Q
   p=num;
  K8 n8 t& m  x  for(i=0;i<n;i++)
3 X6 Z3 h" A( T5 t; u    *(p+i)=i+1;8 A& X& j  I& e+ `
   i=0;
) t2 P# q- L# H   k=0;3 L2 i) G) s' s) o2 y7 [4 ?$ v
   m=0;( k: L2 B* \& {
  while(m<n-1). O& u/ i1 p2 K* r8 C4 `7 E# l+ X
   {if(*(p+i)!=0) k++;/ \* M7 ?& X) `1 U6 T8 @/ T! w
     if(k==q)! `6 g+ L" A: v% P; l
      { *(p+i)=0;
$ T8 {: ]2 i: O2 M. ~4 \+ X        k=0;) S: J! p0 X1 K9 J0 U
        m++;
- a( ]8 N$ M+ }0 z  J) ]      }
6 H- U3 N( B# ]0 S    i++;
# P( J4 |( |6 Y- H; V& y    if(i==n)i=0;% i" K& A6 ~. |
   }
& m) w: R. L! x4 W% k$ r: ^+ E4 c  while(*p==0)p++;
' O9 _6 b' D& s    printf("The last one is NO:%d\n",*p);2 m$ ~0 i( x5 C& D
     getch();. Y7 r& J& x& m& v" E

) |7 A7 L5 j3 H" r! y0 u/ c}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
8 J. z/ I9 h! i9 Q) n0 u& W. q/ _3 ~* Pnamespace 又费马达又费电
, m7 j+ b; H3 {, d) Z! Z' D) f{! ?7 ?' t% G) \7 f1 n  L4 v
    class Program3 ]% I; D1 W6 o) b
    {
  E" x. s, ~2 a: H& t$ [5 G. E2 a        static void Main(string[] args)- m- Q. t* g  }% E
        {# z9 `6 T* M( D6 r* V9 A
            int m, n;) `; U8 ~* U  o: ~& j( i
            Console.WriteLine("请输入数组长度");; H- ^1 B, f) K2 E) T, q# g% V
            m = int.Parse(Console.ReadLine());//m为数组的大小
8 H5 c/ I& D  ^) h            Console.WriteLine("请输入要截取数字的大小");5 {5 K5 a' J: G
            n = int.Parse(Console.ReadLine());5 y0 Z, H+ P3 K# G
            int [] numw=new int5 a9 i' ~8 z3 D, \# X7 C" I

8 O% {) E  f7 ?- C4 R0 _* W+ T&shy;&shy;&shy;;
) Z5 {( W8 M9 M0 X# s            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
+ q6 I- K+ G3 T            {0 M$ w0 I/ h, o; I6 S
                numw[j - 1] = j;
. L4 n- g3 `: V" e) p            }
0 I) g, [& O! u/ |& o            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
1 A( {( [2 p. w8 k. i- |            while (d != m - 1)
8 A& Y: K6 ?. R2 G% C" \            {
$ G& k9 X+ w3 ~1 g. V3 ?" s                if (i == m && d != m - 1)+ }6 f0 d6 I# U- N0 N
                {. `+ L, ~" \$ u! G% m; ]8 w
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!0 N- y4 ~) I) z0 A  L0 ]7 N8 n3 l: Q/ ]
                    continue;
/ d; L) j. N  `$ A2 Y2 c) ?& k                }, g, p& u$ W5 `
                else1 y- T- P* O9 H7 g8 q6 ~, j
                {9 B8 s+ k* S8 W' R& [6 v) m+ B4 ]9 l
                    if (numw[i] != 0)
! B6 l9 \# _' U) C+ l7 ~/ |" \                    {3 a, X3 B9 p) p7 l- A# X  _/ i/ x
                        i++;
& r7 l/ z! R+ I                        k++;: J  t) O/ o9 A* s8 T: e: C; a
                        if (k == n)
/ n$ E% H$ j) e/ W+ w* n: r                        {/ D2 g; ?; u8 l" N* O
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了) A, m. D/ j4 B9 U/ J2 R5 K( X
                            k = 0;+ U; K  M/ u4 y! e
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1+ J8 y- c7 c, @3 t( k) I
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);5 N6 ^& ]0 c8 R0 J# x9 e* `, ^. P
                        }
! u1 r: l! ]4 }                        else//输出暂时还没有改变数组元素的值5 g. Z0 X2 S- Q( S+ N* Y% [- N2 _$ Y
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);* X9 K, F0 ?' c
                    }
) Y& G! j; k4 v. G7 o                    else$ M- C8 O/ F4 H" D' Z1 d+ a
                        i++;//数组元素为0,直接跳过,不计数。。。. u# }' Y" u2 ~  x% _! ?4 j7 T1 q
                }5 r8 G% z' x6 ~

% K" V: ^0 g! V( w
2 M. U+ j, ]/ \7 F+ ?7 f            }//结束while循环
2 _" j' ^4 [  D8 L7 Q4 h* X+ t) c  }            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦! ?' k" X3 a/ r
           3 s3 [; I! B; U* @' u' q+ R
                if (numw[i] != 0)
1 o( L9 k- S0 H                    Console.WriteLine(numw[i]);
5 z2 r" P5 S6 ]7 E6 S% B           
" \2 k5 l9 Q" C: t            Console.ReadLine();
' E, y2 [* C0 K/ r5 l0 V& [        }" s9 j0 N2 [2 r! P# i$ G/ }7 q
    }
# Z# c# e" D0 n  E0 ]8 e}6 l5 d7 d5 x0 I4 I- I4 f( n, R
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 1 踩 0

使用道具 举报

发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

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

GMT+8, 2026-11-10 10:08

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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