鱼C论坛

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

猴子问题

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

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

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

x
大家好!
; y2 g- k$ {# Z9 d: `) F) \这几天我在忙着编一个问题,我用了一种方法编出来!
7 ?3 H! l+ Q: D2 s, K" R但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
$ w  o% p# v' y/ ~- d注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 * \+ i6 _* _9 n0 G/ ~/ O
. x; f& D/ `. a

  r# I7 p3 J  `  B& }4 R1 v
                            题目- Q* w" R- ]# `3 j0 s: c+ p; V' ~
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。# ~: G7 i$ ^8 m% T3 p. h. a9 N
第一种方法:利用循环链表/ a8 R( n' H4 Q; V
#include<stdio.h>! N3 w) f; K  z: r7 ~2 r  m
#include<malloc.h>
( K# w: w9 {. u: |% A' W#define M 8            //共有8只猴子# l& {* A" i  D4 k$ c0 k
#define N 3            //数到3只时退出第三只4 t' Y* o4 I( _3 j# d0 R
typedef struct monkey
2 ?: l2 s) q7 \. E# Q' `+ c, e{int number;$ N( [1 Y1 p; A+ w3 Z- w% X* b
int flag;% R% H% P9 `! e0 d: d: [( P4 [, x
struct monkey* next;
& J7 i( a: Q" p8 b/ ~) q1 W}MONKEY;
- V* K- y, B8 E4 \6 kmain()5 F  s7 |" Q) a& I8 l1 H
{ MONKEY *head=NULL,*p,*s;  a* S; `2 w5 R9 y) `
  int i,sum=0,count=0;! e2 f- V( J! C- S
  clrscr();              //清屏
3 x5 o4 P- |# E- W. l9 F0 V5 E& }  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
3 e4 F+ V- w8 L4 N9 q" d  p->number=1;p->flag=1;  H- U+ f, R! o# Q8 l
  p->next=head;
. k+ p  V, q0 `  }5 H  head=p;7 D$ K5 c( p  }# K
  for(i=2;i<=M;i++)
2 d0 }$ P% X8 w6 a$ G0 K. c    { s=(MONKEY *)malloc(sizeof(MONKEY));( W5 }; @  S3 ]) _' a! D: g
     s->number=i;s->flag=1;; D5 K' J" Y( s. l$ y; e
     s->next=head;
& M$ y: o" c" q0 m' A% N     p->next=s;p=p->next;7 T, Q- Z/ }% m; H% G6 M9 m3 U
    }) W" S3 g3 M: I" B
    p=head;
