鱼C论坛

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

猴子问题

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

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

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

x
大家好!
5 y2 V1 g& f4 O2 Q这几天我在忙着编一个问题,我用了一种方法编出来!" B4 l  V# w& f/ F
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!; Y! ~# o6 ?5 m8 i
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 9 t  `! J; C2 E$ a

; o& [1 {' h: k( i, M7 \' N' _6 J- r, E' }0 Z3 O
                            题目
$ h0 q' I+ W" C3 o+ J山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
: g# U* g9 P$ y/ a/ Z第一种方法:利用循环链表
& r+ m, `* s! `#include<stdio.h>% r* ~3 H; K+ s1 b( _) ?2 z0 `4 [
#include<malloc.h>
; X8 j4 f1 ?# V: J" b#define M 8            //共有8只猴子& Y" @% ^' i2 u! j
#define N 3            //数到3只时退出第三只
* i2 z% Y, C' M3 z, p0 N7 _5 A2 Qtypedef struct monkey8 R5 W6 J$ h5 X8 m" L; G: b
{int number;
9 Y) q$ }3 E* h% c8 N/ Yint flag;
0 {, F! X" \7 Jstruct monkey* next;  a2 B- Y' G' }, B
}MONKEY;
+ a' {6 c0 m6 i# O& C1 ~9 g+ ^& cmain()2 S; B- u1 L/ w$ Y: E2 c) f5 q6 g
{ MONKEY *head=NULL,*p,*s;
5 Q  z) {7 W* a  int i,sum=0,count=0;
/ `: N' `. g8 s  clrscr();              //清屏% H& R+ }9 S  @
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存' `2 V/ K  Z4 O1 G6 U8 ?, A
  p->number=1;p->flag=1;  p# v5 ~* h6 h$ j6 q
  p->next=head;* \1 [2 ~) V$ @' E
  head=p;
( c5 `7 q0 c6 K: b, n( E* C  for(i=2;i<=M;i++)! K4 N' M6 C/ s1 U3 y
    { s=(MONKEY *)malloc(sizeof(MONKEY));
6 m& |  c+ Y9 w# Y* v     s->number=i;s->flag=1;; _/ ~! |: m1 a' M# ~3 H0 U- q
     s->next=head;0 q1 ~' \5 g8 ]5 Y6 X
     p->next=s;p=p->next;
! s; ]" k9 k& N1 P& F" {    }8 W$ v0 Z3 n1 p1 S3 r' |& a: [
    p=head;- W$ ]& |& Z) J% I
   for(;;)
& O9 s: t2 f4 G    {if(p->flag==1)
$ I/ i( H2 P: e0 u7 `  ^; c% w& d       count++;' V$ J6 ^# Z: r8 C4 s( h9 n
     if(count==N)5 N9 p% _) w6 j! [" h/ O1 F% F
        {p->flag=0;
% S* Y, R9 u1 }4 H         count=0;& _8 K' C. p. C9 k$ P
         sum++;}% C1 w4 z. h( z, E5 A+ s) B- m
     if(sum==M-1)3 m1 I, [8 v4 o) M
        break;
( `8 X9 q' I% X! c' N# Z     p=p->next;
# X, _( }  `, D& @3 y' `, }    }
5 }) N- p1 j0 Q- h- ]  {" T5 J; s    p=
4 K$ A$ y  R$ f. s7 k    head;+ i$ C8 q) ]$ `7 j. l
    for(i=1;i<=M;i++)
6 Y% D4 N- e0 u/ q0 q7 ~! I: O& z    { if(p->flag==1). |% m% p4 c4 h! f- Y: J
        printf("\t%d",p->number);
+ g  s+ s7 ^$ J) a8 H2 \7 Q$ N; Y      p=p->next;
6 b1 [* h( \1 ~7 V7 T% D    }# [# L7 S6 ^$ g( C2 ^
3 a/ E, F+ |) ]7 Q' @( Z

# \. Q% I' f* x$ w9 ]6 R
3 i" [! K; {1 X}

1 b% Y0 @% G9 a第二种方法:数组: |) c$ s0 r$ i9 o
#include<stdio.h>  V6 d: i  V) Y, f2 s0 p
#define M 8: h8 D- L. A, d- F7 C& L( B, F
struct monkey
3 g* ?) w% |+ g( N4 o{int number;4 Z) h) a# O# P1 T# H& o
int nextp;
9 U( C& E7 p! b7 \) h" w0 m}link[M+1];
, x6 K3 `" C' W& S; g: }2 H3 |* c$ a) b: {+ a! |
void main()! n+ @  g# H9 `7 S
{int i,count,h;
+ p) ]$ j0 l3 |* A3 r( wfor(i=1;i<=M;i++), n* ~6 z4 A2 G3 b
{  if(i==M)
* j" Q6 |7 {& L, M   link[i].nextp=1;# _0 k3 L/ i- o# Z4 s
   else
' `9 t# h3 ?2 G: k9 U; s+ P& U   link[i].nextp=i+1;
' [7 H) N! X  H  link[i].number=i;( i/ V1 b9 w5 N+ ?
}
: |0 @) u1 T& N+ s- h( S2 m/ cprintf("\n");
0 O& ]0 w% r3 O+ m5 n, fcount=0;
4 m( ?5 L; |) Jh=M;
( a2 u5 F; K  |5 ~; Cprintf("依次退出的猴子: \n");. e/ i8 e) U' z7 ?2 q+ u& m9 g# t
while(count<M-1)
$ u' z% V6 v1 |" v' Y{i=0;
* k4 F, e5 g5 m& E4 s: ^3 Cwhile(i!=3): u% z( B# E( f7 m9 r1 m
{ h=link[h].nextp;1 J8 V$ a- {5 p$ x+ i
   if(link[h].number)% g7 L& P( _9 K, k! a+ U
     i++;}% a; Z1 W; ^2 C7 B4 i8 T: Q

: o  S. S! j2 Y( }printf("%4d",link[h].number);
# M0 \5 [, M3 j  ylink[h].number=0;
, l5 F- L- h3 ]) y( ?count++;
% j! i: u6 U% [! h$ o}
# Q% S1 W4 S4 v/ \6 f
8 {0 Z0 o' {" p% ^printf("\n大王是:");
* t% y  p: u0 p5 w" Z* N  for(i=1;i<=M;i++)
# b" i/ ?: s5 h1 z  if(link[i].number)9 o* D7 |2 ]+ n5 ?6 Q
    printf("%3d\n",link[i].number);& A) \3 x) M! q6 E0 i4 S) ]6 ?

  q, R( R" F1 P' {
* S% ~6 ^, @5 B1 t0 j}

