鱼C论坛

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

猴子问题

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

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

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

x
大家好!0 ?2 L9 X6 W3 j9 |/ U+ h# C
这几天我在忙着编一个问题,我用了一种方法编出来!
# _- N8 Z- B7 Y/ q8 R# Q但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
; {  A) `" u3 U( Z0 c注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
3 |5 r- Z1 r8 W5 l
6 y/ O$ h, q& A1 F! X5 s
& S$ d6 C1 |/ D6 y0 O
                            题目4 M. v+ `( z2 c6 d) ^3 a" {% q! Q' \
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。* }% \9 Y8 s4 e# Q1 C
第一种方法:利用循环链表
+ l( ~2 @4 P4 T( V* z5 U' A7 ~% f#include<stdio.h>
. C* |7 {; C% c! I#include<malloc.h>
, N) u) n; c' P9 c- \, Y#define M 8            //共有8只猴子4 V. N5 k, c- h8 ]
#define N 3            //数到3只时退出第三只% W% L* H9 S: |, k$ i4 V
typedef struct monkey
" Z6 W4 z( F: u0 l0 E  d{int number;1 _1 ?, l4 G8 q/ P
int flag;
& |0 c8 n% g2 Z% mstruct monkey* next;  h) r: c  N$ I, n4 c. L6 F% ^4 \9 v- U% h
}MONKEY;
6 ^$ q1 \' {0 ]& Cmain()& t2 M" y9 i1 z; p
{ MONKEY *head=NULL,*p,*s;
5 f! v& S, N$ u# Y& `  int i,sum=0,count=0;8 D5 z; X8 b7 u% C$ _
  clrscr();              //清屏
% K8 v; z: X" C4 K3 c  W8 h' p  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
0 D* R4 Y0 I4 L( T+ I/ }; f3 {  p->number=1;p->flag=1;
6 l6 I2 ~  E! Z  B0 ?. S  p->next=head;
" s" w9 o4 b. c/ x6 R/ l+ @+ A  head=p;9 ~6 j4 v" y  P
  for(i=2;i<=M;i++)1 S2 Z2 ^; b* k6 g9 z
    { s=(MONKEY *)malloc(sizeof(MONKEY));
$ w. J- E5 f& z8 I' N3 I. B     s->number=i;s->flag=1;! s) @+ L% @5 _2 Q3 h7 R
     s->next=head;
, Y# o, V5 }# N9 `0 V8 @, K6 W     p->next=s;p=p->next;. _/ p; S) P; T( F4 H) B
    }
- p" N+ A) _* k0 U) G0 X" I% I1 F    p=head;% \$ [: B6 f* v  J9 k
   for(;;)
. A) J: i0 X! ^( B- s6 J4 _    {if(p->flag==1)% d  z# a' ]" s3 r) x. ?) x
       count++;
" C, P% M3 W/ Q) i! e' O+ m     if(count==N)
) P0 y! k- g2 ]        {p->flag=0;
& a3 I5 e" ^! U# ^         count=0;
( F5 P5 ]% L, p! J0 u         sum++;}1 a- S! ]( f" T2 x- \) z0 Q
     if(sum==M-1)
2 e9 Y) x: @! q* O% `) w* ^* _; G        break;& K( q5 Z5 B. g- d  K* n9 ?
     p=p->next;% `8 D; i, k8 J5 S
    }& H" {% d" U8 g
    p=