/ p4 Z" E0 B3 w( m- g2 x/ n9 ]   for(;;)
1 @9 {' ~- V9 [/ b7 {1 o    {if(p->flag==1)
2 v( v  U' r0 e+ v1 D       count++;* }1 @: ?4 q$ a! O$ V/ z
     if(count==N)! \1 \( t( x8 d* M/ x
        {p->flag=0;
1 R3 v  ~2 M0 k  ~* j/ O3 u; d         count=0;; G9 @$ A. T/ I, m0 }
         sum++;}
2 o( D& g- T/ o& n, H     if(sum==M-1)! A4 n  k) s$ p2 M
        break;
$ O. X: Y+ h1 r, U     p=p->next;  z' o2 [( g8 U& M2 s# A: w
    }
6 _# ]( H, G( w) e; ~    p=  ~4 Z6 j& G6 S; Q
    head;$ H9 R0 b; C* g) |7 U/ j. e
    for(i=1;i<=M;i++)
9 P; c1 k2 g0 H7 B) y% T0 `    { if(p->flag==1)
, M5 ?0 k$ s# B0 w2 _" X( F        printf("\t%d",p->number);
$ L! F) n* C2 k* {3 z% L1 h* G( A      p=p->next;0 \: b; ^1 X) E6 K
    }1 K/ o- G' Y5 E; H9 {

  Z; l6 S  R. S# M5 `( \/ J. F# h  d# t  w" u$ q% ]
% K6 Y  T! y' v( L( q6 D& }
}
0 o0 z# O: I5 V4 A7 M- p7 {$ o, n
第二种方法:数组
5 _4 y* k1 ]' P" D" \6 ~# R#include<stdio.h>
# y) x4 s( ]2 B$ }" {/ [#define M 81 ?" Y2 B1 i& T0 `, T- @3 T
struct monkey
9 ^8 O' Y" y& t) V{int number;* Y5 @; {' T+ F# L5 I
int nextp;! u8 f  j1 E9 N8 E9 y8 n
}link[M+1];$ S1 i! k; j! N+ r- \3 _' c
+ t3 U* Q4 P) d. z) f
void main()
6 c& y$ T/ j! _: ]5 R! B) H{int i,count,h;
2 y, \$ T3 X  \9 g4 t" G. ?! ?for(i=1;i<=M;i++)' w# M6 l' M3 H  D& Z, f! d
{  if(i==M)/ r  g' Y( R4 P( `2 Z5 C7 I! b0 L
   link[i].nextp=1;
9 M1 |0 @' j3 p# ]- Y7 u0 v   else1 g$ c7 z, o( |
   link[i].nextp=i+1;
4 }; r$ W  B) P3 c9 P& R  link[i].number=i;6 x) u5 r+ n3 K+ h; p
}* j( K  G3 R- H
printf("\n");8 g* R% s8 u9 _, X. n
count=0;$ }( R  Q6 \9 t, Y
h=M;
1 {% W2 U& _6 L1 b/ Z# w& Iprintf("依次退出的猴子: \n");
5 [' B6 T+ N* c9 j7 Xwhile(count<M-1)( b4 W! {7 M, _4 I. P/ L
{i=0;0 V) U; H! m! _' Z2 g6 t7 Z
while(i!=3)( v4 u+ h% w) t
{ h=link[h].nextp;' B! F/ u8 ~$ L
   if(link[h].number), {9 }' O; w  C' {  {) v
     i++;}$ r5 i5 w9 M9 I/ \0 r4 N0 X$ ]
3 ]: s' N# G' |0 M
printf("%4d",link[h].number);
1 x; W5 l, z7 p2 c7 olink[h].number=0;
6 Y  L* ~+ G- I5 |2 fcount++;1 @8 w- d$ y/ n* M" z
}8 {- }" @2 c3 N! l/ x
  n" \# w) s; N8 s, U6 a
printf("\n大王是:");3 _7 S. K, J2 |7 k/ ~* g, H4 y
  for(i=1;i<=M;i++)
4 C2 @8 H! j" a) U  if(link[i].number)
9 B3 ~- i- k" e% S1 ~; e  e+ v" V    printf("%3d\n",link[i].number);( B2 f* k" `6 [. V
0 r  c# r- u6 H, t% V

; F+ C4 v! w. u3 ^}

! v3 O% M. L/ n$ i4 e第三种是普通方法for循环

! j8 b, \* V# ~! m; v#include<stdio.h>' F! f$ T4 u) i
void main(), h9 u- n- u+ Y1 ]: ]
{ int i,k,m,n,num[50],q,*p;
$ v; X9 o! m! S% M( i* t# h    clrscr();
; w5 `: @1 C) i   printf("input number of person: n=");9 |: s2 b5 {1 P& g% ~9 w/ u* h3 A
    scanf("%d",&n);0 ?. d5 F- y1 C6 \% H0 p1 t. m
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
2 H4 M( @  f' L! M3 [6 Q3 y( ^    scanf("%d",&q);' K6 Z5 s- q( _, n
   p=num;
5 D! S$ V  ^6 F/ T% B  for(i=0;i<n;i++). P( A: i8 H8 i2 o( Q. l) ~. g/ ]# `, }
    *(p+i)=i+1;
5 Z  h& y2 Y8 r/ C. M$ n" h   i=0;- R- t: }0 Z* T7 L1 X+ `% q
   k=0;
' I9 e5 m8 P4 L+ R/ v4 v6 P   m=0;- Z9 D; N$ ^) R
  while(m<n-1)
: q1 c3 N1 y" @) b( X   {if(*(p+i)!=0) k++;
" `  \- o$ `/ s, ?     if(k==q)6 C6 o: k) K6 w
      { *(p+i)=0;$ ^5 j0 t- w% z
        k=0;
/ M+ T, I6 x" X        m++;
6 w2 \; E, i8 N/ P$ ^$ D* @8 {      }( r3 I  Y. {8 P5 p# ]) b& x8 \
    i++;
5 o5 s3 W0 e8 n1 Z. |( {6 r3 H/ f    if(i==n)i=0;# f8 k2 A. I. i0 d, e9 ^, A) Q
   }
7 C+ t  n" f5 B2 @! R: |  while(*p==0)p++;
/ _7 r/ n7 C+ n6 h6 [  `  w" w7 r! z    printf("The last one is NO:%d\n",*p);
* H3 u, T- ^9 {6 I4 E- H     getch();
2 ~7 F; V! }5 t; w5 q  L7 X
2 h2 y- E0 v) s' b' _* }" B}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;1 W* B9 F$ P9 N* f
namespace 又费马达又费电7 I- s# ~! r. |" K
{
. H) o- J0 g0 `6 z3 b    class Program
. |$ q' H9 ]5 I( L    {$ |: l! ]9 W- ?; {% g" j6 d4 d
        static void Main(string[] args)
+ \: F5 T* f$ e$ f  {% J        {
; @- |8 W0 i! L. n            int m, n;. {2 T) K# f) `- d
            Console.WriteLine("请输入数组长度");1 m5 f1 s9 [( {1 c) F
            m = int.Parse(Console.ReadLine());//m为数组的大小
+ t7 u4 ^" s0 g: o2 j6 ~7 A            Console.WriteLine("请输入要截取数字的大小");/ X8 x4 Y2 n& Q
            n = int.Parse(Console.ReadLine());0 N$ k1 b: L0 A3 B/ f
            int [] numw=new int4 ]+ F, J1 U9 y5 C3 Z7 q( Y
' ]- j: s+ z2 X) l) @
&shy;&shy;&shy;;* v6 t  }4 M0 ~6 d% K) D
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数. U* v5 {5 s: [
            {7 z* C& J$ h2 F
                numw[j - 1] = j;* p/ U7 e; X& O- U% `  V
            }
0 g" ]$ o. w: c7 T: y1 L. X% d8 Q            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
/ |% c* [' Q/ g  g* q0 L+ v7 A            while (d != m - 1)
8 N/ H, q6 Q+ D4 u5 P' k8 e; V            {% w* p* A$ |1 l5 a( C7 r9 t8 h
                if (i == m && d != m - 1)
0 Z6 w& p* R7 X0 k                {% D5 z' Q7 U  m& Z
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
- j/ \" p" m9 W' N% K. Q                    continue;' x) Z! K& n0 e& N* T
                }
2 g1 ~( N; ?5 L; S                else2 ]" }; ~3 ~/ {) X9 B
                {3 ^. `0 w5 y) W  a( s6 F2 ?
                    if (numw[i] != 0)
& ]* e! h0 w4 q2 Z; X                    {7 H* ]1 q; ~  x+ r) n1 q! [" ]0 \+ z
                        i++;
  o% {) p2 t) I& F# Q                        k++;- y7 C* ^5 y1 P7 X3 l
                        if (k == n)% F: a7 P1 n0 Z$ H& T
                        {0 ]0 V0 V! C& N0 T* S4 a, U' ~
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了5 G# u0 e  r3 p9 x8 o! {$ H
                            k = 0;% e6 r" K3 z$ j( r' u
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小18 v* Z% K, J4 U& j2 r* W0 ^' L
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);" _3 @% @' _% A6 j" k1 }
                        }
. Z$ \/ D/ o3 W3 c                        else//输出暂时还没有改变数组元素的值% B, l2 s7 U+ x
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
* w" ^- s" ^4 |' a                    }: L! U! J, I  f% b& e9 ?
                    else' M( o2 V2 v) L, U3 K" k1 |
                        i++;//数组元素为0,直接跳过,不计数。。。4 d  V. U" Y4 V: Y) C0 X% z1 z! t
                }2 t+ j0 W  U# W7 g

3 Y8 X6 {$ E. O4 J
& d/ ]' K6 v3 d+ \6 ^  A  r/ X            }//结束while循环+ C; l# [$ F+ W& n" `. T
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
( K  Y" Z, c8 y+ W           
1 g8 Q* _2 @2 e7 @; a                if (numw[i] != 0)8 d2 y" F6 g  f8 b* [3 R: Z
                    Console.WriteLine(numw[i]);
( ?9 ~) u& p  `% q1 H           8 E+ M4 Z2 ?) u  s
            Console.ReadLine();
5 x, ?9 t; V* E$ \( a        }
2 E8 c. f0 Z0 X3 K' ^2 u( ~& F    }
$ G( T4 a% k2 {' @) P}/ r% M2 u6 ?5 T( {
小甲鱼最新课程 -> 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-1-13 17:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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