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

猴子问题

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

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

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

×
大家好!3 b' k2 O5 S; D
这几天我在忙着编一个问题,我用了一种方法编出来!6 J) o& y# h. G
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
! V9 V4 T% n, r$ y2 M" B注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
$ e* J' J) T& l  T
: r* Y$ o! m( [& d7 j1 ]) O; K- @$ k7 I, L7 s
                            题目
' s1 i0 m( U2 r4 Z5 ~山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
7 W. Q) z# b3 `; }  d$ O第一种方法:利用循环链表" e1 I6 o7 s/ b0 ]
#include<stdio.h>- L& k) D& R; E9 h
#include<malloc.h>
" g7 I/ }* k1 Y$ P4 j+ r#define M 8            //共有8只猴子3 c. w. R; W2 p$ ^# t# s7 G
#define N 3            //数到3只时退出第三只
( g1 ]8 L! l" Y" r" Ctypedef struct monkey
$ A  \2 b% |$ \{int number;3 u  r1 A- @; F9 t6 d
int flag;
& l' _4 |) J0 e* r/ m& qstruct monkey* next;( r3 G- x4 @+ h4 |3 `
}MONKEY;
2 E# P' d8 [3 F  L, t' xmain(); c! X, u; p  x
{ MONKEY *head=NULL,*p,*s;
0 I. [$ N) ~- h7 w6 r1 I  int i,sum=0,count=0;
( p2 Y* @" K: ?& N8 W. y  clrscr();              //清屏
/ Z+ j# Z, M/ t3 |+ A  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存3 R( s; u% d6 w) l
  p->number=1;p->flag=1;
, R+ z" V% q+ ^) A  p->next=head;
, z0 F0 {' z+ E: W  M/ ]6 A  head=p;
. ]; G) ^$ C6 m& Z* B: [1 j3 b  for(i=2;i<=M;i++)
1 |% T, w& x. ]. k# t* D    { s=(MONKEY *)malloc(sizeof(MONKEY));$ W% _2 i4 b2 |. }
     s->number=i;s->flag=1;
1 a+ P8 s9 ?% w$ |" k7 a3 H     s->next=head;
( t6 V8 m; o# s, D     p->next=s;p=p->next;$ k7 g6 z+ p! G/ f! \* e
    }
, W8 N7 I- i2 Q2 p$ s3 H    p=head;
- Z4 K. J: t) K) C7 ^   for(;;)
' f7 |7 F3 A( A6 n; f5 J- ]    {if(p->flag==1)
+ h4 z7 }! t" b" b       count++;: J. h/ D2 `3 {% S. G
     if(count==N)1 s, W+ R- Z+ L) s8 ~8 w& ]6 m( Y
        {p->flag=0;1 H" G  q4 W0 e5 W# J4 E
         count=0;
$ V7 f6 L' a) e         sum++;}9 O8 \8 Y/ F0 r+ z  I0 h% `, n( l
     if(sum==M-1)$ U: v5 i. i: w. i# |: C, l
        break;
: w. M; m$ i6 p" ]$ ~8 c! i+ ?     p=p->next;
5 N# M+ A. H+ @1 B' n/ _    }# Z/ D3 H7 y$ R) w# t3 m, [3 Q
    p=
8 l$ a: J- O3 f    head;
: U3 o+ t$ v; h. Q& M+ X: t    for(i=1;i<=M;i++)
1 `& Q5 D$ i: v2 }1 J( t; w    { if(p->flag==1)
4 W8 M4 H* R0 m  v9 C" ^        printf("\t%d",p->number);: G/ S0 u) E0 Z/ Z( I5 C
      p=p->next;7 C' \1 ]8 k# [# G. E* ^
    }  `. m# M  j- o$ s8 Q

- Q7 I. J: f* `  K# k
( i; C7 R. W) V" _; C" t& v3 D2 q
) G& y3 `# J- e1 E  ?3 X}

% |) ^. `5 N6 R% A$ Q5 ?第二种方法:数组
0 x. [- R$ ~0 I% i0 S* D3 y#include<stdio.h>
: Z) @1 }7 u( P! K. E" R#define M 8( W8 {& \9 `4 Y% H: ^; E
struct monkey
6 n$ ]/ n" a# q{int number;4 q9 C; m+ k+ m4 M& @" H5 q' o
int nextp;
# r( S* Y6 P  P}link[M+1];# ~1 s) h" r& y: p: O
* B. ~. b7 z3 X5 K
void main(): r8 `0 d+ f$ `
{int i,count,h;
' N- _4 h: y. ]5 ?( h. \6 b6 L) G+ Dfor(i=1;i<=M;i++)! K" a" Z- d8 H* ]
{  if(i==M)) Y) t0 ~) h& h; ~# I) G6 I! J6 ^
   link.nextp=1;
