鱼C论坛

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

猴子问题

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

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

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

x
大家好!/ W0 z& }9 l1 x0 _1 ~/ e9 \
这几天我在忙着编一个问题,我用了一种方法编出来!/ ], J' s1 j  D7 I  a. k" u
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
1 O; m$ m3 d, b9 V; E4 |注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 9 u4 `  m" U9 s/ U3 i

+ M8 {) X3 f! O& {* I  g8 \# y; b, B& ?6 l6 x7 G6 D6 t9 C/ K
                            题目
4 i/ `, S' L% i1 y' D. f山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
. @. C# j- b5 B第一种方法:利用循环链表
1 D" x/ H' g0 B) {/ J, b#include<stdio.h>( I- d% _  A, O
#include<malloc.h>5 Q) O! J+ l$ h2 g! ?" L
#define M 8            //共有8只猴子
9 g* Y0 P  n: X% K#define N 3            //数到3只时退出第三只
. Y7 ?! [) D6 M. dtypedef struct monkey
' T  y, J; Z. p( E+ k{int number;- V( Z3 @8 [: B+ f, R
int flag;
* ~  V+ P: \  f: [4 K. ^struct monkey* next;
2 h5 z! g2 Q- Q, }# o! s  L}MONKEY;
5 o; B  L  x0 S# z0 M* }$ Omain()/ V: W9 N5 m1 S9 e& j  b1 C/ ^+ }
{ MONKEY *head=NULL,*p,*s;# C3 U/ w5 F. p, \2 g& `
  int i,sum=0,count=0;
# G/ P6 F8 _( ^$ c# x0 G  clrscr();              //清屏+ A3 y( ^% O& E- W" x/ u: c% `& ?
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
( o' I# w. A2 A3 d  p  p->number=1;p->flag=1;
) F5 X5 v; ?) `  u% B  p->next=head;9 x7 b% T! ]2 X+ \( |0 j
  head=p;
" ?3 _8 d5 h' ~; J  for(i=2;i<=M;i++)
" [2 z4 l7 A1 L; e# G    { s=(MONKEY *)malloc(sizeof(MONKEY));  J/ w( t4 ]' \2 q
     s->number=i;s->flag=1;
) ]. [* `6 {' T1 O6 Z+ C     s->next=head;
2 |. r/ ?' F8 Z$ j3 ~( F( n7 y3 R     p->next=s;p=p->next;
5 v4 O9 V7 J7 M$ v    }( i: X$ K1 L" Y( l
    p=head;
7 B: q( C+ R& }2 H' |6 `3 D   for(;;)6 x6 U: |3 t! K$ e  P" ~2 ^
    {if(p->flag==1)
/ K2 T& z; E1 ^1 h5 f$ A       count++;
4 ?/ ^; M( f$ M2 X3 j     if(count==N)
* y0 u8 e) Q3 Q7 C1 A& {        {p->flag=0;
7 c+ q1 J3 [" ~+ Z( @! P         count=0;
3 }/ d0 a* K! r  a         sum++;}
" k# N9 e% M. d1 ?; q     if(sum==M-1)  z0 Q- W; m  j
        break;! i. p  d! `# `7 F
     p=p->next;
; e: U4 _$ G. D! f    }
3 @" ~" l5 Z! r8 q# S- _, W4 r    p=( F; l2 V; b- U& Y, I) l' a+ k
    head;& C/ x* e( I4 J; Y0 r' c8 d7 y( a
    for(i=1;i<=M;i++)
% f. y( m% ]3 b; v* {3 V% S. S" x    { if(p->flag==1)
7 V4 T& `- \9 }. E        printf("\t%d",p->number);3 u3 g5 i1 m  d( D$ N
      p=p->next;0 B& V# W1 {- R/ N  `
    }
8 x, f0 j# U% S8 b7 X5 j( K/ @  ]
1 x" p: b+ R! }6 [6 u% v6 e
) ]0 F1 S9 j! Z. @+ |2 j1 N1 O
+ A8 o  z' c7 N* q8 ~; ]' u" C+ f}

9 o' g' Z% g% _4 x* `第二种方法:数组
5 a/ t: N6 S# H) X#include<stdio.h>, U  P; k5 u9 z4 z. s. ?3 X. q) F# ?0 L
#define M 8
- b4 Z& O. N2 A5 K* G  @struct monkey
, x. B' o  O; t, r8 \{int number;, O% R  ?. t, ^5 q# Y
int nextp;
. p  V; i% h/ t}link[M+1];" P6 O2 p6 t; F/ Q3 q
7 g. _& `: k$ O+ _
void main()/ m( S7 y3 {: b' w% Z
{int i,count,h;( e1 l% y& x6 i$ `5 A
for(i=1;i<=M;i++)
8 x7 n4 W/ n; ^{  if(i==M)
' ~2 z9 w& c$ c* l( N   link[i].nextp=1;
7 [) O# ~' E! l: c! |% p   else" z- `* T  ?% X" q% A, c" I  U
   link[i].nextp=i+1;$ P, g2 s' e7 j7 |" f5 t/ u2 X
  link[i].number=i;
/ Z* R% N$ Y# }1 C; u7 O}
% T0 B: R  @: |1 v8 o" kprintf("\n");( W) D8 m; u1 u- D
count=0;
( |. E$ H, F% [. t  x, }- ~h=M;
4 _  a: l! {8 k3 O* fprintf("依次退出的猴子: \n");! R2 H: S0 |4 n0 M* u
while(count<M-1)4 |& X1 N7 x. X0 B$ Q, l6 t8 T+ \
{i=0;4 O" d" s1 N) A* C+ Q+ N8 E
while(i!=3)) g8 _* b8 {; q2 g) N
{ h=link[h].nextp;
  z& c- j/ c& u4 K/ \0 o2 f   if(link[h].number)
7 L2 y( H9 x5 o  f: d  ^     i++;}$ p$ m) Z& c, B, ~+ B
; ?$ q+ ?" x( c' e6 u9 J
printf("%4d",link[h].number);9 }; C) \8 ^! n6 w7 ~9 E0 y& H
link[h].number=0;
7 m% s" F7 r8 @# dcount++;4 B" G7 f; d7 k% U7 Q
}$ b+ }2 i3 Z& Z: U

! _5 E2 s6 [; V6 J- k8 E0 R; R7 dprintf("\n大王是:");6 E: W& Y! v; _4 a% X
  for(i=1;i<=M;i++)( S+ C3 P# y9 l+ x/ l+ x1 A
  if(link[i].number)
+ b9 Q' o7 w+ r    printf("%3d\n",link[i].number);: |" S  l2 ]* r' ^

* ^7 y$ e/ C0 J6 K
! W$ ~$ A' N; I3 Z, K( ~}
& a1 a! _& x' j+ i& G
第三种是普通方法for循环

! c7 |7 k% K/ i7 I/ M#include<stdio.h>
9 d9 k" |. {$ N% Rvoid main()
: L) l: d" }1 J9 Z{ int i,k,m,n,num[50],q,*p;
4 J, z  T8 n. G+ Z( M$ e* w" `6 q! c    clrscr();
: F8 E3 q; }( s$ ~5 a( C5 B   printf("input number of person: n=");& B' R' f5 \1 b" X5 k2 p
    scanf("%d",&n);& O" ^5 E. a9 c! }- _5 ~
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只* c3 r/ Z8 b7 Z/ ?5 @( B% v
    scanf("%d",&q);
% v+ t! {- H" v   p=num;  g  ?+ K+ S% H( `; _% H+ d
  for(i=0;i<n;i++)2 K7 r% {" |0 e% r; B, t
    *(p+i)=i+1;( @3 t" U9 I& g: B' K8 i8 U
   i=0;1 I( M; F' Y* h5 T& Z" d
   k=0;
4 s& ?9 F' `4 I7 V4 [, D7 x, E   m=0;
1 f  Q8 d; J% a# o1 {  while(m<n-1)
) J  ~6 ^* I8 i% v1 C; `$ Q   {if(*(p+i)!=0) k++;
. k0 Q; E+ _% d8 p1 B& E5 q     if(k==q)2 `  I) m0 D8 O
      { *(p+i)=0;
! N) \5 U5 X/ x$ F$ M5 ?7 J) c        k=0;: D0 h' ]  }( @9 q6 b
        m++;( q! C8 X! J& E6 t. ~- ~7 Z/ v- t
      }
7 H+ s3 a& M" M# x! X) q4 y$ K0 \    i++;
! ]; L/ i# c+ P  }2 a& T* U! _    if(i==n)i=0;8 I* U" Q+ p/ ?. `9 Z9 \
   }
5 |3 T  m9 P$ o: `8 F4 E  while(*p==0)p++;
; w; q9 M; A( ?+ D; h0 d    printf("The last one is NO:%d\n",*p);
& x- \3 E( b' H$ \$ p; M     getch();* ~; I- v8 c& E' S, E1 {

1 W, L/ \5 ?# Z0 i9 m# m2 n) l}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;4 u/ r/ }( }. U  S4 ]
namespace 又费马达又费电
2 O) U# s; D. b1 M0 ]- }- E4 h1 B3 h{! P/ G. b& x2 ^  d# D
    class Program
% @4 U/ @( X9 D& d, F# l/ H# V6 ?    {
2 ]) a* G  D; y2 m  P9 {        static void Main(string[] args)
: a: h, g0 Q/ W3 R5 k% d4 q' _& H        {7 D' y+ ~0 x8 F" w
            int m, n;
& u) f* t( f" i* c. `) T            Console.WriteLine("请输入数组长度");
3 m6 S  P4 g6 g6 f& f& Z! p            m = int.Parse(Console.ReadLine());//m为数组的大小3 v2 V. i, C$ ^' D2 i) A! X
            Console.WriteLine("请输入要截取数字的大小");1 z3 U$ e" G- ]- j" x
            n = int.Parse(Console.ReadLine());
) d/ T4 B3 U; g/ C6 L9 |            int [] numw=new int
+ M1 ?6 F  w* H
+ \+ X1 v: b7 h# s- G&shy;&shy;&shy;;
# y" u) m1 H3 L. ]/ a, H; G: ?1 H            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数0 e4 t5 m* m( K5 U" p$ X
            {
3 v! a1 L: W  i                numw[j - 1] = j;
! o5 i/ l. M6 h& Q  H. P9 @" v            }2 s$ o* t) Z) q( R( c/ X  C
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!- W. ~1 q$ D* C9 J% F# w5 O1 k
            while (d != m - 1)  K8 P  A  }; o& J! `9 _
            {
9 M9 c2 S( V8 A& i9 d0 {  v5 ^                if (i == m && d != m - 1)# S$ h3 O) Z) q6 o, c" Y4 `
                {! i* j$ y0 I) o# e7 k; K
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
' i, h# L! ~/ }( r7 a) S                    continue;9 M$ \, Z) p# X
                }
" s& r! W2 ~! u( n" [' [2 E; t                else
$ E$ j8 Z% x8 a, ~9 q* I% F2 K+ x                {& ^4 X- Q0 O; m9 W, C; h8 b
                    if (numw[i] != 0)
! A/ A+ h/ B% v                    {
% U, n) i5 m3 ~' p& _" g                        i++;* b6 Q; `6 k2 h4 d# W0 \
                        k++;
1 O1 K% R4 `/ b                        if (k == n)7 I2 |) S' w- R: y0 }5 k' k5 G
                        {
0 P, K: `5 C# t) L                            numw[i - 1] = 0;//把在n位置数组元素的值改变了+ y! x, J. r( s% F! J2 a
                            k = 0;4 j: H# G) K  ^) d! ~% ]1 X3 F  x3 a
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1( d: X0 a5 D* ?! ~/ U
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);' F+ s) _/ D8 L- h+ x$ z. ]  d
                        }: r! E! ~& h5 a
                        else//输出暂时还没有改变数组元素的值* n; L9 z5 k' \" l
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
. p) J# e, L5 x/ R+ s$ ]                    }
2 J6 Q+ t; l0 ?3 T; a                    else
9 s4 H7 G% Z$ j# g9 c4 T6 X5 q; d                        i++;//数组元素为0,直接跳过,不计数。。。
' t7 C/ l* [& n9 f8 t                }
$ _& J  j: O7 s! g" r 9 h2 O+ a1 K0 [1 z& ^& R; v3 n

& y* k- ?9 Z6 e4 O5 ~            }//结束while循环
; A% \0 w- p( m. z2 k% g. A) N            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
) T( r. O7 h$ a  b" [/ w7 c           ( T6 M' T) j" b' }. B
                if (numw[i] != 0)
3 X# ]  k9 Q; V1 _% B& J. x  k                    Console.WriteLine(numw[i]);
+ D1 ^9 N, G% r& \           $ W5 s! @0 T* j; v( H, N! R
            Console.ReadLine();1 R& y7 l$ t" x$ g( Y. r% U
        }" A2 j$ N4 }! l4 v$ J
    }% c0 r4 i7 |% ^  Y
}
- E/ b4 A" a9 ]* ]/ a
小甲鱼最新课程 -> 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-16 16:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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