% {8 J2 g% T- ^7 u' L8 e) L% k0 N  O第三种是普通方法for循环
) f' m1 x* Q2 c+ a4 }) U+ l* i; t
#include<stdio.h>( V) g5 Q) j  b
void main()% k: K% \. G9 f
{ int i,k,m,n,num[50],q,*p;
0 y3 w( H, R6 H( Q% Q! [. W9 y    clrscr();# \, x4 V; d, N2 f, i
   printf("input number of person: n=");2 G5 _, Q$ _- F8 Y
    scanf("%d",&n);8 `% K, Y! b, q2 P
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
" E: B' b2 H' J& f' l9 n8 x    scanf("%d",&q);8 }( E2 J# i( |" a. F, u
   p=num;
1 a0 ~0 a0 R/ m  for(i=0;i<n;i++)
2 `6 e' Y$ K0 b* S, W  x, ~" b    *(p+i)=i+1;( f- _' |  {! l! K+ Z# R) S
   i=0;
7 ]& x- J  T. Y6 J   k=0;3 H& \7 g7 u5 z" Q
   m=0;( _& y/ P% a, t& g) j' D  f6 ^7 t
  while(m<n-1)
* U$ V8 W, m# z& w$ s   {if(*(p+i)!=0) k++;1 F. ~1 y+ o8 x) p
     if(k==q)
3 i- L3 P9 A5 Z. m4 F0 i      { *(p+i)=0;
, ^* D2 S# x  G! `9 W        k=0;6 s9 W3 I6 X; J4 U# k* c  Q
        m++;% a: s4 P6 t! r9 t3 Y
      }# r  n. N+ d: ?1 z- l  m9 C" y/ v
    i++;
+ j5 C! g9 A3 ~8 y  L9 E    if(i==n)i=0;
) R" ?* n2 j$ M! c/ Z  C9 [+ u) [   }4 u5 I3 i* d4 W: W1 E) D
  while(*p==0)p++;
; F* f4 Y& x5 ]: X# [" e3 j    printf("The last one is NO:%d\n",*p);" L( `+ T9 z2 |! I- v* H# `
     getch();3 H2 m, R: P! y  k- ?' a  R0 o
0 m3 A' o/ A" k, i" h7 c- _' x
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
5 h6 ]4 X9 e7 g) E0 znamespace 又费马达又费电/ Y7 e1 O; _, J8 h
{+ ?& |3 ^% g, ?- ?) E& K  |
    class Program
