鱼C论坛

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

猴子问题

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

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

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

x
大家好!
) O& B) d5 Z0 b/ e8 U& T, n7 b这几天我在忙着编一个问题,我用了一种方法编出来!% d) \2 f) u$ W; d
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!4 [! W& i" N1 A/ G. y
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 . T: K5 L& z  V; t5 K% Y  L

" d, F! j& g" _' V2 V( Q& x
, L+ o5 S* Q* K# U) j: t, x
                            题目
, G. t, P2 h, h+ d) Z3 i$ a: P9 |山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。& L9 f/ m4 |4 h+ ?
第一种方法:利用循环链表/ f2 t* F) S. |: g
#include<stdio.h>& N' f* O5 M2 C: _+ R
#include<malloc.h>1 v& G" ]5 b6 r( t& ?0 F9 f+ e
#define M 8            //共有8只猴子
' b$ c9 D. I& _: _6 G$ B4 q8 p#define N 3            //数到3只时退出第三只
. F# P7 _+ d* x" A) Stypedef struct monkey% b% P# Y3 G; R0 z- Y
{int number;
/ c) D9 A) |" D6 W3 q6 e' i0 _int flag;) z# e  g# C9 @
struct monkey* next;0 Q9 D8 v  Q9 f8 s- S
}MONKEY;
! J" N; U: @6 ]& R3 s2 jmain()5 l, v0 J& y' v2 a) N. V3 ]  U
{ MONKEY *head=NULL,*p,*s;
3 `5 ~( H2 I3 r6 ?; c  int i,sum=0,count=0;
9 F. ~2 \) I0 [% e9 l2 I3 Z  clrscr();              //清屏
$ X9 J& ?5 u5 [  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存3 x  A# w! [5 G  J$ @# x; h; n
  p->number=1;p->flag=1;
6 a# P) S) C7 Q! i' h( B  p->next=head;
: f# m" i3 x( o! q, }  `7 [( ]  head=p;
0 g. x! f# d" S* a0 @6 G2 {  g/ ?  for(i=2;i<=M;i++)
) |2 W4 Q' \/ h1 N- U+ Q    { s=(MONKEY *)malloc(sizeof(MONKEY));
. U# h. g' ]/ Q5 J) ~3 ?4 F     s->number=i;s->flag=1;
  ?6 d; v7 f/ }2 p7 s- B- h     s->next=head;
% w- B2 U6 q  t. K     p->next=s;p=p->next;
; V$ R5 J2 C0 R9 f& |! ?7 f    }
. F! X6 R$ |7 i: B% o! B    p=head;
- B" w% u" Q$ M( G$ D- F+ L   for(;;), E5 W% B6 @' q+ I1 @
    {if(p->flag==1)) C+ p* |( b0 B  \, `( _
       count++;
9 M, \5 t7 i$ S% ~$ f( L) y     if(count==N)
1 f6 D+ p: ]) u* m$ m        {p->flag=0;
6 t- e* x$ u  ~: D         count=0;
) V8 E8 v2 a* J* Z( k         sum++;}0 W. Y- M" Z  d
     if(sum==M-1)# C! a! J4 C1 o+ K9 x) v2 Z7 a: L  s
        break;
" t$ Q$ F( U. C4 F7 `3 A% y! N  y     p=p->next;2 `8 k. o& N7 U* D2 z$ q: `: f
    }
5 X: F" S+ B9 D+ C: A+ F  t6 ?9 J    p=
  a+ G# M# |# \    head;
, O- }: r6 }( ~: t    for(i=1;i<=M;i++)! z0 v' Z# p% }) f: {( F
    { if(p->flag==1)
2 z9 a3 [( s* u8 i        printf("\t%d",p->number);& K, @8 G* u* q
      p=p->next;; F0 ]4 T6 A8 N( v8 L
    }3 s5 o3 `' ]$ z& f9 e- [2 ~
9 ~: V4 n( o# ~- }( I7 n* \

8 F) D3 _0 d, z9 {- Y- }' }: |0 [7 o: D( {; ~  ?, N4 h
}
, W4 F1 p0 u3 ^- _% G/ i
第二种方法:数组
2 z( S, k( S; {3 y1 [: G- l/ z! f#include<stdio.h>4 U$ h% D* b8 N# J' C
#define M 84 _/ \$ y0 {" f8 `+ n& }* i3 a* J2 N
struct monkey# O2 E) z& }6 g8 a: A( h
{int number;6 N  \8 Z4 G* W1 E5 E
int nextp;
+ S$ e- Z+ c* @$ h, B  s}link[M+1];2 }) Z+ {# L9 p. g
: F/ r) k) n6 X+ R2 f9 P
void main()
, h: x" z  T4 M' U9 m7 d{int i,count,h;
. [2 u$ @7 a' u+ T9 E6 l( Yfor(i=1;i<=M;i++)
; F: C3 ?" m% r1 d) j7 P{  if(i==M)7 V' i2 |  v2 Y
   link[i].nextp=1;
3 q* J, b# H; i' U- e; H   else% Z* M  e2 g2 d# u4 X
   link[i].nextp=i+1;6 e5 h2 }6 Y, P! o2 w6 J
  link[i].number=i;