4 a$ c  ?: u, F5 t    head;
; e4 n$ X$ Y8 r    for(i=1;i<=M;i++)
' a- ~2 r* {  z    { if(p->flag==1)- d, M  [- l2 b4 ^- K( z
        printf("\t%d",p->number);/ [) F1 f) x7 W! v2 Q& A; f7 D. q0 u3 o
      p=p->next;) B! `/ K) q  l5 y8 _- w2 O
    }
/ q' ^' N5 d) N* F
( O- [  v6 c9 ~3 m
) t5 a- w4 M: H2 L( j' Q
$ V, |+ W4 U9 {% p$ a+ Q1 b8 U$ _}
1 q  z: A. L* }$ u7 G) n; C
第二种方法:数组
& x& ^& i% T: `0 ~! U, `4 f#include<stdio.h>
5 N; d5 G3 C+ L+ |#define M 8
* i" B0 y* Y, @; |1 e4 R# F# }struct monkey' A6 x- W$ e0 j; ?- Q
{int number;
. [: H) T( e+ I1 x" Q* _) s4 mint nextp;
; k# N& V. |, E7 k, j}link[M+1];
! T' M( b: [" N% j$ I5 _; w6 H4 u& h9 M1 _3 ]: F4 U; P
void main()  L: P$ s! s6 S$ i
{int i,count,h;( j( h0 h6 G0 J4 L
for(i=1;i<=M;i++)' U" [" O+ N- W. H. p$ _
{  if(i==M)
3 A' M5 [" p( B5 v( V   link[i].nextp=1;
1 p- _  g# f2 j# y( u  e! M& u7 F   else
. u4 h$ X/ |/ g- R/ W- L9 X, A   link[i].nextp=i+1;
( F7 ]! r  _# I0 I( x  link[i].number=i;
' s( `8 H5 P" S" N: N6 v}
- Q# y0 L/ y. W7 {2 w8 x/ rprintf("\n");
2 u0 t0 U; i1 h! p( ~  e  s) q" Bcount=0;
/ X* B" V) D" M# ^/ jh=M;
1 {7 R/ I) _/ ~+ J5 S4 K6 N; hprintf("依次退出的猴子: \n");( d5 B/ W7 e2 p. X4 H
while(count<M-1)$ O* M3 X0 `: z5 ^  p
{i=0;0 ?2 ?+ u, w, {9 w1 x& x6 n  e
while(i!=3)$ @2 P3 j/ y1 B9 I6 Q* S
{ h=link[h].nextp;( Y! g9 l8 a6 v' t. \& q
   if(link[h].number)# f- f4 T2 u6 K/ f# A
     i++;}
& q" W" O# r2 }6 N8 I% I9 A0 Y+ v: }: b4 w
printf("%4d",link[h].number);* F% W, m5 _3 q( x" |
link[h].number=0;5 [' d7 a/ Q, ]$ q" s% m
count++;+ |& \' t' w. G+ ^3 F6 l( E( D
}
3 I0 M' L2 [# k9 D+ W. j* Q4 y' ]9 I$ a/ ]6 `) I
printf("\n大王是:");3 ]+ m! B1 Z% E: ?6 |
  for(i=1;i<=M;i++)
' U+ n! d4 ]2 K7 `& L  if(link[i].number)2 \  {3 d% A6 r% h9 ?$ H4 \
    printf("%3d\n",link[i].number);
