鱼C论坛

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

猴子问题

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

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

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

x
大家好!+ K5 T# C( f: U  {
这几天我在忙着编一个问题,我用了一种方法编出来!
9 a& C( E, e" |1 v% g, n4 J2 |. _但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!. r% }: y5 I2 s( t# r6 ]
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 # Q' g3 F# N+ b( @& Y+ m  V

; d9 d7 e  j" v, V
3 n5 R0 q- W6 d1 c0 ^8 l& z( O
                            题目
  k# X  y2 X- I  i+ z山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
; x8 C0 ?' n0 t; f第一种方法:利用循环链表
! W  [: g0 _. x+ T' o#include<stdio.h>
( O" u" D5 n6 f5 R9 |#include<malloc.h>' v. S! F! J; _# J: h8 h$ z
#define M 8            //共有8只猴子
. w& [4 i- _$ ?; j! O; |6 |0 y#define N 3            //数到3只时退出第三只
/ n; ]' j7 h) J+ t1 Ltypedef struct monkey
( H/ R* k& `1 J! s{int number;
7 T/ s  B4 E2 Bint flag;( s# e+ y+ e: r3 r, D9 f
struct monkey* next;
# w: r, ]% T  I5 I9 }- t}MONKEY;
8 T) M9 M" f  y; H  x! wmain()
* b7 t  ?  x4 X2 d. G% I* L  f{ MONKEY *head=NULL,*p,*s;
5 Q7 K5 N5 U# W) \  int i,sum=0,count=0;
2 h. _* O/ z8 y3 V& \  clrscr();              //清屏
5 }5 C7 Q8 g) @" h1 w) @  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
( j# v" U) F; c5 _7 _  p->number=1;p->flag=1;
  I" t/ h* b. @- L* [  p->next=head;
8 i2 q& n; P. j/ u; ^7 W- A: m  head=p;0 l8 I( v3 h9 Y! \6 M0 X6 j
  for(i=2;i<=M;i++)) r' u% q/ K# W: j
    { s=(MONKEY *)malloc(sizeof(MONKEY));
( r# x0 D+ M; S* A" g. r# K     s->number=i;s->flag=1;
6 @& V7 }  x1 J" T% u6 Z     s->next=head;$ }/ Y8 S' K, l1 P
     p->next=s;p=p->next;) m) ?6 Q' N) T; `9 M% n5 J. g
    }2 d  T; K: D% s( P9 z3 y4 E
    p=head;
+ K5 q+ `% w" n& I3 n   for(;;)
0 g) o* j& H" o( Y* v( Z    {if(p->flag==1)7 K, z* Z. O8 E4 g* X! b! W9 g
       count++;
/ ?3 R7 _' n: S3 I! \  ~) u, p, |5 r     if(count==N)! |0 b3 U" r+ S5 k+ s  \5 D+ D
        {p->flag=0;$ E; ^$ o$ _( v& Z2 ~2 J3 h
         count=0;8 Q; h8 ?# e  `2 Z6 b$ u
         sum++;}
) }. `' o/ I( [! f- h* ~7 F9 J. t     if(sum==M-1)/ E7 F" X/ o$ W9 T4 d
        break;# e8 x8 O& s' A7 P0 X
     p=p->next;
8 D8 a2 S; Y& `" i, H& ^4 ^# K    }
. ~# L3 D" W' V9 s6 p    p=
6 p. q& T8 P; ?    head;( ^3 n  N( l- D) q" r$ D& n
    for(i=1;i<=M;i++): d% ?' a: {3 z+ C; }7 j
    { if(p->flag==1)
7 E% z: r" Y8 q6 @# z% w        printf("\t%d",p->number);% _  _% Z; S6 X* d8 ?6 Z/ y$ v
      p=p->next;
/ a+ o% k9 G, b# x    }
/ F6 ~+ h$ C/ s5 [# R' b: a( _. m6 ~3 I( V5 s
' S' E3 K% \1 z% b) M0 v

6 P/ o  t$ ~7 c2 D/ n) V8 k}
+ B$ A" }, M4 W; A6 A' d
第二种方法:数组3 y. ]. ~' {( g: q7 L) a
#include<stdio.h>
0 y  n9 n2 h6 N& |" Q#define M 8
; J  N$ L2 B9 [  u$ H2 Tstruct monkey
, n: h. E* G- K3 D% q{int number;4 t, z6 e, N6 r& n
int nextp;
! \+ I: a6 Z5 b) d}link[M+1];
, m  d; P( ~4 E1 J
+ y8 ?. I: `. `- I. c% T5 ?. |void main()1 \7 W0 a& I* Q( l  H# Y
{int i,count,h;
0 Z1 I5 t3 A5 t. G4 T+ Pfor(i=1;i<=M;i++)
+ x* A$ u2 v# `% ?% x{  if(i==M)
1 M+ Z% ?4 P# Z( d# `5 ~   link[i].nextp=1;
) j; c- p7 N7 D8 W8 N   else
" @1 [, T. A+ a# L- y1 V4 N" v# y- s" e   link[i].nextp=i+1;8 n: x9 _7 e& M) I4 f! ]
  link[i].number=i;
( u5 p1 T" [5 K  b5 I" {  M$ r}0 E# ~4 R+ P1 j1 j) t- K
printf("\n");
- g6 b7 E7 d0 Q5 M+ acount=0;
, [# a  {* v- v8 m$ sh=M;5 E9 u4 _; l& `( i' h
printf("依次退出的猴子: \n");& V$ J  e. I8 M% a# C5 u1 j, H7 b. {
while(count<M-1)
) h. z0 t. W0 x3 O& k/ f/ v{i=0;
$ w, {; I. ?; n$ b( X: Qwhile(i!=3)' y7 y" r" J, [+ `1 _# A, z
{ h=link[h].nextp;
0 e% H9 a: R, }   if(link[h].number)7 I6 A5 j' Z& [5 v2 O+ Q* u+ h
     i++;}0 m$ g) j) v. T) R1 @

( v4 t  S, ~( tprintf("%4d",link[h].number);0 e$ y  Z$ r9 M- C3 K0 l* `
link[h].number=0;
+ r- @: J' m4 k* \* hcount++;' ^/ F' {5 `( g" V2 C/ z: i
}
6 @- o1 T- H+ Q* K" z; g. k
, c: T% q- G4 R$ t) lprintf("\n大王是:");
% k7 }3 O0 j4 ~2 H2 G, e. ]  for(i=1;i<=M;i++), R' {, F* X3 M% I
  if(link[i].number)& H4 h' \8 B; Q
    printf("%3d\n",link[i].number);
# l( ^) {( W6 i4 ]; [$ g1 F8 b0 d! Z4 ~! r
6 k0 b, c; E/ z* p
}
8 ]" @! z+ k/ p1 h
第三种是普通方法for循环
" F' A% o! c, ]6 z3 H$ m
#include<stdio.h>' t+ D- U2 j! i0 o
void main()  u) f7 V" s7 U) i
{ int i,k,m,n,num[50],q,*p;( U3 f$ _# h$ {4 C+ Q: U) y: M
    clrscr();
7 A' J! J- L/ W3 W/ {# B! I" x   printf("input number of person: n=");) A. m9 Y2 N; ~4 u) p, C
    scanf("%d",&n);0 U3 |4 e6 r* y0 y. |( q# b# w
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
. ]* h4 w# O2 @  d) S. {% J9 E    scanf("%d",&q);
, l; A5 x: Z; V6 M   p=num;
+ d7 n2 I: q( B; J' w$ B' B" ~: m* ^  for(i=0;i<n;i++)
$ _" U- p0 v+ ]; r1 J. W, v: [/ x* m2 \    *(p+i)=i+1;( S  X1 F8 ~( k/ h' G  U
   i=0;
# m; i/ {0 d' h   k=0;
! E$ b, l! K; l! ]   m=0;
- N/ j& W* h9 e  y& N0 @  ~  while(m<n-1)! T7 r+ z. i1 p( Y7 L$ @
   {if(*(p+i)!=0) k++;. A* X7 o" C3 b5 u# @; P1 s
     if(k==q)+ D8 e( |0 X& O% K* ~& n3 t
      { *(p+i)=0;% D3 l# A! Y- J: C
        k=0;% R. T$ N8 r8 e  S6 V
        m++;1 l5 ?; d: }, n7 C9 y/ y
      }
# j6 I: P, a4 B! V) U! U    i++;
  B# T% `4 F. i9 n1 u3 ?! v    if(i==n)i=0;
2 p! Y9 ?! ^) O7 _   }
4 `/ S7 n9 x0 U1 ]4 Q) K  while(*p==0)p++;
7 Y  @9 u5 ~1 }' ^5 Y9 L    printf("The last one is NO:%d\n",*p);
8 W9 B: Q% |. e* a     getch();; i. q. D- ^" I  P5 t' u( t

3 R- U/ n+ J  _5 r! S}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;( {8 K8 p( g8 Y  r
namespace 又费马达又费电
2 G$ u8 I$ ^& p9 L9 I  P0 n3 H{3 c, D3 d4 u% O3 C, [9 P7 D8 K6 d9 O
    class Program- a4 h& Y/ u- h: l5 p' K
    {
) s' E( V% ]* V* R6 P% F3 |        static void Main(string[] args)
' D) H: b# H5 c( `+ ~        {, R1 p5 i; G0 M1 D, x0 z
            int m, n;0 h5 _  |; ?# @6 y
            Console.WriteLine("请输入数组长度");
! f3 `, b& \& ~/ P" _$ D. p            m = int.Parse(Console.ReadLine());//m为数组的大小. H) J. [/ @1 X( b
            Console.WriteLine("请输入要截取数字的大小");$ ?; D9 B$ p- i  @; t2 A" z) ?
            n = int.Parse(Console.ReadLine());
0 Q4 m9 p1 q3 R            int [] numw=new int  X6 X# F3 O6 q8 O
, f' I1 w- y1 v1 _
&shy;&shy;&shy;;1 a( u! f) \: V
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数1 R6 h  \* o" U2 x' |
            {+ s' Z$ s+ R/ L9 `! m, a5 j
                numw[j - 1] = j;
  P9 ^# v* I3 n2 R- S4 c+ V& P            }+ n5 ?5 @) L5 l# D" I7 y
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!. K1 G* V: x* F& ?8 {& M
            while (d != m - 1)2 w! ~, B8 ]+ U! Y0 s; X
            {
* U4 {. _4 N) o3 F' Q, t% I                if (i == m && d != m - 1); Q0 h5 I. \9 |/ s
                {
; U1 V# U7 o( L, k" y. u7 h                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
" w. W& w, B* F                    continue;
" ~: R0 K# t) ~                }! E& _. x* |) r4 G
                else
3 k# N5 _1 e7 f9 {8 G8 r                {
8 T. h+ p3 Q# Z. Q/ n                    if (numw[i] != 0)& }2 V; X3 ?& {# E' F
                    {
) A+ c7 s( u3 U8 o                        i++;( @* f" @6 S& {* t. O9 G
                        k++;
3 U1 _. J# n! h" @/ ~                        if (k == n)
, c/ _3 W9 u$ j( g  v) W8 ~                        {1 z# x4 V& y' m2 J# S% j
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了: V% Z* p1 b  x% G
                            k = 0;9 m6 y) P2 g/ K7 K" G
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1$ p& X3 W; j% m% ~, M
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);2 A5 d1 k2 S6 t/ p$ [
                        }
4 Z! S" S; A! s8 g) R0 q                        else//输出暂时还没有改变数组元素的值
! G/ v: \0 G( R- o: U                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; L4 j- X$ s4 U1 @" L# `1 P7 g                    }  o+ D5 Y: ]5 H3 p% P6 G" F% X
                    else
  U. O# b4 s6 B' q+ _; \& _                        i++;//数组元素为0,直接跳过,不计数。。。% K; j8 W9 [$ R
                }8 m% ]$ b9 K2 r, e
& k0 @3 F% @! C  \; a6 [

% w* H9 o- Y# p$ o: `            }//结束while循环+ u" [% G8 {$ H! V! w( z, b  s
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
$ L4 O2 B2 j9 C8 z           / f* q) a& A9 _  ?" F
                if (numw[i] != 0). T2 ^9 U" K* e2 B
                    Console.WriteLine(numw[i]);% u" C' ?: n! |! l% [7 g
           
: y( W: x& H: H            Console.ReadLine();
7 j9 ~4 u* d0 n+ h        }8 M, f, ~4 p7 |! g5 U
    }- M! F6 J& s. R$ E/ s5 ^! w
}0 h; Z7 ?5 `" }9 z4 k7 f0 ?" `6 T- h
小甲鱼最新课程 -> 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-3-5 04:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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