鱼C论坛

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

猴子问题

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

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

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

x
大家好!8 M! a. G4 }( y4 `* D/ D
这几天我在忙着编一个问题,我用了一种方法编出来!
  [% ?5 B" X) u但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!& g, M  t5 @" G$ k0 }
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
$ t* E. J& N% o. ]$ X9 W" K+ u& A0 {4 f3 N; f6 n# Y
5 O: _. d  z) W$ k7 q
                            题目9 u* `" h( d- U7 Z* c" o3 L
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。5 J, w9 l4 o- P5 Q
第一种方法:利用循环链表; O) F+ k4 B% B7 V1 ~: ~/ T7 Y
#include<stdio.h>
( S0 M0 R3 q% S" f4 j#include<malloc.h>7 F. ^+ V- J% K! x$ w
#define M 8            //共有8只猴子
$ ^: h2 r/ ?% k3 c! s#define N 3            //数到3只时退出第三只. H3 g- P! l. B" j9 m
typedef struct monkey
/ B) f% d4 A2 d* p# c# e{int number;
. D; t$ [3 n, hint flag;
& {& c; C* p/ Nstruct monkey* next;; _( V) O* V6 J9 Y9 l, ]
}MONKEY;& z  r/ i& m7 `+ t0 V; r
main()3 W$ G4 }2 s" n5 {: e! v
{ MONKEY *head=NULL,*p,*s;
5 O0 t7 ?( ?7 Z7 F( o7 y2 M  int i,sum=0,count=0;1 j; f$ b4 G; R$ T. L
  clrscr();              //清屏2 F, K# g7 _+ |$ S
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
8 `" ?) B1 E" ~7 G' W" t5 ~8 c, i  p->number=1;p->flag=1;
, N* M; n/ M3 }9 x1 N( M! |  p->next=head;
# ?% ^. @4 u  K  head=p;
) X3 \6 X/ }5 d/ N5 [: U- ~: E  for(i=2;i<=M;i++)
8 D5 u5 T8 V3 b! A    { s=(MONKEY *)malloc(sizeof(MONKEY));
) x* M+ O( p- B, V' w     s->number=i;s->flag=1;
3 e- p7 w/ ^# n     s->next=head;3 k8 O6 y4 _5 `8 ]
     p->next=s;p=p->next;6 r) e5 @" t  C8 p, \6 C. ?
    }