9 E* `; I0 d( E  ]6 C& g}
  H2 Q0 U5 o4 d( x  m5 ]3 c5 O; Qprintf("\n");0 V! ]8 y$ V; n3 `: N! e
count=0;
  `; J9 Y6 [' t# F5 R9 n3 n, q1 ^1 ih=M;# O1 k" S2 E1 o' [, Y5 g0 J# e
printf("依次退出的猴子: \n");% I. \. y  g. S% E) |
while(count<M-1)
0 v* i; Y4 l3 O{i=0;. I3 Y/ B# u9 p$ z
while(i!=3)! Y0 X$ m, q2 Y) L0 H1 @
{ h=link[h].nextp;
1 r0 y$ t: m* J; V6 D0 ~$ H- f   if(link[h].number)
; s# \5 `0 v1 o1 [1 z8 n! G     i++;}
0 y; a7 d2 P2 _; c1 O: D$ k6 W( n5 @" G
printf("%4d",link[h].number);
6 y& U; d. [/ d( v4 A9 O& Glink[h].number=0;# o% R5 J9 V- S5 d4 Q% c
count++;
0 [9 a) ]7 s, b; p9 ], w/ t}' _+ K% O" c8 A2 J8 Q! @
% w: {) o/ u1 v2 n
printf("\n大王是:");, p3 k* P6 l. b
  for(i=1;i<=M;i++)
* O' z' J) U% U  if(link[i].number)
6 u4 S* H7 _1 T, v* x$ f  W    printf("%3d\n",link[i].number);
+ y% s, t+ C8 ]2 j' ~' d$ p5 A7 N+ j* s" u2 O

# L) a! e; t& D  q- F+ }- h}

