鱼C论坛

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

猴子问题

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

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

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

x
大家好!
2 _; Y4 D8 c8 E$ a; J% Q这几天我在忙着编一个问题,我用了一种方法编出来!. ?) }5 ~: O1 {$ ?9 l- l* `! z6 B4 {- y
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!3 Z  w5 K- |' C$ ~# m
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
1 f( ]4 o$ e: K% ^  j0 ?3 \( Z! Y" H4 y, h4 q% T

. L: G2 D% s( g8 m/ |: s
                            题目1 \# q$ O; w0 r
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。5 ]2 n* l7 @- Z
第一种方法:利用循环链表
6 c/ I2 O8 \$ E  X6 H0 c#include<stdio.h>/ \* I) M0 W; i2 A1 J
#include<malloc.h>
  ]6 {1 S0 `3 F4 l#define M 8            //共有8只猴子* ~; g, m: C7 h  o. c9 {9 Y0 U
#define N 3            //数到3只时退出第三只( H& [- b% Q2 h0 A, @
typedef struct monkey
# q5 d: e  b! N- z$ J% A{int number;. ^# [" ?! @, p  Y0 `) h  Y
int flag;$ r! l9 }& p/ J/ x  I' j/ j
struct monkey* next;) V# S' ~7 e- B' T! D; r
}MONKEY;2 i7 n6 D  v1 x7 G" o+ g
main()
2 P7 R  }+ B7 g; S5 K{ MONKEY *head=NULL,*p,*s;
" J3 @; c3 O6 H* R  int i,sum=0,count=0;3 ]! N6 i) T7 V4 y% @; E# ]
  clrscr();              //清屏
% S) q  H; ~  W# g8 F  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存+ p1 b7 F8 X0 |
  p->number=1;p->flag=1;
