鱼C论坛

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

猴子问题

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

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

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

x
大家好!8 F2 t6 G- }2 A0 W& j
这几天我在忙着编一个问题,我用了一种方法编出来!
5 k" E5 B5 g5 ^0 x, t: v但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!8 I. p0 I5 i2 O0 _3 ~0 v# o, Q$ c
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 . T' V( W% Z: h, E
" y+ t! U# g: f7 E5 y

* k! ~) d. D, J9 }
                            题目
4 T) B. P# Q$ @0 U3 y  {山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
+ H- L4 R# `! _5 s第一种方法:利用循环链表) L) Z: W2 {, M& e' n+ W7 X7 A
#include<stdio.h>5 S& D4 d' [1 z" [7 L; i! Z
#include<malloc.h>
9 H# b* @$ M  c  \# M: K#define M 8            //共有8只猴子* n- t) K  ^5 o# ?- _5 v
#define N 3            //数到3只时退出第三只
+ _- u  b& J0 d! a% g) Vtypedef struct monkey9 H0 l1 }0 V& ]# a
{int number;9 u" Q. m' i& u) u  d* {3 y
int flag;
+ r# K' F  ]) Y' ?6 jstruct monkey* next;6 E/ C' p9 u+ K
}MONKEY;5 h! J! g+ L! t: ]7 x& f
main()6 h1 O" Y4 B- ]6 k0 u; P3 k% ?( Y9 l
{ MONKEY *head=NULL,*p,*s;& O# y2 @7 W* O3 u
  int i,sum=0,count=0;
0 G+ ]* `0 @* m" m& q  clrscr();              //清屏% z, M, Q2 `& I' t8 |
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存1 |3 h; C# E# L: H/ p7 }0 I
  p->number=1;p->flag=1;
, T* i8 j: p% N$ l1 d8 \  p->next=head;0 j4 ~3 v; ~1 Y
  head=p;2 X% g" [, d1 E* N# ^$ X+ A
  for(i=2;i<=M;i++)
