鱼C论坛

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

猴子问题

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

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

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

x
大家好!1 X% P- G) u2 I& j1 S- M
这几天我在忙着编一个问题,我用了一种方法编出来!
$ i% W: r1 E; l. V7 t/ ^但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
+ H% p& o( h+ v, U注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
! p+ X# i. |* H/ e5 r
8 N- d. j& }: b. a0 }. S7 o8 M& P+ d. A5 }, k- y
                            题目
  B4 k+ j0 ~& r( X! u4 e2 G山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
7 b0 ?! P: r8 y4 Z) P2 I6 S, S第一种方法:利用循环链表6 L0 @+ T, X$ |4 a
#include<stdio.h>
! F" m1 r3 @) C& I& I& a/ k; K( w#include<malloc.h>
) p, _% k* Y- R#define M 8            //共有8只猴子2 E+ H$ ^% y; s# |- J% ?
#define N 3            //数到3只时退出第三只. `. V4 s7 N- y
typedef struct monkey
( h( R8 T* r+ d{int number;
: j. n. I( ^, k, l" Yint flag;
, X3 A( r$ X5 p2 |6 k/ qstruct monkey* next;
+ E: B+ F9 t9 T/ d" X: f! D}MONKEY;- T( r$ i6 L+ ^" f  X5 Y
main()
' }; U7 y/ x8 _( g" b9 e{ MONKEY *head=NULL,*p,*s;
  d; k* i  o3 Y) o9 \) M  int i,sum=0,count=0;( p; N0 s7 O" O, N2 I9 }. V
  clrscr();              //清屏
# Z. G$ l: T2 {  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
' N% J( Y1 T7 ]( ~' w+ R  p->number=1;p->flag=1;
& j; G, d7 [5 U9 ~$ d6 v- _  p->next=head;+ S5 Q& {& {  }/ m) p
  head=p;
; z. a& z, s, f* k, j! e" R  for(i=2;i<=M;i++)
1 S; m" }. o+ O% \: m! d    { s=(MONKEY *)malloc(sizeof(MONKEY));
% I# z9 g- I! n% _* f% p: b9 U     s->number=i;s->flag=1;" ^) q7 S2 k6 A7 c  [
     s->next=head;+ K  I+ O8 t" A9 d1 G6 o
     p->next=s;p=p->next;
4 J0 l7 J) ^& y( Z; o    }9 B& n( w; S  D' u
    p=head;: _' g6 v4 ]* S9 A9 m
   for(;;)4 P9 b% a3 i! d, y: i* T
    {if(p->flag==1)
& E! l- C* M# J5 z6 Z* X' w7 o& d7 e; {       count++;
& f0 a4 Z: u9 m     if(count==N)+ T2 K, ^; j$ f( Z# f
        {p->flag=0;
, |$ e' O9 |( @% x$ @, O4 O) J) p         count=0;
- C" X9 D: D1 b! Q& B0 C3 Y         sum++;}
" N0 M9 M. Q  W* b: S* J3 z     if(sum==M-1)! a+ n* u( j3 s7 w
        break;
/ a- @3 e: I$ c& j     p=p->next;0 Y. |4 |- O  ~
    }) b7 c6 O3 g/ R' l/ p+ V
    p=
) c& V1 s! \: @5 j    head;
$ t3 g1 d/ X  X* P9 l6 h0 w    for(i=1;i<=M;i++)- _/ w0 J' w6 m
    { if(p->flag==1)' J: D1 v& V' I/ `# ~" ?( _" e
        printf("\t%d",p->number);
9 C4 c# e$ [9 J4 r5 a. E7 m* |      p=p->next;; O1 K. ]) X3 P( b* v+ W
    }
6 F1 e2 z, u0 H* q/ x3 j8 u2 m* E

! [! @5 [' D1 Y: |
8 w5 I- F( O7 a' R6 }}

) |* v. G7 E, K第二种方法:数组8 U; Q5 K/ ^4 f7 g) |' e3 M
#include<stdio.h>& m' W- x) Y! A" f
#define M 80 @# R. i& t: f
struct monkey; E( D4 X. V& m% i) t
{int number;
$ C2 V1 I8 W! [- s9 Cint nextp;  K& p' w- L. g* X* b* H" |
}link[M+1];/ Z/ v; O+ g' H
" F) ]% ]6 w8 \( d$ c- k
void main()
0 @; n2 J+ B9 |# @6 b1 g{int i,count,h;( Z9 A) O" e; g4 a2 f
for(i=1;i<=M;i++)
2 G; V$ k+ P7 V" x$ x{  if(i==M)2 i$ D0 ~5 R. ?3 k* C- |+ K& r' b* t
   link[i].nextp=1;
( ~: b! E; V# t! t   else1 W1 L5 C* S0 k" F, i/ C
   link[i].nextp=i+1;# _8 j+ H  i+ ~( z8 f# |1 I
  link[i].number=i;
* o. \9 _' X4 g) K% Y1 u0 H9 R}
1 g( A9 o' w; P9 ^) Y( x4 oprintf("\n");
: B6 k; c( _$ y. ^; L& x0 R$ J2 Jcount=0;% E# K& S; M4 [: z3 R
h=M;# h0 d! c2 L- R* ?% I* @+ b
printf("依次退出的猴子: \n");
# Q% P' u* _: U& rwhile(count<M-1)4 H! h  @4 H9 X/ O
{i=0;
- u" J; u1 M9 p- j  J1 ~5 l; @) pwhile(i!=3)
8 O5 [8 @2 }: X0 V{ h=link[h].nextp;
7 A+ L6 b2 `. Z  \  m: J' H" ~# }# f: B   if(link[h].number)! L7 D  {. I+ F1 s, n/ O
     i++;}
2 T# T4 k2 S0 z- c  E! {2 J1 |& `. p" S, l; E5 \' ^' U/ j
printf("%4d",link[h].number);' ?& y, ~) k: ~2 z2 Z
link[h].number=0;
* D) s2 M: L& ~count++;! F! F, x7 y, A
}
; R6 `0 _& _+ K1 ]
" f, c! K; \* x) j8 Zprintf("\n大王是:");
! A6 F9 k& ~1 {  for(i=1;i<=M;i++)
  r  G! Y% J6 }( O  if(link[i].number)
6 i2 n& k3 B- F1 C1 j# F0 q* ^5 I, G+ [    printf("%3d\n",link[i].number);. I. W$ t$ a! K- v3 a4 M% D! ]0 `

/ p" z; u: V) w, `7 P  \8 e* {9 t" E" A
}
4 o( P* @) ]* R( H' Z
第三种是普通方法for循环

, k3 q4 f% X8 A( y3 a) C, v#include<stdio.h>4 y6 Y2 \/ Q& Q0 V) j4 \- f) {1 k
void main()
: i$ F/ v! p, D7 C! t{ int i,k,m,n,num[50],q,*p;5 \( C5 x" _7 G/ x1 v; D# B
    clrscr();
- h) I* `" T, b9 D9 s0 }   printf("input number of person: n=");" V/ f0 S- k9 F
    scanf("%d",&n);: Z0 k9 X: m2 C, i8 w9 \+ y
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
0 h) ~+ V. p8 Y8 Y; j/ v    scanf("%d",&q);
/ m$ Y& r- D, ]0 L2 \2 Q   p=num;
5 ]1 t9 Q8 _1 j  for(i=0;i<n;i++)2 M2 Y7 y# v; ^4 D2 J8 F( x5 I2 e
    *(p+i)=i+1;# D. u* |4 [% |+ ^6 _  V8 O
   i=0;
) N; F" {& K5 C9 B" i0 v" _   k=0;
. @5 F, k# e3 R; J   m=0;( ^/ R- I! v8 C  K& o
  while(m<n-1)
2 b9 w1 }4 m/ r   {if(*(p+i)!=0) k++;5 G1 A1 q# m( k, R  @2 ?
     if(k==q)# X- c7 v! w3 I% h" C; @4 B
      { *(p+i)=0;' N0 N$ f0 a/ p  u4 s( h; U
        k=0;$ d* f- m5 o: a/ z, D$ m4 e
        m++;
/ u) H6 y7 \6 v2 ~      }3 ]2 o4 @( f( H5 N, t! i$ t
    i++;6 A& E" ~1 L8 e. z% ?
    if(i==n)i=0;
, B) O) w) ^" t3 X' v& p2 s( t   }
) J; v! t6 R$ |0 z# F  while(*p==0)p++;1 H6 P# f  [4 m& l" a  C
    printf("The last one is NO:%d\n",*p);; b- e4 }& t5 d- G1 d! o1 L# d4 X
     getch();1 ?/ O; T5 s6 F
% K& H5 N) U$ W
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
! T% [0 p. I2 K. \; M0 ]6 g7 z% gnamespace 又费马达又费电
5 L! W& u) i0 O8 g5 R{
3 k: B: P: k4 {  q2 d4 H% U1 ~' A    class Program% r# O0 q" Q2 V
    {- u% n1 q) H3 k; U2 b% A
        static void Main(string[] args)& e7 l8 P" U( ?' s; Z" D2 g
        {: E0 _% r" [, h0 B4 {( @
            int m, n;3 a8 C9 E4 d; [7 [6 K: R, \4 M
            Console.WriteLine("请输入数组长度");
' m5 Y: S1 K8 E            m = int.Parse(Console.ReadLine());//m为数组的大小# w1 V+ f/ T5 I5 l6 v& |5 \
            Console.WriteLine("请输入要截取数字的大小");
- b* a0 q9 o  l( E            n = int.Parse(Console.ReadLine());
% w9 y8 p' X8 M. J) h            int [] numw=new int
: \8 }3 j/ x& o' b' p& x: R9 w; X( G; ]* y) J/ o
&shy;&shy;&shy;;7 O7 ~+ x  `: g3 n8 j, m7 U6 a1 p1 a( i
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
" T9 y# q. `8 `: Z            {
9 y6 G  ]2 [: m4 c* V& |; R                numw[j - 1] = j;, |) U+ f" z: p3 X+ D$ l
            }
, i, C6 k9 R9 T3 X0 r            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
* ]1 Y; B2 C/ ]9 ~# H            while (d != m - 1)
( n/ R& U, |  u            {
& |* M) a# I$ B: Z; F$ q                if (i == m && d != m - 1)
3 K6 K" A+ D4 B7 C                {( U2 I( M2 T, s: s
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
4 F2 b7 X" q' ?$ |- y                    continue;
- s! [9 S* k# j) m$ s                }) U/ f3 c- a" t0 J; `. h% ~' _
                else: u$ _* f. F8 J: c/ |; w( b
                {/ |# M% @" {4 y4 O4 f
                    if (numw[i] != 0)8 G5 o( D& U. \" o, n! y. s
                    {
6 Z4 h9 Q7 \  @& w9 H* D                        i++;
# B8 K* x2 M9 ?& d                        k++;
. \3 k. f7 g1 k, F5 U) v) @! e                        if (k == n)' x6 n8 g, d  J6 M1 o/ [5 E# Z
                        {3 a; f$ l, @- d1 W
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了6 B* }2 h8 C& Y3 m& X2 H* P7 f6 E
                            k = 0;" O, q+ `' _) w4 b# m
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
1 g! B7 Q1 T8 \6 _  H& i4 C$ k                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
, H* C8 j) }7 p  e' Z                        }
7 k. t- f$ ]3 M6 w7 b                        else//输出暂时还没有改变数组元素的值  d$ z7 C' y. v
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);0 e6 E) F. `" I5 p. `; \
                    }
+ s, i# m5 N9 ^                    else* |2 }: B/ p. ?# V2 M
                        i++;//数组元素为0,直接跳过,不计数。。。& m  i: E: v8 C) ~. d* m, B
                }
% U: q4 S5 c" D- V/ T7 { 6 s* P7 ]+ L1 Y* r. k
' y# z+ a5 e9 X' S" G7 C
            }//结束while循环
9 H, Q) I, a2 X            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
+ x& V! M8 |5 Y9 r; ^7 l# p           
. g. y) k7 k' Z' i7 \2 I                if (numw[i] != 0)
- f; @7 ^4 x$ ~+ s5 m# P! @                    Console.WriteLine(numw[i]);
6 ]+ `' o3 c3 o2 k3 V% x" Y           " S  ?$ F; Y! R
            Console.ReadLine();, E! H4 u& u! M; V- B$ E% `
        }
8 A% N1 {- h9 ]- n    }
1 L# ?' H6 @8 J}
* C  {5 H6 |  l+ @# S" {
小甲鱼最新课程 -> 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-7-3 17:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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