鱼C论坛

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

猴子问题

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

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

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

x
大家好!3 B7 Q! ?/ |" ^
这几天我在忙着编一个问题,我用了一种方法编出来!
- d/ C6 r4 t( Z5 d1 c但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!- d8 v$ P9 R( E
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
5 G4 f6 t2 H0 _& J$ X
0 L8 [) Z, r+ A- }7 ^2 a
9 |7 u8 V" w  F0 a1 s
                            题目
3 H( q4 j: a; T2 K) D) C山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。" Z- }' Z3 S5 k/ G- d6 u3 i
第一种方法:利用循环链表/ J" D( l" Q8 a3 j) f
#include<stdio.h>: W3 l: j6 a2 Y
#include<malloc.h>( f6 j1 Y1 c6 g. a$ O, G' u
#define M 8            //共有8只猴子
0 C" L  |0 {2 w1 k. U  |#define N 3            //数到3只时退出第三只
8 [9 d* Y2 e. R0 S& M3 C* Ytypedef struct monkey7 k3 N4 y6 Z: A: [% Q. ^
{int number;
, p6 D! h/ c, W2 a" z- [5 |int flag;
( B2 [- O3 {' Hstruct monkey* next;1 J& }( d1 V8 T5 B  D: |$ y
}MONKEY;1 T" i& g9 G5 B. k+ d) S2 q" h
main()
2 ?) D8 ]* h" B, C2 \{ MONKEY *head=NULL,*p,*s;" z/ r7 j1 H# o8 H7 S% e
  int i,sum=0,count=0;
- R" L. \0 q) \) A8 y. c( z" M  clrscr();              //清屏$ H8 V* r( w5 a6 F
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存0 c' i3 s, s" p$ I
  p->number=1;p->flag=1;5 J2 F( Y, ]8 `& y
  p->next=head;: l6 Z' ]* }+ i. k
  head=p;; T: ]- n) f5 e# j- H% F
  for(i=2;i<=M;i++)) I+ \4 A1 O# }. }) T8 ?
    { s=(MONKEY *)malloc(sizeof(MONKEY));2 {% z7 o9 a2 K. ?
     s->number=i;s->flag=1;( m2 L% {( @. g3 p6 M  O# c
     s->next=head;
0 K2 P2 E/ Y0 `' A; u& m     p->next=s;p=p->next;
  \5 s9 S2 I. F; i5 K    }
0 D: D( W( C* b2 K& J0 z0 q# D6 c  w2 G    p=head;- K& m- z! x9 u; h' S9 c( ?
   for(;;)
9 S2 a" R5 p# i- t2 j' H0 u    {if(p->flag==1)
: d$ E. T. d+ A! R, `" W7 B: f       count++;
7 a* O2 [3 C$ ~$ _9 X     if(count==N), s1 S* S# I* B
        {p->flag=0;
6 M9 i) D) d- t% m2 K         count=0;7 @6 \3 R; V- `' s  R
         sum++;}
$ @: y9 S: `6 j2 q     if(sum==M-1): O# B: M1 P4 M9 @. W5 a: S
        break;
( T6 O' n$ c+ E" M& K: A+ [     p=p->next;* s) t9 E. m6 E' O* M4 x  R; m% k  ]
    }
- Y0 T5 Q0 A/ U8 x7 J    p=" B2 P# G! H, l2 z. Z- z+ r. C/ ?
    head;
. ]. `. @* Y: S" ?/ x  k8 j    for(i=1;i<=M;i++)
' W' A0 O- h( y& ?. c2 T    { if(p->flag==1)/ y# e0 y: {/ g2 x: c3 C' d
        printf("\t%d",p->number);4 d$ S3 @" U- y% ^$ e
      p=p->next;) r" k$ {7 f2 j8 y8 `& R
    }# o6 H' Q" \  x& \. B4 X) `
/ X$ ~) r; v( v3 ?" B
# \+ ]) B- p- x% q3 A1 k7 \
% F3 {! O/ E& h+ c+ ?
}
  v9 k5 z) \& P" t& D+ l" J
第二种方法:数组6 E8 C! N" _/ `+ e. n9 _1 m9 J
#include<stdio.h># a+ i3 W# J6 z( M
#define M 8! O5 C9 G( a8 L) s1 w% ]
struct monkey/ V$ G- `4 z8 S( b1 t
{int number;2 _  @* U8 h0 t( d, }$ d# a
int nextp;
7 q4 Y& H( {  m* S" m. y/ D}link[M+1];
9 U. Y% ?/ n0 X
5 }, Y# h- s! x0 n9 r" O8 L" Vvoid main()  p& S0 @2 E+ }
{int i,count,h;2 T! K. U4 ?& z9 R8 @2 {
for(i=1;i<=M;i++)2 X+ R3 q! H! r# D
{  if(i==M)
- Z1 [/ n; A, o; e) d   link[i].nextp=1;+ Z5 h+ x  @) n4 z5 E6 Q: s' B4 ?
   else
+ P$ ^" W  ]- N- c7 J   link[i].nextp=i+1;$ q* S2 T. R. |( U: t0 E
  link[i].number=i;% Q) |# u' B5 e' R+ K
}
5 G; f$ B; }* \' S, P. G4 Cprintf("\n");
3 Y( P& q, e. j: `count=0;
) f; p6 ]3 e* R% xh=M;$ V! z* c/ n( }- k7 Q2 \1 ~& F3 N  |% V
printf("依次退出的猴子: \n");: r. m. j4 T+ \% w
while(count<M-1)
7 R: D- B8 H4 V& W% {" g7 s{i=0;: i0 T( i- h! A$ b$ D! E
while(i!=3)
3 V; a& c- }/ F. e{ h=link[h].nextp;0 N$ D: y8 c- @# ~1 O
   if(link[h].number)! G, _+ Y  j1 Y8 S$ Q7 }
     i++;}