! p. c* `" L! l6 P5 g4 p    {7 p) Q. P. u" |( x0 n" b
        static void Main(string[] args), I3 g/ [. h7 z) ]% ?# G' f1 K7 w
        {% h5 u* s5 b! T4 q; y2 z5 C: A  w
            int m, n;
4 u8 `0 \& E" o5 L; J            Console.WriteLine("请输入数组长度");
3 f! Q: x0 p% q! w2 L            m = int.Parse(Console.ReadLine());//m为数组的大小& I# U- k* I% v. t, a
            Console.WriteLine("请输入要截取数字的大小");1 h6 f- M  Z* C: H2 |2 \
            n = int.Parse(Console.ReadLine());0 b7 w. N. Y5 Y1 y$ A4 b
            int [] numw=new int4 s# O: i. D' q0 @- d" h9 i

& I  ^+ K8 t: C; F, U' V&shy;&shy;&shy;;
4 B* |! H; |7 T) B0 c1 r% Z            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
& _7 J0 I+ Y. O9 B8 d9 p; q& X2 T* e            {6 Y- z: r+ @6 @0 p' H
                numw[j - 1] = j;" U4 j- g# S0 x" b& A
            }
; N0 ^' F: q, o; s+ Y0 R' i            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
: ?$ ~' D7 l+ ~            while (d != m - 1)
% I2 F( X1 d* t* l% ^4 @# P! R8 y            {
/ ]0 v% ]5 C7 ~! A& R3 J                if (i == m && d != m - 1)
& F3 \& `* g5 a. _+ i' K! G* H                {
; v, y2 ]! f- ?, @! @                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
1 n, E! \( [# a/ G. m* L4 ~/ f                    continue;5 {' Z8 ~5 M# N' p4 x
                }
6 {: @' Z' E( E5 P/ O4 ~9 W. K! S                else
3 \$ |* M1 w6 M                {( S, a: O3 Y0 m5 Z# K% u5 n6 i
                    if (numw[i] != 0)
9 L1 e6 V" ^: Y  t# d2 ~                    {
9 g% O% W9 Z8 o/ V                        i++;+ E: w7 g- y6 W
                        k++;* B4 D3 G6 a6 A0 R/ O3 |' Z& m
                        if (k == n)
( F# L: z- @' D) t                        {
8 J  o0 v) U4 G3 \0 @" D                            numw[i - 1] = 0;//把在n位置数组元素的值改变了2 U( _/ q9 w& i# X0 `# B! L
                            k = 0;
) Y6 r& h) |* K% R9 x4 T3 n5 t" c4 q              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
0 u$ _- m  T5 z# S8 G- G                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
1 E2 K+ ^. ?; A  X+ N                        }: |) D" U7 D0 K9 Q9 A
                        else//输出暂时还没有改变数组元素的值
7 G) N; U, v/ ], W' H                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
' n% X3 h. S  o                    }" i1 m2 P  K. Y0 {6 [
                    else4 [, E8 {% c# h  v" l( U! M
                        i++;//数组元素为0,直接跳过,不计数。。。
- E% T8 u* _8 i2 Z4 ]                }
1 @1 [& {& k4 v6 t5 ^
% u- H7 {# U% [4 d1 ^5 P8 j5 Z
" H5 }- s* `% z5 g0 g+ \. `            }//结束while循环
. m( A) b2 D5 `$ k            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦. i7 [! r/ U( @* I! u1 N
           
- @  ]9 [7 d0 _. B- H6 M* \, }                if (numw[i] != 0)
+ f* Q) R) [& W/ b7 ~                    Console.WriteLine(numw[i]);
; l! ~, \; R8 X' m' N. r           # ?- \/ U- r) f2 I! `' |
            Console.ReadLine();
' r1 m0 |. t9 h# S' y# h* V        }0 N. y# D8 i) m5 i
    }3 a( G. w' c3 e
}
8 x  d! n% m4 Q; g" |; I+ L
小甲鱼最新课程 -> 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-4-23 20:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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