. {+ S) u9 E* f& J/ ^) }9 ^    { s=(MONKEY *)malloc(sizeof(MONKEY));6 _& Q% @/ A3 @, a# v, x
     s->number=i;s->flag=1;
, n8 ~8 q" M) O     s->next=head;0 M6 F+ o  h: s+ I5 H1 m+ Y
     p->next=s;p=p->next;+ S7 v9 @% ^% c/ s: z$ G
    }5 H. [  N( y3 ^% B+ `
    p=head;* B5 W, k/ G) ]/ ^( v( F2 O0 e
   for(;;)
# s9 g0 f/ u3 p7 c; B" k    {if(p->flag==1)
* g! ^1 z' x# l% }       count++;
% r" }; A4 o3 E7 w- K     if(count==N)& D* Z! r5 O& X" r, T7 q- x7 k
        {p->flag=0;
' h: B- M. u" |         count=0;
( e1 q/ Y, r  ]; l0 M  [! Q         sum++;}8 N" f* M. N5 I- ?: h+ t& ^
     if(sum==M-1)( \& a3 P# O5 Z6 ]+ C1 l" l% [
        break;
$ E4 S) ~  j) k6 r5 S     p=p->next;
% a2 S" [5 l$ j  Y    }; c3 x1 M2 m% F! d3 J
    p=; y* |+ ^7 z7 `
    head;1 h7 R3 o- U% f  {8 F; T! g
    for(i=1;i<=M;i++)1 E# R/ O0 K" Q! n
    { if(p->flag==1)
2 S8 i7 w/ t1 U# F        printf("\t%d",p->number);
, l2 G# q: w  t0 }' `$ [5 Q$ M      p=p->next;
6 ^& g  e& W" K7 C0 i2 C: H0 [0 d  ?    }
0 o1 `$ Q2 }; w: h; m, J1 v9 L4 q2 j- `! z. p2 e% s; i9 B" C3 v
, w' U& a, B- t% k; i0 K7 n" E
5 c0 ~: a3 I9 T  Q1 H* \
}

. w' E, C; D( ]: M第二种方法:数组% _9 d. {+ {; T
#include<stdio.h>
1 ]  P; Z5 y# o5 c#define M 8
" N! v0 k7 W) r) H% j* q6 ~5 r) rstruct monkey
* k5 i: W) D7 H# {{int number;0 R1 i+ t/ ?: {2 `  ~
int nextp;
; X( K7 T, G( Q7 k) }- e}link[M+1];
5 z6 m5 N0 a* Y! m* z) R* F
; u2 t- F6 U1 y# u  N6 A6 svoid main()3 w9 j) i+ T3 V( _+ ^' e
{int i,count,h;
  u3 T9 C$ P) z6 d: |+ I) C; Z: sfor(i=1;i<=M;i++)( U+ l9 B) D" l+ d; G4 P2 U3 l# h- d
{  if(i==M)
' T. z3 i9 E- s, x  |   link[i].nextp=1;
7 F- |" R! t  `   else
: ]2 y- R+ A5 V# t  }7 i0 x   link[i].nextp=i+1;8 ~% Y) a8 I; }7 W* {5 A  H
  link[i].number=i;- a1 c' O2 G( K
}
! z1 I: i9 T4 q# D! g, p% c- X; Wprintf("\n");
8 R) [5 L* x$ e! v- Q/ jcount=0;
1 M$ r5 J7 k; R6 T1 {$ O/ [h=M;
$ K# ~& C: v, S# `+ n0 zprintf("依次退出的猴子: \n");
2 k2 J2 A1 }3 ^: N& F: ?while(count<M-1)' d5 v2 J% V/ V) a) F
{i=0;1 R9 Y* e  m" \6 U; F  w- u6 c& m
while(i!=3)
- k4 p( }/ g! w3 K) ]/ y{ h=link[h].nextp;2 ~" v# r) Q- c! Q
   if(link[h].number)
% T6 h8 u- q/ I: h. @/ Z     i++;}
) |7 q9 V& L% g6 Q4 U+ C
- Y: u$ X, C6 E& I9 D  y9 e+ eprintf("%4d",link[h].number);
3 F9 a* y" N! k5 P( s3 n4 W* Slink[h].number=0;
$ z: m# O, {) }5 i4 d! l& T- Vcount++;, ^. L5 p2 w. J, K
}% L+ u9 R  u7 c! {" o. s7 W) m# e

! L2 I' e9 N/ W% ~, |# wprintf("\n大王是:");: I# y  `: T) V/ A
  for(i=1;i<=M;i++)
# J! ]- t3 w5 ^5 v3 B" L  if(link[i].number)5 A4 R$ p4 V# ~( N3 U. H& h: U
    printf("%3d\n",link[i].number);1 P; Y! y8 f, [% C
3 }6 i: _" z* |' M6 J
( k, H* x2 u' j- o, B  O
}
; @% d4 W) c: z% Y! f+ `2 X8 x
第三种是普通方法for循环

4 O3 X" d# K0 x, ^: M$ D#include<stdio.h>) I% M' j# z/ R: t. h$ D9 ?
void main()3 o. Q) s: C( U4 t' c" M
{ int i,k,m,n,num[50],q,*p;6 a# A+ @1 j- P7 Z# \( i
    clrscr();
9 Q4 g5 E" G; u% m( n: P& p   printf("input number of person: n=");  w- `9 @% G9 T) F# c& y
    scanf("%d",&n);3 s8 p7 z% g( k! W( ?) U# a  K
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只9 k3 g; P& q+ J# u( c
    scanf("%d",&q);
+ }8 c' Z' Q: `( D1 G0 V4 b   p=num;
2 Y4 u# v3 m  ?! H3 Z' [& x, U8 f- n" J  for(i=0;i<n;i++)
; y& z+ n; c9 p; E0 M+ e5 I    *(p+i)=i+1;
% ]$ b% Q/ F5 _5 D   i=0;
9 {6 l( d, G! P! A( b6 v   k=0;; \# D# \- W% B  L& j: v2 W0 W6 I
   m=0;7 H: J4 I/ M1 a# U
  while(m<n-1)
9 G) h/ D( j4 F  h1 f& M+ _6 [- D+ X   {if(*(p+i)!=0) k++;$ A: z& z+ O: X+ h3 X3 n
     if(k==q)
0 K+ ?7 V3 V/ n      { *(p+i)=0;
- N( u0 x5 r+ j* r4 m        k=0;$ p' Y- k2 S8 c
        m++;/ |' S0 M; u8 P7 W3 U0 A0 y
      }
5 q6 W2 B; W, P    i++;
% ~* M6 a2 e) V$ v( g; w7 d2 O    if(i==n)i=0;
( W7 g- m0 L6 j" T% B" n3 m   }* l% R' Q& Q7 V+ Z, r
  while(*p==0)p++;
: M& ~3 A5 Q/ c& p+ e+ Q. u/ H    printf("The last one is NO:%d\n",*p);* i- C: I: T% n- `( F0 O& H
     getch();
. \/ f5 m5 p( T5 K6 G$ B  D8 C. H$ v' T& }4 `# b
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
5 Y- h6 }$ N, T0 wnamespace 又费马达又费电
4 Z! |! I/ ^, O{
# G3 v$ B* ]/ [& J( }    class Program
  |9 \4 X/ I5 g' p    {
. U7 ?" D" U% Q$ \; t9 j        static void Main(string[] args)
9 L+ [! M- C6 D: A        {
: U5 P) q/ E6 E; H( r+ i3 ^8 p            int m, n;
4 |  P7 c3 B' P9 U+ V" q, e; b            Console.WriteLine("请输入数组长度");5 |1 A! F; B( U* |
            m = int.Parse(Console.ReadLine());//m为数组的大小
# N# ~7 Q+ B; p8 o- y9 U            Console.WriteLine("请输入要截取数字的大小");
$ T- C7 x+ ]+ P/ I            n = int.Parse(Console.ReadLine());0 n6 m5 \& e% V
            int [] numw=new int
& w" g) F% _: y$ S% L6 t! Y8 C/ F+ N, w, p/ {5 p) V$ }
&shy;&shy;&shy;;
" k/ H. t4 W5 T# Q" q( j            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
% J- x- }+ o1 P) A( i            {( L9 A4 r# l# {8 b- l
                numw[j - 1] = j;
: @$ U& F" @5 \: L            }" S$ S! y0 y' N* F
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
5 b3 ]$ [1 a0 L2 e. x            while (d != m - 1)
- x) [: m* z. x. N& @6 ?( a            {
$ Z' D; m/ K+ R$ G2 K" _                if (i == m && d != m - 1)! {* P8 L9 t2 x$ }
                {
5 W& v, i6 u. D8 P. U4 h                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!0 L, q7 @+ ~( B
                    continue;
+ H, i2 B  c& g/ B. N                }# k1 `, E/ I0 L- u% R; b* ?3 }
                else% g$ ?) J" V5 z; J' d2 F* g/ Q
                {" U/ ^: o$ v" \9 O5 [
                    if (numw[i] != 0)
! N3 l2 r  x& T                    {
7 V9 \. ~4 x9 B1 F$ Q. d! `                        i++;4 N  V# B7 J8 N
                        k++;5 s5 {% L8 x0 a1 s  G2 ?( G
                        if (k == n)
* }$ e; I9 e1 n0 R5 Q% N                        {9 e4 c2 c8 U) y4 t3 \8 Q
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
# C& Z1 y7 D: g+ X+ D; f) O                            k = 0;
. X  S$ _2 ^9 d1 O/ e7 z              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
9 `* K  V- ?6 B3 [+ u6 ^                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
3 |  u/ A( `, x1 e- O                        }
6 G" y3 ^+ A3 ?( o  d5 F                        else//输出暂时还没有改变数组元素的值  H1 J( M4 S/ b! z
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
% u/ k! o9 I7 a3 D* k: A/ }0 D/ p                    }9 M: d  s2 r9 y, E, ]* @" {
                    else
# M# d- m9 v+ m                        i++;//数组元素为0,直接跳过,不计数。。。/ _7 x' N' o9 E% f
                }& `) l6 y* H. v# w+ l8 w

+ v5 t" i& \+ p$ ~" q3 F& p! ~
, R0 G  K: ^. e) R/ P3 ]            }//结束while循环* {  I) k8 P" }3 G) X  g) u6 a
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦* x/ \* A: `! ]( @  w; [5 ~
           3 Y! j" G. I/ Q7 z
                if (numw[i] != 0)0 b$ `+ h# j6 J
                    Console.WriteLine(numw[i]);: O. m1 b- [6 l" v' v2 }
           4 {$ t+ }* e- j2 j* U
            Console.ReadLine();
7 o# e. J8 K2 f& G        }# a6 s: P0 ?2 }1 ^! Y3 r$ E
    }" q% g# s! L% r6 ?6 F" e; z
}( Y9 p6 ]' X' X4 B
小甲鱼最新课程 -> 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, 2025-11-8 21:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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