9 r' G  B: q! o, }! U
, w1 T0 r+ U# d% h' X* O; D3 D0 ], V1 nprintf("%4d",link[h].number);
% c! v  N- x2 O. c8 }. |$ V( slink[h].number=0;
( a& t6 C' o6 gcount++;" D0 t9 \6 ?4 g( d
}
# t8 I2 A5 G. f. Q0 m  Y) J' Y( c# ]5 c
printf("\n大王是:");" J& g! M0 n9 B- z
  for(i=1;i<=M;i++), B/ W5 r  s4 t" ]
  if(link[i].number)& C6 [6 u; ^) m) q- q$ z; |
    printf("%3d\n",link[i].number);
  W  ]" L  C/ r* \
2 f* e; z4 V2 X1 o2 e6 h3 A9 C
0 i: j% ?! x; s& m}
9 w! s# L1 J; s, l) O. ]' }1 B" R
第三种是普通方法for循环
6 F( |, l1 h' J4 w9 A7 _. f
#include<stdio.h>
+ F% B/ |. D& j1 @) v0 p# B# J" Gvoid main()8 @# o* O2 T2 E7 H( @
{ int i,k,m,n,num[50],q,*p;
9 @& [( a! h4 }$ p* f$ w    clrscr();
7 B5 J0 W* Y6 x) ]   printf("input number of person: n=");( |, T% v" K8 c8 j  V
    scanf("%d",&n);
, x7 M+ c; W( N1 Q* Yprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只6 Q& `) p, }! V1 s( X% d
    scanf("%d",&q);2 e, D- S' x# H3 \4 i
   p=num;
/ O" y5 l1 T6 ^, _- ]; w+ l/ {  for(i=0;i<n;i++)' R7 V) R' S, U2 O
    *(p+i)=i+1;, e3 @: F9 K. f' q8 ]
   i=0;! R4 V7 a7 X" T3 C4 Y+ c  O: S5 a; z
   k=0;
& @* T5 ^/ R" Q: T# ~. r9 p   m=0;: D6 N5 B' c& q) F
  while(m<n-1)
; a- y9 m! C' N: V1 n$ a   {if(*(p+i)!=0) k++;
* d3 ^3 r6 N# N$ C     if(k==q)# m# Q4 w; U" \, z6 w9 U
      { *(p+i)=0;2 G# [$ |7 A1 M. G& e, e8 b
        k=0;
2 }1 W7 ?# x* z        m++;
8 P' T# `7 Z% i9 Z. E* a" m      }
. ^* ~0 e9 `. K; d  F1 S- _+ n    i++;9 M5 n2 W; ?2 G) F
    if(i==n)i=0;7 s$ y2 S  L5 T+ q  `+ c
   }5 j+ y+ \' G4 b+ M3 f# H
  while(*p==0)p++;
8 y# G$ B  t6 Z& z8 y9 w    printf("The last one is NO:%d\n",*p);
- x' y: p) A2 f; O0 M2 h     getch();
  W* n/ P6 G+ A9 @  O2 }7 N$ B" c- C9 d6 J, r# W, a% G! F1 r
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
; L" \. V- Y1 v( Nnamespace 又费马达又费电" f6 c( s$ n/ F2 W& h. w7 E
{
4 W0 q- n8 W# `3 m6 }1 }    class Program9 g* q- U" [- p+ T; h( T+ ~
    {
* N( n$ \  L1 o! \        static void Main(string[] args)  k2 l: H7 R- [! ]- F2 Z" B
        {' u2 T# `+ S( x; _/ j
            int m, n;
4 b7 ]( z* l. k            Console.WriteLine("请输入数组长度");
/ M7 \9 S' G& {5 r6 x            m = int.Parse(Console.ReadLine());//m为数组的大小
+ [" l  X( I8 s+ ~* K$ `6 I- y            Console.WriteLine("请输入要截取数字的大小");
3 \  |, k5 @5 ]  {1 e            n = int.Parse(Console.ReadLine());
( r5 F, T, j' H) Y9 y: `0 ?            int [] numw=new int
  c& n, v5 W$ u% C
7 F; t! M6 C7 Z. O+ g' @) h+ N&shy;&shy;&shy;;
/ _# k& U! i! _# {  x4 B7 N$ o            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数9 `5 o5 T- n  L! c
            {9 b& Z8 v; ?  N9 P/ K
                numw[j - 1] = j;; B  J- P+ H$ d8 @
            }! P: h/ n& I" i; o6 [) r# M) Q" O
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
# Y, d0 b* A, C# J            while (d != m - 1)
! D0 k2 O/ A# K; x0 w            {
3 I# N, {% f% L7 x" `! ^2 W2 y/ o                if (i == m && d != m - 1)
0 x# X3 Y5 j4 w, E% h3 O4 ]- G                {% ^1 t3 E2 q; u, o9 C$ A& d/ g4 K
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!! b, r1 S8 ?" u4 k( ?8 v
                    continue;8 y6 A5 n. b" ?+ x( F0 g
                }1 Z( z4 l* S7 s  m
                else/ U5 ]9 _# f0 Z& e8 Q
                {
+ `# i" W* w: T& M8 h: E9 c                    if (numw[i] != 0)- [0 g$ |% ?# U# S# |9 `8 c+ `
                    {. G( ~9 ~) P+ h) D) X, Z  j! E! K
                        i++;
6 V1 i* W7 Q* p9 o& O5 `                        k++;
0 \* A* A; U9 L9 C3 m% B4 b* R. C                        if (k == n)
# _1 H0 p6 A/ B+ H+ L; U% j                        {: p4 G: g7 C! c2 w/ M4 \
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
- v: B! h" w. N& v0 y9 |5 E                            k = 0;; c) }, u, R5 m+ _" n
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小19 x0 c. ]2 }  k, T1 d$ D
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
: }: q1 U/ S/ @! K, g                        }$ t+ {/ _% m1 ?
                        else//输出暂时还没有改变数组元素的值$ g' ^3 F$ C! |# ^4 m7 T0 i
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
: L8 u8 v) n1 X5 H6 g                    }
9 ^7 d  @  w  f- f! L                    else
0 X9 D$ M8 R( d: q$ t/ o9 `( f& z                        i++;//数组元素为0,直接跳过,不计数。。。, W6 h0 L' x- m/ |* v2 M4 Y
                }+ m4 n+ I) t& X* F/ l8 F+ a

; V4 b3 j9 _: f
" A1 i2 g; N  G. i2 a7 a+ e. G) D            }//结束while循环
5 y4 W! g; f: j5 Y. i            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
8 ~2 z! {4 @$ Y           
) `+ f6 O" [! S7 h& u" I! K4 l! q                if (numw[i] != 0)9 K9 R5 u; h' R, Z1 V1 _
                    Console.WriteLine(numw[i]);8 ~4 N7 q( ?5 _' L; w
           8 B+ w) B9 Q: f% W1 M7 U4 c5 z
            Console.ReadLine();
+ R4 I& A& }3 a; q; [6 ?        }# b# r& n1 m( A: @. J- [
    }
( Y$ N- c9 o. O6 I6 D+ j, X}" y0 x# O! B5 Y2 z" k: z$ _* f! _
小甲鱼最新课程 -> 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-2-17 22:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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