# H9 b  t6 c9 `% J1 g   else
8 X3 g& Y$ u( T4 f   link.nextp=i+1;
- Z7 p) W3 y  d: P  link.number=i;+ t8 o5 M6 k$ n& J) K7 ]0 U
}
1 K$ J: n8 k+ M) ?0 X. Q1 g3 H/ _; Oprintf("\n");4 C% E( I" F, ?, L2 W* ^
count=0;1 Y) a+ K, g  s9 \
h=M;. ~7 E, R! I% \, c& P7 n
printf("依次退出的猴子: \n");. s5 Y# L& \& M2 B: h  f: O0 r
while(count<M-1)
4 u5 c7 `/ H. X3 o9 K{i=0;
2 ~/ e0 s& z, P+ O: i* G0 Qwhile(i!=3)
$ e- s! @: \7 a- n5 ^% D' h{ h=link[h].nextp;
4 s5 s1 f5 d% X; C* I% v) e  ~   if(link[h].number)
  j$ x' z2 j3 c  D/ ^" U/ Y     i++;}
+ `7 u. k  ^" X* w
+ J4 `5 o6 p  f3 J! Iprintf("%4d",link[h].number);2 j9 J4 m5 G+ ~& J4 b) {# s
link[h].number=0;
; \; k. D: `3 t7 l1 Z7 ^& I  xcount++;
/ v7 O3 e" @: e- v, t& b2 s}
' H6 q. Z& ]1 \: v0 Z
/ `& s6 Z: r: R9 e0 B( fprintf("\n大王是:");
8 V/ ?* O/ [: D% U6 a  for(i=1;i<=M;i++)/ d& y" J" y! j# \0 r0 H- [/ B
  if(link.number)- P4 A1 ?$ @* K' b/ R0 m  R! \
    printf("%3d\n",link.number);
! o; `7 g- l; R  }& \5 v
) \- \: ]: }- d! X9 e4 u, ?
9 _& n! T, Q4 g5 Q5 C) H% `}
1 X/ `: W" M! P) P7 c8 `/ m
第三种是普通方法for循环

' F, z8 c& e9 c, S' k: U#include<stdio.h>
# ^# B3 ?4 f2 x- J" j5 I8 q! Q) svoid main()
4 ~2 G% i9 a3 h* L. S; y{ int i,k,m,n,num[50],q,*p;
9 {# C9 X3 z4 j2 V6 s8 w/ [    clrscr();+ @$ d8 v* c1 E6 T
   printf("input number of person: n=");& z7 Y) W6 V2 `- }+ _
    scanf("%d",&n);9 M, N- V8 t" J
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只  @" B! K9 ~. i" ?
    scanf("%d",&q);
8 j& g* g. C& P% d$ o   p=num;
- V  V0 E# K6 D2 q& s* W( V  for(i=0;i<n;i++)* m1 f) d. y3 c, J* f
    *(p+i)=i+1;3 b7 K% W& ^  U4 y0 l- S4 n" }$ z" E
   i=0;
; M* B# _6 J' q6 N) K1 H* j   k=0;+ R" X' z% A$ z. J+ f
   m=0;
% [, J2 Z0 ?: Q; z$ E9 J  while(m<n-1)+ _/ v/ H* z, s8 v2 }1 |3 {
   {if(*(p+i)!=0) k++;% v, D: ~" m* r; `6 v$ a2 n7 C6 E# x
     if(k==q)
/ `3 Q: }. p. c3 J! `      { *(p+i)=0;
8 }5 a9 B4 u3 a1 w3 c        k=0;
1 u" `/ v8 P+ v. v; E        m++;! n5 {$ A  z/ X" B( J& Y
      }# A5 {- b- b9 Z4 T$ Z# k3 C
    i++;  O; c8 O% ]6 f( Y9 F9 G
    if(i==n)i=0;- S, Y; x' b- _$ b2 }1 D
   }
# P: I  v& I$ V5 Q# E4 d  while(*p==0)p++;0 ~7 A( J( ~& e1 `
    printf("The last one is NO:%d\n",*p);