0 m5 L, `! t. L! ?1 o' V* l# \  p->next=head;, ~  @( S# q' T9 }5 C, K- t
  head=p;/ u! Q* @2 f9 x+ d
  for(i=2;i<=M;i++)" A7 T, c, ?/ z7 _& a# `
    { s=(MONKEY *)malloc(sizeof(MONKEY));& Y% w5 z  A' @$ k% i% x$ C
     s->number=i;s->flag=1;! X# b7 g: d! C& H: F  I
     s->next=head;8 J- a* d$ \- o  W
     p->next=s;p=p->next;) Y( |5 |6 T' q7 g/ G3 s
    }2 E  C+ V( x" T( l
    p=head;
7 p. R. R3 H, w7 g/ ]+ b- x8 Y: {   for(;;)" _( ~% i+ x! ^  K& K" P; s" ^& p
    {if(p->flag==1)
1 o$ E3 e" {) i3 i9 B       count++;3 M- q6 H) E& o3 H2 O# {$ Y* a
     if(count==N)
+ E& e6 G! R$ ]& ^: G$ d; Y        {p->flag=0;
3 s4 R' g( E: V0 d( x' [" l         count=0;
, v4 Z0 ]8 _0 f8 n1 l6 \, ?& L         sum++;}1 l3 h8 E( s" l$ S/ ]  W8 `9 V# Q. A
     if(sum==M-1)" Q# V  r' q( o# d3 }4 }) C2 A
        break;
; V4 O: I# z* I2 ~     p=p->next;
# T7 k9 R* g' f4 D    }& O9 L7 V! K4 a5 I# b5 V
    p=
) e2 P9 D1 Z2 n3 |; {; ^1 p    head;
7 [. L9 n3 g5 ^, d    for(i=1;i<=M;i++)
6 j$ Q, g0 o. h7 e5 m; z& A2 p, x    { if(p->flag==1)( R. U* [1 `0 X" i. E3 s
        printf("\t%d",p->number);8 Y$ y4 ?& C$ W' u
      p=p->next;* l9 y( }! j5 F4 q
    }. b2 P) d1 d8 T$ t7 y
- y9 e+ Q+ O- |. T

  z7 F; l3 e* W2 b8 X: @4 K. i1 ?) t/ S; |2 _
}
; d/ k& H5 A( y. A
第二种方法:数组4 ~) E6 y6 J( p
#include<stdio.h>+ Z+ a5 y$ H( J+ g
#define M 8
* k/ U/ j. I" dstruct monkey* `% m8 Q  ?' b1 \1 [7 }+ k  Z9 k
{int number;) _0 [& }! z' A) u' Q
int nextp;  D; ]9 @4 B1 y9 i2 ~
}link[M+1];. k  o9 L' H" _8 c% @
) m* F+ g- t* f
void main()/ _0 i0 Y9 h7 n& E8 _: D0 w, q$ b
{int i,count,h;
% `9 k9 x! s4 I( O6 o+ ^0 T) [5 \for(i=1;i<=M;i++)! e2 G3 S0 p9 H' c, V% h6 o% k
{  if(i==M)7 `# n6 f7 M/ @9 h3 W* ?
   link[i].nextp=1;7 R( O  m3 m# T' r% `
   else
0 C  g% w& Q4 m' [9 p   link[i].nextp=i+1;: Y" I3 |4 e+ n0 I
  link[i].number=i;
2 H; Q- h- ^7 M2 z}
8 [4 |  q9 q8 c1 |& M" b- R/ `3 cprintf("\n");
# m/ i: M8 J; F0 t8 icount=0;6 \" a2 o6 e* }8 L" K* e
h=M;
( E7 i  d* l8 g8 I3 Nprintf("依次退出的猴子: \n");
7 R4 S: N/ E6 iwhile(count<M-1), V- V- a% Q: P$ s9 B! F2 v
{i=0;
$ Q4 ?; l; Y/ x, Jwhile(i!=3)5 E3 M6 [1 e; T# d5 Q2 L. b' c, i
{ h=link[h].nextp;
, C, m7 v# M% [% g2 V0 I; y+ `   if(link[h].number)  Z" J; |2 Q4 D  `" x
     i++;}
& s5 }8 H$ ?' L2 s0 S7 A& l' p+ j( D* n
printf("%4d",link[h].number);
1 I% c  J6 q7 Z- K4 X6 Nlink[h].number=0;
" L& n! Y. L: a& [2 H: g& r" Bcount++;/ l0 g1 \6 n$ l- ?8 o; j0 W
}
* x- B, F' {/ }* t+ G
* {! |( {7 F; N0 |printf("\n大王是:");8 F+ b7 n8 p+ k* ^5 H' y
  for(i=1;i<=M;i++)% e% ~- v8 Y( j' x' G. \
  if(link[i].number)
3 {2 o8 Z+ q! d; T    printf("%3d\n",link[i].number);+ j9 {7 U; e, ]4 J6 k
# K! F& S( A* ^% m, s9 |3 w$ s* N6 ]# ]
- y5 Q% Y  ?9 G3 }
}

) z  q8 Q4 X7 x第三种是普通方法for循环
) z3 r5 Q5 E: E- c: L
#include<stdio.h>
1 S1 M7 p9 L( W1 ~% G4 A1 Ovoid main()
! g! ^# t  `* |/ Y3 J' k: K{ int i,k,m,n,num[50],q,*p;0 q9 ~9 p  N: \  o0 |* `
    clrscr();* e0 f: ^6 h: M. {% P: `$ S
   printf("input number of person: n=");
5 S9 i& H. g0 u# z3 l3 I, }8 ?* B    scanf("%d",&n);7 E2 L) k& L& U1 v' h5 Y
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
8 U/ @! R( o* i. \2 ?# U2 f8 y    scanf("%d",&q);) A  y$ m, |# K2 m: i, ~4 U
   p=num;/ n) E9 R$ j7 r, }' D1 T& u
  for(i=0;i<n;i++)
0 V" k3 M# `# Z1 y4 z2 a    *(p+i)=i+1;( _  K& ]& c% Y; ]0 C1 ]$ k) f& e- j
   i=0;
/ T6 f) b0 K/ n; b7 [' n9 Z   k=0;
3 O5 f% M0 }1 ]" C! u: u8 n   m=0;+ e& \4 L7 c" V# d8 g1 ~0 [, T
  while(m<n-1)
9 N9 D+ d* u/ |6 w' h   {if(*(p+i)!=0) k++;  A& E& B4 _% ]* i5 A& C0 f% ?5 }- z* P
     if(k==q)
+ }- M- i! j- B7 ~      { *(p+i)=0;
$ h5 @- d; E! ?8 P5 s  E) ]        k=0;
7 w; T% s4 K; q2 C! A6 n        m++;5 v7 @' @* y# R- c6 `1 |8 L: }
      }
9 v" U$ O% [# W4 C( a$ e9 G    i++;* a3 i2 a$ I2 L
    if(i==n)i=0;( Y$ h3 Z3 i/ q! v8 @% Y! |# A
   }; h- O6 i  a( s; _! h
  while(*p==0)p++;" n) Q3 @5 K: Q* K, r, }/ A
    printf("The last one is NO:%d\n",*p);
' H/ A. i/ P0 {     getch();6 C8 v' v. ^9 @( Z# M" B* V
# P% |1 U' |; N" x, D" D3 U
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
4 j  `/ j/ `6 ?* a" |% y& Lnamespace 又费马达又费电
$ Z- ~9 W( W5 O2 L& f. o{
- _0 y2 w, r" M6 K7 d8 S; r    class Program
8 p6 x- P8 a+ o- x- \7 H    {: Z& B' j' f8 g! f, m! S
        static void Main(string[] args)$ S2 J' p6 Z" e, B8 @  A: ~
        {1 g, S: m2 ?- R5 l3 R: {
            int m, n;3 @# w! ^. G( @" V
            Console.WriteLine("请输入数组长度");. k2 ^$ ?5 ^6 W( m, A
            m = int.Parse(Console.ReadLine());//m为数组的大小
0 K" b4 x1 V% [% Y# v  ~1 E. V- h            Console.WriteLine("请输入要截取数字的大小");: m1 s- y- n7 v$ W
            n = int.Parse(Console.ReadLine());
7 j5 U: v0 p  ^! u" X            int [] numw=new int" }( t$ I. \6 U7 K) m0 _9 t( Y

2 z6 s, w3 A" E$ f6 F3 Y&shy;&shy;&shy;;' j% p0 y" K# V* ?7 G
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
6 l. G& ?2 T/ h" @$ H            {! I2 d+ E7 B$ x
                numw[j - 1] = j;2 w9 g2 H! }- H) g  D1 s: f
            }
* x+ h7 y+ h# R! b9 r+ ?$ s+ }2 u            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
5 k2 X  U- ?" O, g            while (d != m - 1)
" ~( F; c/ z* I! a) @9 h( J! `            {; ?$ z  H6 Z# B0 F: Y
                if (i == m && d != m - 1)' t3 K0 u; Z$ p
                {
+ B2 x% s! o) O6 U2 k. H0 u                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!0 s- Q# S$ r6 H" e5 J. M* v
                    continue;3 S, h# o9 ~( e# K/ ~1 C( p" h% G
                }& d3 `; t! g; }- B3 \/ y: ?7 E
                else. K9 N3 z$ Y) W+ T" w' p. w
                {1 K2 _8 ^1 z0 R* W* L. `0 r. m
                    if (numw[i] != 0)
. q; ~) [; D$ ^2 i8 K6 E# Y                    {
6 h( h( E. i1 A2 |; b! B                        i++;
2 G8 A. ^4 F  n& _- B0 J3 @  t" B8 V                        k++;0 A( x- B3 m7 b
                        if (k == n); d0 C; G2 C( T  x$ ^
                        {# G3 m8 _7 n7 ?! A
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了# o! \  c, O3 `/ A6 [/ Y: x  I
                            k = 0;! _) p) |' Y- Q! t8 M7 o8 D1 ~* w# ~
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
4 O* a+ m0 X+ ?; _                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);; y( F" N3 t5 }9 |$ h
                        }
& U! _& z/ t# ^. s9 c; b( Q                        else//输出暂时还没有改变数组元素的值
) Y4 d9 ]4 c* c/ u( H. P( d' [' a                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; \6 L$ k1 z$ H2 E( Q+ Q/ K                    }
- g9 O. S. X- G# M# u                    else
1 e2 [# ^  C  P6 {3 @6 G                        i++;//数组元素为0,直接跳过,不计数。。。
* a2 o. R( a$ P- {  B                }% l3 L9 b* V" `0 G
" b+ T+ l3 x' ]( f& l8 ~2 k; D

( p9 d! I2 ~3 Q  M( Q, n            }//结束while循环% h3 X; y3 e  J  ?
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦+ p& Z/ d+ X( ~( u! X' _
           + m8 v/ Y- b/ z$ T# a, o
                if (numw[i] != 0)
' \; S% `# r- m, A" z$ c* w& J  T                    Console.WriteLine(numw[i]);" A- K1 O( w4 A
           % e/ l# v2 q5 Y
            Console.ReadLine();7 X. q. n5 P% P
        }
5 `- n5 V8 x1 q) S    }4 q' b. F2 ]( A4 z
}0 F6 d0 |& }* F" ?- I+ R3 h3 g, [
小甲鱼最新课程 -> 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-3-27 15:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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