/ ]5 G# S2 }1 ~    p=head;' x! P( p( H9 Y0 B
   for(;;)9 v8 j. q- n5 c& }8 o
    {if(p->flag==1)4 V* O$ L$ R+ g6 ?
       count++;. w4 l, H7 `1 y, u3 i6 F6 ]8 t6 u
     if(count==N), s- A* ~* c- k( N+ S8 \0 S9 Y
        {p->flag=0;
# q, s. f' B: p; @1 [* z         count=0;
/ T# t0 F) O* `5 b, J* M' B4 L         sum++;}
) L% S! W# [1 d     if(sum==M-1)
! ~& M' [! T# \8 a2 y, ?        break;
. l6 G' A4 i, @, z     p=p->next;
  }! G! k8 n1 a% L# p; o    }4 h: G: x! m. V9 d" x, ^1 N; a
    p=( K: `" q& n% x9 u
    head;
5 v3 e  T; E) H! j4 G    for(i=1;i<=M;i++)
  k. H* H3 m/ w  J    { if(p->flag==1)
2 s+ F' m% V1 B, E# y        printf("\t%d",p->number);- s& @, [8 b7 c: g' F
      p=p->next;
7 I9 q$ A; n7 v    }& q' q" O- i. s/ O

0 g( g8 P6 e. l) B# X
  t1 Z" X( q. D% r4 E6 l6 Q8 ]6 v* {# Y
3 J6 y  A! ]) e% U, W}

. }( d8 @2 _) a第二种方法:数组# J2 {1 B  n" O5 o" l! R" a  R+ V
#include<stdio.h>
0 A0 {; e9 N9 P  `! ^- R#define M 8
9 q/ t# H9 f% Z& cstruct monkey
: H9 E6 A3 _! P$ t+ y{int number;# l$ F" m) i) I! t2 }8 }" }
int nextp;3 W5 ?8 d3 a& l8 a( u9 U2 V
}link[M+1];
7 y% o9 p$ c: ?2 H* a7 \' Z/ K8 \, `8 x  R+ J4 P. q, W1 ?! Z
void main()
7 N' ^, `3 M! A9 ^8 g{int i,count,h;: N! h6 Y' V0 L2 y& k4 p5 O
for(i=1;i<=M;i++)$ G' c2 B5 e" j7 Z6 N/ @( w
{  if(i==M)& Y# a- j0 ^8 A
   link[i].nextp=1;# p* Y5 p7 T, {( v* Y5 G& `
   else3 O2 Q8 p+ G9 X% W6 d. k0 g
   link[i].nextp=i+1;8 r( P: G) D( C, l) _# K
  link[i].number=i;& }  o& e7 ~( g; e0 L
}
. d! M% g; w" y! Yprintf("\n");- J0 P( s2 N% f
count=0;
6 W! ^) W6 c5 ]& ah=M;
' M0 Y  C8 Z$ jprintf("依次退出的猴子: \n");
+ J) }* P6 a% ~4 nwhile(count<M-1)# b$ n6 B8 P! v0 a; w# c. g
{i=0;' t, b" \  P( a9 C: ~6 Q6 k
while(i!=3)5 g* q6 x# _; s" _9 p
{ h=link[h].nextp;( P' }" _" }/ X. I$ B
   if(link[h].number)
3 c( Z9 n0 j  R4 h     i++;}
: K, c$ Z4 b1 x  Q; M
  q3 p% m! a$ L2 b2 g# h& N& w2 |* g+ Eprintf("%4d",link[h].number);8 g& G6 s1 ~: p8 D8 g- m6 p0 y
link[h].number=0;
5 v6 |7 }0 w# ]* Z) Q  zcount++;( ?- K5 O% [, @0 _1 A! t, @3 I
}: C+ i$ u* s& h8 s

1 b; _$ I3 C6 r  z2 M: u+ ^$ b! Fprintf("\n大王是:");
1 E% S# A( \  F4 c% j0 V: b  for(i=1;i<=M;i++)" l2 i% H. D! j4 W+ E3 o
  if(link[i].number), F% h2 G' l2 j' P
    printf("%3d\n",link[i].number);
5 r( w" g* G+ y- w+ V, P/ I; l
/ U& ?4 |$ l3 p3 d4 `# t# a1 Z! }: t) I: b" n" Y( b/ Z7 E
}
" b; g5 a- G5 g
第三种是普通方法for循环
5 n3 z& C: l6 N- e0 K' `: H
#include<stdio.h># c' {1 C: D2 N' P1 x2 w# W
void main()! I% Y6 s: u+ r  d+ D1 g: K# X
{ int i,k,m,n,num[50],q,*p;5 i, [( y3 m# K5 n. Q4 u
    clrscr();
* R' E! W. B+ Y8 i4 G% T' B* k   printf("input number of person: n=");
: |& }& \2 c+ a% m" f, \; G# q    scanf("%d",&n);
! @8 U6 W+ Q% l. |9 G+ x, Z  Iprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
8 i; r/ h* i9 e! c# e& G( f    scanf("%d",&q);
( E- B( A, i6 i9 _   p=num;
! b. T0 \/ \- k8 U( E8 L% K  for(i=0;i<n;i++)- x' o) K! j: T% _9 a' y  U& C
    *(p+i)=i+1;
% a6 N& ^% `* w" @   i=0;
" {; M0 m: u5 M6 d9 c$ ^   k=0;  `! g( ]6 l2 t3 u5 l- U
   m=0;5 f: L% @* z" C  |4 {3 D
  while(m<n-1)
: T2 Y' h! Y: R   {if(*(p+i)!=0) k++;& G3 a0 S7 s5 e- D, w0 R, q
     if(k==q)
- Y9 ~& H, @/ j8 I. I0 v- y6 s      { *(p+i)=0;# B, r5 C3 B7 [) E6 c( D
        k=0;
1 N  t* v- v5 o; p. n: o        m++;2 T! P8 T' R# {( |! X2 y3 v) a
      }  [) J0 N  f  w( e$ X6 Y
    i++;
, x, c( |4 {2 \7 B* q1 r    if(i==n)i=0;
- \8 P0 e. w/ O/ D* p   }
- i+ H( p7 _$ m; a6 ^! v  while(*p==0)p++;0 q/ ~1 Z' }4 F, r7 K$ C
    printf("The last one is NO:%d\n",*p);3 x9 _$ H2 E! }& v  S4 J6 f* F2 P
     getch();
/ U# T$ B7 d; t1 m+ ], J, d4 g& Y3 Y4 C$ e
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
4 i  j/ {5 {/ i8 Anamespace 又费马达又费电
8 v5 q. t1 n6 v" k9 Z{
/ Q7 C" x; T( i9 X3 O& v* T    class Program# }7 n% x8 C% r% [: h0 r# t
    {$ C0 u( w* H, Q7 S& V
        static void Main(string[] args)9 T  L0 P* `  V8 [: O" `
        {
6 v5 @4 i; J$ J1 Q3 F$ L: Q            int m, n;
( K2 Q$ }- @' q/ M            Console.WriteLine("请输入数组长度");
- l& c, O  C8 n6 y            m = int.Parse(Console.ReadLine());//m为数组的大小
# k4 S3 q! y5 P+ s/ I0 n% @; \+ A            Console.WriteLine("请输入要截取数字的大小");/ e4 y( V2 _. |% R( E/ E: f: F
            n = int.Parse(Console.ReadLine());
2 Q! j. s, V: _+ K' j+ E            int [] numw=new int
5 B  M* a( ^3 P
* @5 A/ ?' h% y" \. _&shy;&shy;&shy;;: o/ L: e) Y7 h  F
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
7 W" m4 M. f0 n; G- H( D$ M            {
) t1 p; z1 Y) _- {2 I$ ~  z$ C( g                numw[j - 1] = j;! |3 t: p4 G" B0 C' k1 o/ d
            }0 _) R  ]; x& T* R( G9 s
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
7 |6 g2 Q( G& q; C: h            while (d != m - 1)
) `2 s( M5 C7 X  z% t$ _3 {            {6 O$ C$ t8 t: E  K) n" N! ^4 v
                if (i == m && d != m - 1)1 n3 W2 z/ a" o! E4 ]
                {
' w! P6 c1 M. [( k  z                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
! S: m1 m8 w9 X" n+ T; o                    continue;
! o' g2 g+ L# A- X                }
+ D1 I& M8 \3 x, ?$ _                else4 H8 Q9 V- h% H* l6 \3 }
                {0 q8 K/ u3 A  o
                    if (numw[i] != 0)
, h1 ?: B* a! W                    {
4 Q& I5 a+ F6 u/ K6 q5 {2 X                        i++;
( @: A* |# @+ S1 }* D- Y& O                        k++;' M" @2 N3 W9 b
                        if (k == n)
% S& R: \0 `8 y* W9 F                        {7 E: V  [0 P& e* P2 v9 B7 d
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
" l+ d9 ^' X) I* b- [5 G2 i8 r                            k = 0;
. H7 h, [( [% V  a1 e3 _1 [              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1" F1 |" }' r# S. ?
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
9 t3 f# B  L" n5 T1 }7 h                        }
+ G% Z- E% k; P" B  h6 P                        else//输出暂时还没有改变数组元素的值" r; M& @( {; [3 E
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
5 V9 Q/ j) f' `! K" Y" i2 o" e                    }
! y/ {- s9 R; k                    else3 j1 _1 e* N8 G, k2 T3 j
                        i++;//数组元素为0,直接跳过,不计数。。。
# e3 a2 X' K3 B- x, T7 o                }8 l- v8 A9 R* T* k' a& ~/ {
5 A1 X5 |/ a+ ]
$ P4 g) w1 @$ T; c+ t; K
            }//结束while循环
# B  k- x# u/ s9 t            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
4 M0 ]0 q% T+ O' I5 U           : {% L1 t) z- N; p7 ]' l5 Q1 G4 B1 z
                if (numw[i] != 0)& Z! c$ Q7 C- Y! t, C' q2 b
                    Console.WriteLine(numw[i]);
: H3 X# s& K/ e6 _           3 L' D0 [0 s' i  O
            Console.ReadLine();( g# M  i( i/ f: W. [' J! p7 v/ C# n
        }) A9 r- W8 G8 q) w
    }
" |6 Z3 j3 B, d7 D0 k8 ~$ j: E}
4 I. p5 Q8 E% l0 {
小甲鱼最新课程 -> 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-10 09:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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