4 p) a$ M2 E4 v/ I' ^* g     getch();8 Y, d" E: h2 l+ D  ?& A

6 }! ^6 J' p# {! z: X% k}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;1 p, v" p* I. j5 ]
namespace 又费马达又费电
" I  @- r* C0 a! t5 h{
+ F/ ^& s9 n1 i9 o4 p7 A- S- q6 H3 d    class Program; K# B5 I# s) [9 o
    {
' [/ T' Z; r) j        static void Main(string[] args)- ~. q3 [# i: r
        {' @+ m8 W. }& P# c
            int m, n;
5 v8 m( ~" J  J! t            Console.WriteLine("请输入数组长度");2 i" w  }# m8 `) N7 D7 ^* M4 Q8 l
            m = int.Parse(Console.ReadLine());//m为数组的大小0 q8 p2 z1 W' N1 [! k( o5 z
            Console.WriteLine("请输入要截取数字的大小");
$ P, U; D1 K$ O4 B            n = int.Parse(Console.ReadLine());
$ B* @$ N" a  x7 ]- N            int [] numw=new int8 G. H6 I. ]" x* |5 }

, r4 |$ X: _) p% c& o6 w&shy;&shy;&shy;;
1 j. A' {, @% L. E5 P6 S. E- p            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
. v; B5 c& I) x+ F7 @& i            {0 b& b5 O$ I: y+ P
                numw[j - 1] = j;
6 {. I( n. i, s0 U$ L            }
7 p# Q$ w- e+ C            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
+ @6 i. T* [2 y            while (d != m - 1)
9 o$ h" f& Y* U" N$ g6 o9 q. j8 d# n            {
0 C- O5 u" ^: u: U  s. j" D! I: r                if (i == m && d != m - 1)4 s+ ]8 ~0 F# }
                {
; B- |( m- k+ w0 ~                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
. p2 Y- M8 J. S0 S, ?$ D                    continue;- R, h* p1 }5 v7 _8 s- `8 S
                }  b' E( i0 F. Q) g, @
                else
6 ]3 l8 m: B0 o+ L- u+ x% w                {
+ g- k4 n- @8 g- ^                    if (numw[i] != 0)
! L6 ?' k1 A8 c( r6 P* k                    {
) Z& X- M. k! _' M                        i++;2 p% \& p. p+ f6 ]  h
                        k++;
- u8 j; z* t. |+ Z/ \) \8 s                        if (k == n)
4 j' [9 K6 U1 A$ M, v7 ?1 b# ^: j                        {& S+ S& e! X5 M$ U8 j7 u9 H# b
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
. x0 e1 N, r$ E/ m0 I+ m, ]; W, c                            k = 0;
2 M  Y2 b2 ^+ u              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
9 y- F4 h" ?7 y, K1 I                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);; V8 f, W' Y. W2 ]% k
                        }
3 i6 B; y( e+ y7 G8 j                        else//输出暂时还没有改变数组元素的值1 O! m, {0 [. {4 j2 W
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
# m, j( Z2 f# v6 x9 [9 K) z                    }
$ E( a  c0 q  P8 g* R) W                    else
1 T+ Y7 H" m) x8 G# c7 z. L                        i++;//数组元素为0,直接跳过,不计数。。。9 _) H) A3 ~' x$ q8 b, n2 ~4 E
                }
$ [: i" q+ `2 s, Y8 P' }4 Q  _
: j  G2 H4 u3 r6 K! P. c" @, t7 b; g( R& H1 E* `& i
            }//结束while循环4 e" N3 e2 W/ F* F
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
! S$ b0 C) |) S" A9 b% t- S# u! Y7 b           
0 c0 ], C. L$ m2 j# O7 k                if (numw[i] != 0)
# u% y" Z; @3 k3 e# D, f: }                    Console.WriteLine(numw[i]);
( I1 G1 ~$ l+ q           
3 V( b6 Y9 J+ t* `1 t# M1 R; C            Console.ReadLine();- z! i3 s. R* q; K+ F: Z
        }. n6 W1 Z( Z9 @; m$ E
    }. w- O( W! _2 C* C) a* Q- A$ G
}
9 [, E6 m+ C$ i. j3 P
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 1 踩 0

使用道具 举报

发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

Archiver|手机版|小黑屋|鱼C工作室 ( 粤ICP备18085999号-1 )

GMT+8, 2026-11-13 06:29

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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