# _0 T8 O4 y+ h4 F2 I
% ~7 R% _, r8 G7 S) `" R) b
6 n- L5 h3 c+ [+ a  c- X  S}

$ ]1 K2 a0 j2 X( K9 c- A第三种是普通方法for循环
" K( z; {& e" J, `* |. p+ d( w& P
#include<stdio.h>
: k8 T8 _' ?3 e  M! a2 S4 x$ [$ j9 gvoid main()
0 Q1 T- v9 N9 _/ I; W: y- y{ int i,k,m,n,num[50],q,*p;
% S/ r- h' z4 s5 d9 ^" |8 k5 Q* @    clrscr();9 R, n9 V& h! A
   printf("input number of person: n=");
4 c# d: t- J! `' P+ O    scanf("%d",&n);
+ r- q2 B9 N; b+ ~* u& \4 L0 [3 aprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
/ O1 k$ \/ m# G9 W    scanf("%d",&q);
5 P1 ~% i0 D& L) e   p=num;( t7 h  ?3 p2 C( S: p4 X
  for(i=0;i<n;i++)
' K" T1 B/ g: K8 [    *(p+i)=i+1;/ ?; m+ N, d2 F. j4 v" A, f' x
   i=0;" k( Q8 J" ?3 n3 \
   k=0;
0 j0 W% {  j6 }9 y9 f3 {   m=0;
2 i) C5 j' f5 N( m: Q2 }7 T2 D  while(m<n-1)! d/ A2 ^' \2 e- I2 G
   {if(*(p+i)!=0) k++;/ `! M" |9 v+ Z, o& A' n8 R' f& J
     if(k==q)
/ b" M- y, A3 n, G      { *(p+i)=0;" O& }7 v' G# P& a
        k=0;
& B+ P8 f/ C, E; o8 o, J        m++;6 Q8 e) r8 a* G9 F  p
      }- N5 @; B" l' x- x% L% |$ K* B
    i++;8 F9 a; l. w4 c. }5 L6 X2 ?
    if(i==n)i=0;
! X, _& X1 }' [: G! \2 z   }
  ~$ c7 c! B  e  O4 p$ y5 O- ]5 n  while(*p==0)p++;
- d7 G8 X% I. h# V    printf("The last one is NO:%d\n",*p);
7 m) _' X; z+ X3 r1 }# T8 c     getch();% S6 B; T  e1 G- d+ S
+ `  G: K5 r' N) X+ W, \3 m
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;7 p, h1 H+ @! a2 E1 z
namespace 又费马达又费电
7 |# ~8 R2 r; A% R' [" e7 ^; q{9 {; }7 `; g7 [4 [9 ~2 d- N
    class Program$ y* D/ {1 N1 l1 s( y7 H8 j
    {% `$ ^$ v! r) S: m: J* L
        static void Main(string[] args)
2 O. h9 B' M6 i( j+ u        {6 t1 B0 X& k2 A+ L
            int m, n;
+ V: v1 {" U; g% @% D3 T            Console.WriteLine("请输入数组长度");; S, z3 B1 K- q$ h
            m = int.Parse(Console.ReadLine());//m为数组的大小* ^" N" W' J% ?& S( R
            Console.WriteLine("请输入要截取数字的大小");6 Y# G% e$ r& v* M7 m
            n = int.Parse(Console.ReadLine());
3 [( ], b/ `. j" ]+ W; t8 K            int [] numw=new int
4 a+ X% P) r$ S8 r8 F" e0 z* F% W0 l$ Y( b! A% S& K
&shy;&shy;&shy;;% C' c  I9 \: K) C! t. z% k
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数. m( A; T! F: q6 p0 y2 ?
            {; ?" X& y5 j+ i- n7 W& x
                numw[j - 1] = j;- `  C# y+ g9 t
            }: Y2 p( @" w! s
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
4 w% {3 `4 b& w- n7 c            while (d != m - 1)
7 E0 \  ^4 e) Z3 A; C8 _4 K            {
: d& ~+ n/ Q$ `/ V! G1 S5 Y2 j                if (i == m && d != m - 1)) W1 b4 A  ^% }/ c0 ]* Y- B
                {
1 a# a% V4 h! Q& F! e) S+ A% Z$ q                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
5 T1 {: t3 G/ y5 ]                    continue;+ i1 h% z. K' }9 Z- |8 M
                }: S" i, F1 Z4 ?3 |& @. r
                else- c5 F/ d8 p( f( l# M. H& n; q
                {1 u( p9 V& Q6 c" Z! s" r
                    if (numw[i] != 0)
  g  Q: |$ j1 u! @                    {2 G) l) O/ V- j
                        i++;
2 H7 n7 A! m* v$ ]% i5 E' W1 N% |                        k++;, o, q! _& {. E+ o5 S+ w2 {
                        if (k == n)1 g3 s9 R8 }+ E8 Y# M
                        {
6 v+ k/ O/ g. \# p                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
+ t7 @* C2 f, h- K( t                            k = 0;
" E! c' [  [, R& c* g              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
$ }+ w2 }  [; F/ E" @& {4 t& Q                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);! G0 Z3 J% A8 k( Y  ~! V1 t. x' x
                        }
0 o$ g4 O6 k3 g$ Z1 G                        else//输出暂时还没有改变数组元素的值8 U7 i% u; n9 g7 M
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);& D2 a9 u! h0 R3 {
                    }8 y. _% @0 Z  I. \# K1 r) i9 Y2 k
                    else
4 b4 [9 |- }$ {; I$ \8 ]/ u# S7 c4 P                        i++;//数组元素为0,直接跳过,不计数。。。
% d( F2 a. q3 ?/ b% S) H+ g! e                }; U" c) S( C8 k7 R. e9 S) n
: b* v  ^5 e3 E9 ^$ Z- D8 ~
6 w5 W6 j: l; X3 @* j* t
            }//结束while循环* z* _+ p5 U+ n
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦9 k/ o& ^! n1 u2 \( r9 P+ H9 I7 m
           
  g- T( p1 N$ s: ?  u6 D                if (numw[i] != 0)
8 m: S; q7 ~" y* g0 d                    Console.WriteLine(numw[i]);
+ W4 v. ?6 l' B$ t5 Q* h           / {1 {4 \: O5 q7 q% y1 V
            Console.ReadLine();
1 K& p8 q& d7 e7 W        }
; x3 Y0 `& U1 E, e) [0 ~& C    }
) r! k& s: |, t/ @}+ n. E2 O, J. \4 V
小甲鱼最新课程 -> 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-28 15:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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