鱼C论坛

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

猴子问题

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

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

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

x
大家好!
" e- ^; ~; X$ n* K这几天我在忙着编一个问题,我用了一种方法编出来!* `, I5 `6 P! k
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!# s6 J, X" J0 L8 T
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 6 O. A6 A! K/ i& }4 [% n- ^; B
6 S* {) y1 z0 l+ R8 K
& N7 q5 x; W0 ~
                            题目2 W; [' P6 i+ a! e; P2 h" i
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
5 v4 b! F  W3 s! v  c3 m7 k" b第一种方法:利用循环链表' k$ r8 ~, L0 A  \9 `6 a
#include<stdio.h>
# E" e. A$ f; h2 f" n. W9 \  k( n% u#include<malloc.h>
- c# n- `: d* b" M#define M 8            //共有8只猴子, H( C& ~( G  {( l0 w) x) R
#define N 3            //数到3只时退出第三只
! r, \( w8 W) {typedef struct monkey
8 C7 k2 H8 [1 J  M4 J  x{int number;- T& R0 D' z7 y$ Q9 K8 u
int flag;6 ^6 H. X$ Y0 k! [9 D1 ]- S/ F
struct monkey* next;. O4 x0 L, T- Z5 W0 c
}MONKEY;( l$ X- n! E* d# ~, q2 b, r
main()
4 ]0 u" ]3 j- w{ MONKEY *head=NULL,*p,*s;: X2 Q) ]( f* A' ?! _6 F' c" {9 W+ t
  int i,sum=0,count=0;
, F% a; M# r' }  clrscr();              //清屏3 l3 V* f' ~1 ^1 [! j3 s2 _5 S* B
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
# Z4 x5 ~$ l) O' [" E8 I& |  p->number=1;p->flag=1;
& L( x- c, J- n  p->next=head;
9 g6 Q3 f- g/ \! p  head=p;# L) k3 r8 R+ u4 a
  for(i=2;i<=M;i++)* X, T7 O. A! H5 @. v& k& ^
    { s=(MONKEY *)malloc(sizeof(MONKEY));
2 B1 T6 K  X* {1 m; j) K4 N( E6 C     s->number=i;s->flag=1;; K, y) e6 N' `- P3 t
     s->next=head;. d& D9 ]( S3 S! k3 d8 h/ ?; L
     p->next=s;p=p->next;2 e$ e) S; s/ f$ H* k/ x
    }
* R; }" ~! J( i    p=head;& {5 u7 V/ K9 H0 M  `
   for(;;)
9 }- a( T) ]& ~! c    {if(p->flag==1)1 S+ }, N: |9 f, T
       count++;- W0 _/ J& b! Q( Z  V4 M0 R
     if(count==N)
) M; [- ]. W/ p3 j2 i% @        {p->flag=0;
, M" T5 \  r9 Q5 L7 Q. }: z         count=0;
- u3 a" h/ t. ]: z5 F7 M; i         sum++;}& x- d' |0 ]' M' E- M( {3 ]
     if(sum==M-1)! d! y! \  v, _; h4 n$ |$ h; U
        break;" d, A- G. v5 T! m- b
     p=p->next;" w; \, x, h* m0 _8 V$ s4 z0 u% m
    }  `, o4 I7 h( n+ b' [
    p=' \1 F# C6 O  V7 ^/ l3 j
    head;
2 Z0 m( Q. q  y' ?2 ]    for(i=1;i<=M;i++)9 r1 F+ u, Y2 A+ Z  X# R" L& O
    { if(p->flag==1)' N0 u" u( Y1 Z. h3 d4 j
        printf("\t%d",p->number);: o7 S  |5 A; E; M9 p7 W/ V' ~. _* y! {
      p=p->next;/ b, |6 T1 V. G  o2 u1 u! g, T4 c+ y
    }
- \, F0 D  E- ^6 h9 q. ^) R
: _1 ]2 F1 }+ g$ V' g- A! I: w+ W9 a$ V7 v2 X/ |' _

. u( O, A- K1 S3 g! ]}

5 b& M; }2 a. R; \第二种方法:数组
, F. ?0 E; v! U  d#include<stdio.h>
; m8 F7 I0 O6 e% L0 ?9 f#define M 8
: s3 ]6 r5 C$ k. r6 ]+ ], Ostruct monkey: P& [! S5 I% |; \7 E: C3 U
{int number;% z$ w- G6 X+ S: u4 I6 D
int nextp;
) O7 \, f9 Q& p1 ~}link[M+1];" }& V$ i0 n8 L6 x
' J1 G5 Q( W& ^$ l' ?
void main()
3 X' G  E. K: s4 j1 E+ `{int i,count,h;
1 ~4 A" ^6 N8 [+ X4 g! ]& j+ P" Sfor(i=1;i<=M;i++)! B4 F( }( R, e$ w/ f( v
{  if(i==M)
* B/ n7 o6 |! ~# X) W$ R6 x: @   link[i].nextp=1;
3 O$ y  D  j, `2 v2 t  N- N   else, V  k6 `2 r* Z& \, U
   link[i].nextp=i+1;
6 B0 b3 w$ @% N8 W  link[i].number=i;1 q. J! K  W8 a) n5 I( R% W6 F
}& Y  i& ~; a: R0 U
printf("\n");5 G2 B4 S8 i! F) I, j4 `0 V
count=0;4 J' b" V. P9 ^& r' S
h=M;9 L8 \) j1 y! \; y# f$ ^
printf("依次退出的猴子: \n");' b  U! m5 o" N, T( \7 J
while(count<M-1)
5 |$ N2 m7 Q' e/ R{i=0;
5 Q6 ^8 U* o$ s( o& Bwhile(i!=3)$ ]3 P9 N- m) M; I) W5 \* h- X" d5 y
{ h=link[h].nextp;) ]& i. f6 E; a7 Z
   if(link[h].number)' `. G! Z9 x9 e
     i++;}! s: T. [1 j( G9 U0 D8 {
  x7 t6 r. ^* _+ z3 t
printf("%4d",link[h].number);
) q% ]+ L+ T! t9 Qlink[h].number=0;9 @; D1 d, ?6 \
count++;/ @! H$ Y/ {/ @" k0 G, q' [, C. F
}- |" C7 F6 [6 Q9 p, {4 a) F+ F
. z% F. b4 `4 t7 c- s! q
printf("\n大王是:");- Z) j& a& u0 y* ]1 [! X/ s. T
  for(i=1;i<=M;i++)& t4 B5 N% N' O3 m) z( k3 P
  if(link[i].number)5 t- f3 n  P, p; L% W
    printf("%3d\n",link[i].number);6 v2 r+ n9 S9 C! H# c+ d

$ o2 g+ K5 F3 ^6 q6 L2 e& X6 \7 O6 Y1 H2 }! e" k0 ]: @+ l
}

) L% q8 Z- m  G: o# p# T第三种是普通方法for循环
7 R) ~# G  l7 b' d( C
#include<stdio.h>
8 ]8 S2 R2 q, k' p. x4 uvoid main()2 e4 P5 g( D7 G3 t  `. p9 C
{ int i,k,m,n,num[50],q,*p;. ~! ?" L9 J$ C% [6 d# k1 N2 N7 D+ E
    clrscr();# R8 W; X  H7 L
   printf("input number of person: n=");$ |; [% m; _' ~* `
    scanf("%d",&n);* V$ s1 K( x0 Y# f
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只8 k2 X- e3 ~; B( A
    scanf("%d",&q);
9 G) J* u8 p" S" \   p=num;
" Z) k7 H5 e' E0 a7 B4 Y) c' K4 ?& O1 V2 o  for(i=0;i<n;i++)5 b3 n; ~# k2 b+ F3 P( O% Y% ~
    *(p+i)=i+1;
! g; f! p$ m, D; s   i=0;
. F2 D- f; b( P   k=0;2 R4 ^) b5 }: b% l$ |( k6 R
   m=0;0 t4 \% |7 w5 Y# X1 {# t' A7 U" O
  while(m<n-1)
0 ~( \$ J# m/ w8 }: @* k   {if(*(p+i)!=0) k++;2 \. f3 Z; L/ d1 B: }3 R
     if(k==q)7 N4 V) E. T( v/ R1 e& E
      { *(p+i)=0;% ~& ^! J3 e3 n* T0 {% c2 ?5 a
        k=0;
8 Y! W* x) Y- d( ]        m++;3 K; x* r( T  R/ g; c: w- Q/ x
      }) {0 K% n. v( U# o+ u  C
    i++;) t+ f7 [, Z1 \7 {) f. u# \
    if(i==n)i=0;  i; C& E8 b  s" k# c
   }
( O" e7 B. @' i) t; W* N  while(*p==0)p++;
' f1 {( W- A) m  z    printf("The last one is NO:%d\n",*p);
/ r% F! H  B2 [5 B5 W6 @     getch();
0 O; Z( n. \  f$ W3 h: p& D% T' c9 j3 ]8 ]
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
- n9 J$ [: Q6 e0 Qnamespace 又费马达又费电* D- c: w; I4 S4 @8 W7 J
{. m1 {' A5 I; u8 j$ J
    class Program- ?# d( X: a6 u9 N
    {% k8 a2 i/ p" z! _
        static void Main(string[] args)
; q6 l: p& q* X% }) d  a& x        {  k' t* b: h6 x$ N, [! j
            int m, n;
( h' K2 V( q# Q5 x+ x$ A            Console.WriteLine("请输入数组长度");4 K3 R6 Z2 k. K! R2 Q% I& r$ R" ]5 A
            m = int.Parse(Console.ReadLine());//m为数组的大小
8 M% Y3 V: Z7 Y  X! L& r            Console.WriteLine("请输入要截取数字的大小");4 T. u$ t9 q3 f/ ?; r- Q" B
            n = int.Parse(Console.ReadLine());
" H8 g+ S5 J% [% W            int [] numw=new int1 J: j( S6 w7 v, k0 D2 e- [

2 q3 ]) N* S. y* C' ~: C1 R&shy;&shy;&shy;;& O8 J9 h1 b! _
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数0 a7 s# T4 O5 M# W- s2 T
            {5 G* p% @. y6 Z' \1 E, Z
                numw[j - 1] = j;) I3 o0 w, W! {- X# }* I% `
            }/ A8 _; b: L+ ~" m7 d. M
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!( R. k) h1 p9 H, J9 w
            while (d != m - 1)/ J8 G: C" H, K9 T
            {
) r5 ?. a' r( j: q2 k                if (i == m && d != m - 1)# T( t! L; \" n2 M/ r5 R
                {# {# X' z- w. ^! _
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!) r* f9 D. n9 H7 G" J5 u
                    continue;
" x+ F# j  d6 j                }
* [8 Y+ e7 H; e6 X. h; M+ r                else# n4 _" m: X$ H
                {) v2 Y* I2 b3 ]7 h8 j. p3 i
                    if (numw[i] != 0)
6 d+ l4 }# e$ A+ |                    {
* d( T  }# \/ G7 h4 c( W: A) ^                        i++;+ S+ C; ]9 ^! C
                        k++;" A) a- E3 E4 e( _. f% Y) d' z
                        if (k == n)* l+ s0 F: p( b: i* ?4 @0 V
                        {0 ?! M3 g1 U4 c4 V
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
0 p- T$ P( h) a8 F. X, ?6 `/ d                            k = 0;4 b( G$ O8 r* ^2 u! ?" ^. G
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
) \: g; F4 R" a2 h% U                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);- M7 P6 Q: k: ?
                        }+ B' Z) L% V4 _* b) p
                        else//输出暂时还没有改变数组元素的值
4 w# @7 I. O+ r$ J& u! }                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
" s$ @% w! r9 s' g' w  h                    }; C% h" @9 [7 z  B7 E
                    else) x7 E: r& \. l( j3 o) `
                        i++;//数组元素为0,直接跳过,不计数。。。' W/ c% U2 m, X; v6 y4 k
                }/ G. `0 x# d! C1 B; z$ H
6 e1 R* \" A8 J

2 W3 Z4 @- y2 o( L            }//结束while循环4 y6 [. G1 R  a/ ^0 b( Z, Z
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
! X5 w# O# E) [" s7 ~0 T           1 b# ?5 O* f  v- f! f; ^
                if (numw[i] != 0)1 y& l6 C( I3 b$ L& g3 l
                    Console.WriteLine(numw[i]);6 ~! P3 F" C% _! u% B
           
: x8 U$ Z# {6 z# M            Console.ReadLine();9 }3 K1 i1 M) e6 [3 \
        }4 Z1 H/ ]) x6 O
    }
. H$ X) f4 p6 b% ?7 o( y6 w$ Y}
, i; q. ^' n. k# f) a) V; x3 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-6-17 11:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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