鱼C论坛

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

猴子问题

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

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

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

x
大家好!
0 q5 Z, K% L$ l, C( ^% H( F这几天我在忙着编一个问题,我用了一种方法编出来!' ~; ^4 ^& s  T3 }+ ^3 r
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!4 o) _3 g& g, x( M4 B; ?
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 - U; h3 t$ E/ r% W

7 m" r" [) }* S, s5 `* H2 i
* n1 {( C$ _5 M9 O! s! A/ J7 D+ E
                            题目, g3 e( F0 E! Z* y/ h9 p4 G
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。2 \. }( T4 N4 O7 B$ d
第一种方法:利用循环链表* a1 L( j! N% P
#include<stdio.h>
, A1 U1 Q7 c; S  `$ P#include<malloc.h>* F: [4 L8 `; G* x! k: }4 @6 v
#define M 8            //共有8只猴子" v6 Z6 v5 e3 y  ?0 b: p' x) K
#define N 3            //数到3只时退出第三只& M% _) h, f- k5 K; f4 E5 z
typedef struct monkey
8 ^& [0 Z) R. T2 I* F{int number;
6 p! E7 K8 [* ^( q/ S; {int flag;
! J* l* T6 Q9 b, ?6 `6 X# s, |struct monkey* next;) Q, h. z/ L  O% Y
}MONKEY;1 m. {# F1 j1 S7 a$ H1 A: f' {- i
main()- o# r( Z6 L* H# s. V% A7 }& ^! |
{ MONKEY *head=NULL,*p,*s;; q# b' Z  m/ c- X" V* o6 |9 f* \
  int i,sum=0,count=0;4 @9 o& O# F. i
  clrscr();              //清屏
  Q1 I8 S+ i# q. h: P9 k0 Y  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
/ O" |/ E: m. o6 e  r9 |  p->number=1;p->flag=1;
  p' D3 L. ~6 r- \8 c  p->next=head;$ m$ |+ }+ G- k, V
  head=p;
$ O7 W3 I  ^1 p2 U; S  for(i=2;i<=M;i++); H9 i& A6 Z+ H# M
    { s=(MONKEY *)malloc(sizeof(MONKEY));
7 T+ j- r  G9 u5 e; k; P) _     s->number=i;s->flag=1;
9 t/ I( d# H- {; K! W     s->next=head;
6 b6 \; z- w& z. y     p->next=s;p=p->next;
5 S% t  E6 m  w$ @$ x: _% ^/ p    }
; X3 ~  x# G6 c3 B: V1 W* h3 b' t    p=head;
9 U7 O3 Z4 d, O$ u   for(;;)4 w6 v( C2 a+ Z2 u$ Y% C4 Z
    {if(p->flag==1)
: z1 R7 _% R8 |       count++;
' W6 i8 u/ k) l% J0 Y& Q     if(count==N)0 M" Z$ O  H# T: q" P, l+ t
        {p->flag=0;0 X  \6 u4 O& C# E7 w2 H
         count=0;
1 w1 M/ M) f. i! C         sum++;}* B" b: I6 ^  ?
     if(sum==M-1)
: P4 `7 I' T$ N/ \6 [        break;" b" ^1 L; Q# x" t4 g' f
     p=p->next;+ T9 b5 f7 W/ f, F1 X! W' ]
    }
  O* l4 D3 R- d3 x# A2 U: O    p=
3 _0 @9 A! t$ W- b1 B    head;
; |6 @3 K, K6 \  J    for(i=1;i<=M;i++)& r2 h" F& l0 c2 f
    { if(p->flag==1)
* _3 Q! P2 c3 }+ V4 t        printf("\t%d",p->number);8 f9 h* A3 n- i$ A
      p=p->next;
$ m/ j7 ~3 |' J6 r! x    }/ c1 Y% _4 B0 g; D
# r- P0 }" g: n7 a+ l
. e+ s7 C1 j" U  M! C, p
5 h8 j! S  x: t0 O5 q- R, ^# _
}
9 o; G% a3 B& f$ t
第二种方法:数组
0 E# O" Z' l' H" H' j  _. ?#include<stdio.h>4 ~+ B% o- _  V4 E6 [+ l
#define M 82 P9 V( c' e8 J1 @4 r
struct monkey/ T& G7 w+ r! E
{int number;
  n# V# r4 d5 t5 T- Kint nextp;5 e( q6 c; Z1 @7 \
}link[M+1];
' j# W( l5 p% q0 q) s1 ]; B; `6 W! D. L1 [* v  \
void main()
+ C# ^) D/ k9 S, s{int i,count,h;
, B4 S: f1 y+ G8 P8 }: Ofor(i=1;i<=M;i++); a8 ~: P# s9 ~
{  if(i==M)
+ e* F  Q/ r  D   link[i].nextp=1;
0 _# \" @" r6 o4 y1 P' ]$ C   else5 \+ G+ ^, c% A
   link[i].nextp=i+1;
0 L6 @8 p2 u$ _+ `, B1 X7 s  link[i].number=i;
" [& _) _, U: h9 T4 \9 B}  {. S1 l: e7 M" s. m
printf("\n");
3 j" g  U& l% J) ~count=0;
# ^; S: J% `& Q3 ^6 Oh=M;  y$ ^7 m3 t  l5 d  o+ o# {
printf("依次退出的猴子: \n");
- v1 Z; H5 I( F" w9 kwhile(count<M-1)
. L& t% }+ S3 i( m2 [/ N{i=0;1 ~! F% F. D" F+ ~
while(i!=3)
' `& l5 {0 ^  P" \. R$ B0 H9 }6 d{ h=link[h].nextp;/ F+ F2 K8 Q6 W- K% Z8 e1 `
   if(link[h].number)3 U: F' ~5 e8 Y# q; r9 x( W
     i++;}- A2 Q) R' P: E7 _+ z0 v: D$ U, F

8 I: g, {: _6 a3 u- a0 d& }printf("%4d",link[h].number);
  n& l5 \7 z9 i" l- \link[h].number=0;
2 q  k' e2 P4 g8 icount++;7 f, C( u" f, B$ T( w( B5 g
}
8 [' U, m$ O8 J! g6 O' D) |! B3 w$ Q7 {5 A1 D1 A: U! Y7 f
printf("\n大王是:");9 |4 e) T6 Y6 k3 L8 |4 x# J
  for(i=1;i<=M;i++)3 e# Q# F- _! [8 K
  if(link[i].number)
/ s! Z6 Y% `% @6 E9 N5 p) a    printf("%3d\n",link[i].number);- o  j2 _6 B" h1 L3 P8 l% O& U: F

; a; ?" a' U6 K/ A6 T* A
! b/ i3 p; Q* [4 u) H5 L}
" H( Q! m+ h' o8 L; W3 e% l0 Z; \( M
第三种是普通方法for循环

. L/ S/ F" b% C2 `8 o7 j8 X+ d#include<stdio.h>
1 P0 ^" h% T/ A8 Y, D. y3 dvoid main(): r8 Z" o7 g0 g2 y
{ int i,k,m,n,num[50],q,*p;
5 `0 x) G. N' U5 L3 l: o    clrscr();
. m  O5 O7 h+ i( \6 e" }* ]8 \   printf("input number of person: n=");
: Y8 H1 L3 R3 X! I  o  q# Y    scanf("%d",&n);7 m$ x  W' H8 p/ g) P- i. \
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只* B) y) D2 m; z. k: X7 p
    scanf("%d",&q);
- F7 T, z- k4 }% M( j: X  J& _& |/ h   p=num;6 D0 E) }4 I8 a& q/ ]) W  d5 p
  for(i=0;i<n;i++)
( o/ Z4 b! b9 B7 c8 U, D7 l4 [    *(p+i)=i+1;5 A' i0 G% S5 H2 S9 k% A
   i=0;
3 U7 B6 E, w! l* |0 b   k=0;
& g4 h/ A7 `+ q   m=0;! Z0 u, p; j* a/ Z# G9 J- e
  while(m<n-1): [: n) h% d7 b  ?) u3 @$ N6 d
   {if(*(p+i)!=0) k++;
% n" h1 P  {0 n% Y3 a% ]     if(k==q)! D; `/ _! g+ |$ J. Q, r4 J. K
      { *(p+i)=0;8 J; s# y3 c+ J; z1 m9 Q
        k=0;3 {7 }8 J6 T0 J/ ?
        m++;' l* M+ ]+ D' J' ~
      }/ `* P5 c! N7 M; `
    i++;
, Z6 h/ ~' w3 p5 m    if(i==n)i=0;
6 h, h. S# |$ P3 C9 I9 {! ]# c$ N( A   }
& Q" ^' D' C+ D$ D# a  while(*p==0)p++;& d# W3 i4 |5 e! ^/ x
    printf("The last one is NO:%d\n",*p);$ \8 O% H& f: E
     getch();$ T/ {% W) e6 A$ D) ^
/ A0 P* E+ g  {% T
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;$ X! y5 L" p6 D& o) A  W
namespace 又费马达又费电) J$ O; p8 F7 c/ u2 B
{0 A7 x% ]# T+ C$ [; ~# s8 P; g. Y
    class Program
, L6 m( T0 {4 ?8 [3 k    {
( R$ Y, V3 ]: q( f# |        static void Main(string[] args), X8 C/ h/ y, O9 [: J
        {6 c! {+ v: n/ ~1 u( A4 z; y
            int m, n;
, B3 u5 z8 K( q' a# \; x            Console.WriteLine("请输入数组长度");+ i" A/ I( T4 S& d
            m = int.Parse(Console.ReadLine());//m为数组的大小/ C, F7 U, J9 r2 ^4 \
            Console.WriteLine("请输入要截取数字的大小");$ A8 q$ m5 Q1 z* B  _2 g9 `: ^; i
            n = int.Parse(Console.ReadLine());: V7 a4 ?( A6 i# k9 T
            int [] numw=new int+ _. F5 z+ G; a( U
% c4 I8 u: S  v; `
&shy;&shy;&shy;;; [; U) E! W% f" H/ X  f$ |
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数2 w7 ?0 F$ j) f$ X% X7 T
            {* z$ w+ W( R' F' m5 h
                numw[j - 1] = j;
, \1 {* U/ q6 |( ^& U            }/ C* C: t& k& |/ u6 s
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
5 c7 z+ g8 p7 b9 t& }' N            while (d != m - 1)
7 n4 z! @2 _# a# o: ~; \            {
0 n% G! z; J- E2 h) Z+ I0 h3 \) o; J) W                if (i == m && d != m - 1)
* U2 U5 e9 I3 S/ S                {: W6 T. `  V3 Y3 p' i9 k% f
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
6 Y' f$ R6 h0 p  t  Q                    continue;
, x/ R% u/ j' p2 H+ c: o/ i                }
8 Q, ?5 q" z& `6 e                else. z6 q1 F7 u, n8 z$ J2 A
                {, M8 J7 P, q& x& r7 Z/ h. @5 p
                    if (numw[i] != 0)
2 t0 X; R; B' u& B. C                    {
, r  A6 X6 ]: W" p* S" y                        i++;
+ r+ S# n  u9 Z, C6 K                        k++;
  e9 `" L6 ~9 p6 g+ ^                        if (k == n)
& X: R% J* Y$ Q/ s                        {
6 _! }/ j5 `- i1 }0 l* |                            numw[i - 1] = 0;//把在n位置数组元素的值改变了7 F. D9 X% R, v+ C' d' p4 N- b7 U
                            k = 0;
% {* j2 v- L9 v              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1; {" B6 Y& R: B1 e- R# }  U" N
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
2 A( s- S6 n/ d9 U                        }, @1 G; w8 w( u$ N' Q9 w3 ^
                        else//输出暂时还没有改变数组元素的值4 ~" t' ], b; M+ i- |1 m4 p
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
" X' \: r( Z8 l                    }
. ]0 h8 z7 _  u6 F' P& L" b+ z  e                    else
3 s6 R( Q& F9 Q' c                        i++;//数组元素为0,直接跳过,不计数。。。
) l+ f; R+ u3 h  j& ]9 ~                }' D# }( ]9 J' r$ H) h! D- {
4 _' |5 e/ N+ d

: _6 G  Z9 v* Z) @3 R2 ^' a            }//结束while循环
8 w. i% ^7 M7 _1 Q1 x& B            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦8 [: i0 l5 O! b% g5 F1 g" I  f& h
           3 b+ k1 f) E& w/ X8 T/ z. n4 S
                if (numw[i] != 0)
  ]7 f0 ?: j" k, x                    Console.WriteLine(numw[i]);9 p  M9 `) T4 _* Z+ `# g6 \, q
           : ~5 p4 R, m/ h' R
            Console.ReadLine();
: R8 w3 J" J1 n) _. `, C9 O        }
/ u- c  N9 |9 X9 h  x# X: a    }
4 L+ A& ~3 A2 ^; v( q  o8 n( A}+ Q* r( C' P7 {* l' e5 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-5-27 19:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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