! O! y( X* l: ]. n( C第三种是普通方法for循环
1 ^' ]  z$ ]- V9 Z* r4 G0 P
#include<stdio.h>$ Z9 }! s5 x  ]- U% s
void main()5 `) Z! I. i9 [; |, g' N
{ int i,k,m,n,num[50],q,*p;
7 G- B% K' Y! P$ s    clrscr();+ Z, U' M4 t# G! ^
   printf("input number of person: n=");
1 I8 _! V1 d; \( ]    scanf("%d",&n);' G* X/ W6 E7 _. R% R* A" M  @' }
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
1 J+ o- c, V' x% _    scanf("%d",&q);# p) y  H6 G3 ^& R6 V) E
   p=num;
' w! R4 D9 K7 l* b  for(i=0;i<n;i++)/ l, O# _3 c; N% @5 P, J$ I( P6 f1 \
    *(p+i)=i+1;6 U% x& X, B9 }- a
   i=0;
' h4 m  x, P* @+ q$ w, S) v   k=0;
- k1 ?8 f/ @' G( o, Z  r$ y& k# J* c   m=0;* X: N  Y5 W  I1 g) m
  while(m<n-1)/ ~% o# M- W' E; ^
   {if(*(p+i)!=0) k++;
2 S, u6 h) {8 e, F     if(k==q)
( `5 l( A1 B: m! L& c; ~      { *(p+i)=0;1 v. ?: E5 i; W* J. E% `0 M  ]
        k=0;0 d6 {! }. o8 p8 i' V
        m++;; U4 t+ s! W, M  I' u
      }
$ M% s- U, {7 i! b    i++;
; o9 ^9 N. B  M+ C9 D1 L* ]3 D    if(i==n)i=0;4 z/ P% |! v2 ?/ O
   }
8 B  F( [8 U1 w) t( i6 O9 Y. V& m  while(*p==0)p++;9 x$ Y' E( T0 A. |
    printf("The last one is NO:%d\n",*p);1 G7 E1 d. {8 ^/ \0 f" l' ^
     getch();
1 v2 y: X8 H! z  }' u( o% v5 ?" h2 V2 l* y$ Y2 ?0 V
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
* n3 m+ @3 W$ r, \7 t" Hnamespace 又费马达又费电
. Y- N$ O% A! a, B) F7 r9 T( r{  H) q2 b4 u' r: L) Z' O  g' [8 E# N
    class Program
  v0 N0 x. w7 x- Q    {$ Y1 @; e* ?7 s! k) g) I# ?
        static void Main(string[] args)! g, I$ ~8 w% D. ]5 U2 g+ X  U
        {
- L2 G9 U0 o8 C! G+ r            int m, n;) G+ m2 ~' q" d1 [
            Console.WriteLine("请输入数组长度");
! y7 J1 r7 b' t& e( y. T            m = int.Parse(Console.ReadLine());//m为数组的大小
6 y; O& e5 ~; j' u& Z& z9 E            Console.WriteLine("请输入要截取数字的大小");" B3 z: o5 R4 [6 c7 D0 S$ d
            n = int.Parse(Console.ReadLine());" K: Z0 w' _) G) S  B. y, q! W. H6 N
            int [] numw=new int
0 v+ [5 L' Q& w4 C6 O2 B9 [" o8 |4 g8 D1 ]
&shy;&shy;&shy;;  G% y4 d) {, @, H! F( M
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数4 J5 z6 a9 P9 F7 b  v
            {
! Z+ u9 N- a- s& e1 _2 E                numw[j - 1] = j;
/ ^5 }- v) m& S. l! s            }
0 p" T0 j( Q' n  f            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
  e+ G* O/ Y7 {  p; p4 m            while (d != m - 1)
7 `; _% |" e( U' ^7 \: @            {
( d) K7 ^4 l# G2 Z! i& a7 M                if (i == m && d != m - 1)
0 ?, v6 L4 Z2 ?                {3 d6 ^' K! H: C! [% h7 w
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
2 l+ H+ L! i2 |0 l8 R                    continue;
8 l0 j! F7 G. f8 U- O                }6 H% X* p0 ]) q) o7 T# |6 R
                else, {3 B5 l  ]; B4 Z2 \: o( \" `
                {
' S2 ]* x- h/ X) N                    if (numw[i] != 0), _* Z( X: X; B: a0 t1 D7 ~8 j2 ]
                    {
# E7 R" z, }- `( R) I5 e, @                        i++;
4 @9 d) \: p, G                        k++;0 v9 E' _) b' W5 s' |
                        if (k == n)
1 K& o2 d# Y% t. |9 X                        {. R0 j6 ~+ _& |
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
3 Z4 K  n0 K; s# O# q0 B6 Y, M' G" b                            k = 0;
% N1 W: a) n! g              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
' s, L" S/ b- h& ]( I8 ?* `& b                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);6 |: j. S8 U; _
                        }$ t& K( b2 u8 A! d' }7 @
                        else//输出暂时还没有改变数组元素的值
7 ]9 a/ w( w) s( s3 T1 R% ]4 v                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
* `* C! L) G7 a3 a1 ]) O( W; o5 W$ j                    }! N: }. r/ D$ ?* Z2 i1 w4 U
                    else0 K2 S) Y: @, a8 P' I
                        i++;//数组元素为0,直接跳过,不计数。。。$ z: z; W3 Q' `
                }
3 X0 E3 o9 f# i+ Q* g% P ! L8 ~( Z" |; r- `
9 [3 ?, M+ _  t% b5 n+ O7 Y
            }//结束while循环8 J/ \( \% _4 J/ g; S8 k8 }
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
( J: w5 z! m) _8 @  B) l           
9 z# I: E% y# }5 |% {                if (numw[i] != 0)( K& N* i. w# k+ {$ D# _7 g  i5 `" E
                    Console.WriteLine(numw[i]);
, `8 V/ w5 ~1 K0 J8 ~/ J+ J( U6 Z$ _           5 ^* b* l* V* t
            Console.ReadLine();0 @3 N8 x) I! a) z9 |8 H
        }
4 v0 s6 U6 b6 @* p2 \! O# Q; h    }
6 q* I! v/ _2 n2 m& }# G. L}( M  N9 Y) T/ Y
小甲鱼最新课程 -> 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-4 01:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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