鱼C论坛

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

猴子问题

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

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

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

x
大家好!+ |* O* |% |3 d1 d5 L+ H3 c$ Y3 f
这几天我在忙着编一个问题,我用了一种方法编出来!7 M# o  p3 i  l  |! F- a* m
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!2 w& D( Z1 n- {5 P8 B
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 % D2 m8 v- l( @6 h$ ?

8 o+ D" J, U" ]$ z$ K! _& U" Q7 l
                            题目, h! G% H2 g$ K) y( ~/ R/ |
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
9 I+ _1 y; c8 S( D第一种方法:利用循环链表2 @; S5 R! t# A( ?' R
#include<stdio.h>% k, ]2 Z' e& k- W
#include<malloc.h>3 ^5 _! C, }" L+ S  v. N
#define M 8            //共有8只猴子) O: n0 Q  o5 x; ?9 Z5 K
#define N 3            //数到3只时退出第三只
% [0 |4 g9 ~- j4 f. q0 ^typedef struct monkey
8 c$ H+ v' A' |5 `+ K" a5 g; E8 Z{int number;
! {9 B7 j4 x9 V  E/ X0 P; cint flag;3 B+ b- o# k& X) P* u! _, v6 g& ]
struct monkey* next;# c5 j- F; ]) k% l: L: S
}MONKEY;
# R+ S4 B* r5 ~main()9 L  h- r7 c* `. z/ [% ]) T
{ MONKEY *head=NULL,*p,*s;
: H7 v8 l0 `. z, a: @  int i,sum=0,count=0;
- W6 y4 g1 \+ n2 }! u0 ]* n  t  clrscr();              //清屏! N  v; E4 f0 {9 v
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存, M, z# U4 _( ^# D
  p->number=1;p->flag=1;
* I/ A4 j; V: f9 @0 }  L  p->next=head;
+ E- Q' L" B8 Q6 y# h  head=p;, @& S* U: P: I  A9 v, a$ j
  for(i=2;i<=M;i++)
1 e8 e$ e' Z% [9 e2 f( w    { s=(MONKEY *)malloc(sizeof(MONKEY));8 o8 X9 P, w$ C* L0 C# v4 }
     s->number=i;s->flag=1;/ D$ e; P. Q% k2 R* a- N) H1 v: A
     s->next=head;
+ t5 D* U2 [5 i/ h# I; _     p->next=s;p=p->next;- e% D, J' d7 g/ K( [/ j- x
    }
* K9 j, R  _1 B    p=head;) ^& d% I5 H8 U! I
   for(;;)
: \) L' V- w* P0 T    {if(p->flag==1)$ M( s# V/ X5 w9 k: o' Q' D+ @
       count++;2 q$ x3 G7 G, N4 K2 j" _+ W
     if(count==N)
1 Q9 Q/ Y/ O! u6 q7 @! d        {p->flag=0;
+ ]5 J9 l* h. R, p         count=0;
* P3 s: t* P- t         sum++;}* \: [3 ]4 c0 Q5 ]2 b( k9 u! x- S
     if(sum==M-1)
! Z% T* {  p, J, E, L        break;
" [0 E: H' k& {# S8 p* @     p=p->next;* c3 I3 T3 D1 V3 J: o: r# d
    }- k# Q, R; D, V, b9 Z, L7 m
    p=
8 ]3 ^0 }- |3 w0 ~7 U3 h& M    head;
! ^/ s& W" f$ j; B" R: z1 c' J    for(i=1;i<=M;i++)2 n6 s5 w+ s8 N
    { if(p->flag==1)
0 D5 K! V3 O5 |+ i% }; M        printf("\t%d",p->number);
7 X* B: o( Z4 j      p=p->next;
: H# z* u6 h/ N; s- n1 T    }
! O' Q# q' ?% U% b! [% D  d& _9 d
7 X; y. j2 ], J% K) i" ]5 A
" O  i2 [7 k3 D5 C8 c
; P0 l1 J3 I3 D2 \/ q}

6 Q5 `+ F7 ?9 O0 g, L第二种方法:数组
% G$ p9 R0 ]! G#include<stdio.h>+ s7 c* }  E1 N
#define M 8, K2 [0 o  s9 R) b! t9 Y3 q* }
struct monkey6 A  J# U1 t" O: T; o
{int number;
  D3 B# e2 c; K' N6 Tint nextp;5 s9 l' u1 G2 [
}link[M+1];2 E  _. `7 {) I5 L* H) _
% I# w! d) A: j
void main()7 p+ g! q, l7 W: W5 g" _  K2 A
{int i,count,h;6 N+ f5 q9 S# E- O
for(i=1;i<=M;i++)
+ W  k5 g+ P# i+ N{  if(i==M)
0 ^  _. }6 L- v9 N. @   link[i].nextp=1;
, i5 j" i2 ~3 L/ b$ X3 X   else' N: c" r6 Q6 S+ a; T: ]
   link[i].nextp=i+1;' ^3 V2 U0 w9 R( T% k! b% H
  link[i].number=i;
6 r5 V% W) [4 Q5 ]1 K}
# \: G- D! h; g: f8 _7 D* W9 nprintf("\n");
8 ~  J. Z3 j* D% {# A3 T7 _3 k: J* ycount=0;
  L; @1 _8 z) D6 xh=M;  \2 W0 {6 Q  n0 ~# m) o
printf("依次退出的猴子: \n");
. R/ q8 R! B, d5 ~while(count<M-1)
+ l' \/ n- A. X# ^) J{i=0;
# c6 S) @  e! ~+ a$ g  a7 [) {9 fwhile(i!=3)
. L9 Q$ C8 f" Y1 |% n# o{ h=link[h].nextp;
8 E) S! k2 n% f+ D  v: U   if(link[h].number)- A4 g' p. C  U! n0 n
     i++;}% q$ ~$ t- w2 g0 I

  b$ G3 ~8 f, s, Bprintf("%4d",link[h].number);9 k" m  E: R- f! y4 U2 b' H- {
link[h].number=0;
7 y+ \4 K' Q# q6 Icount++;' j3 l$ F& D" y0 k+ Q& P1 G0 \
}
0 U% F5 m1 v, |8 M) f: Q4 ^  Q
3 x9 m# H) J9 z0 M& x3 M  Rprintf("\n大王是:");( I# U  H, F' Z
  for(i=1;i<=M;i++)
9 l6 {, _# S# `. [  if(link[i].number)
" R. R. b: d1 s7 m    printf("%3d\n",link[i].number);
: [6 P. e' x& ~6 Y2 l4 S- i" C  k. ]8 r; \

5 G4 P  L# c# U}

4 ]1 f  X7 c, J1 B% }- c' V第三种是普通方法for循环

; x# o9 }( y% R5 V5 h- k$ {( X#include<stdio.h>" C" b: N5 i+ c  E
void main()1 T% @1 D9 k8 u3 H5 ]4 y7 |
{ int i,k,m,n,num[50],q,*p;
2 v" B. m# F/ r" z8 A9 z' k    clrscr();$ J. U6 J) z+ k( {& i1 A. z6 a( S3 Y
   printf("input number of person: n=");1 O9 z: |4 j4 d# Z% i8 z0 U6 W/ @" Z
    scanf("%d",&n);$ B7 H* I! x! Y! _, P  R/ y
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
9 J! k! ^1 j6 l5 d    scanf("%d",&q);
5 r+ g' K& ~8 N" e) r- P0 T9 n   p=num;3 Y, q: p, S' U* f5 M6 S. S
  for(i=0;i<n;i++)0 p& O8 O4 B# o8 }0 F2 K/ y
    *(p+i)=i+1;
( o0 @3 G' f7 b9 t1 Q2 D% r- c   i=0;+ T, L! {9 s" ^- D- P0 @
   k=0;
* z6 ^" [7 F# a; K$ |$ K   m=0;6 w1 ?, Z) G3 t4 D
  while(m<n-1)7 Q1 F# ^0 z0 v( H9 s8 @! w
   {if(*(p+i)!=0) k++;6 f8 k$ J  S2 k2 t! [
     if(k==q)$ e6 V$ ^* L, ]; t
      { *(p+i)=0;6 W9 R0 L% R! [
        k=0;
, p. I  q$ h7 a1 s1 k! j- \6 D        m++;
! y9 D0 U. J6 _2 V1 {8 P      }
7 A3 D. R1 i) R5 T! h7 E- p& [$ J    i++;! z3 f6 u1 z. I' R
    if(i==n)i=0;7 G1 o+ A" z/ |  s( Z7 {, s; ]
   }( b* x: s* I6 D
  while(*p==0)p++;1 G; F5 }& x5 Y* z
    printf("The last one is NO:%d\n",*p);, B- l5 o: c1 p4 d- y, X
     getch();: p' g8 p! t: s& H) o

0 |$ l# }) p" o& i2 n5 M}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
8 K3 y+ L. f7 i" m' hnamespace 又费马达又费电/ H: r0 T5 f3 B4 M9 l5 E8 T9 a
{
2 \/ w% q! V% ]    class Program; O2 k3 d4 n% D/ e
    {
7 I* H6 e' m& r: {' c3 ]5 g        static void Main(string[] args)* p# o: v5 e- M; e8 H
        {, t' c/ |2 I# Q9 \$ e+ m! c' n$ ^
            int m, n;
. Y: E  m5 @  r: x6 R            Console.WriteLine("请输入数组长度");
6 t$ w& O9 v3 ?. O/ ]. H' W            m = int.Parse(Console.ReadLine());//m为数组的大小& ~. D: E# h5 g/ ?& [. e  L4 D
            Console.WriteLine("请输入要截取数字的大小");. Z! W$ }: T& E3 z
            n = int.Parse(Console.ReadLine());8 M2 U! Z3 d9 }) w* h1 a: C
            int [] numw=new int
; N+ j: i( W6 [1 n( I6 I0 x/ m- |- C1 ^! g& j2 Q" _: K
&shy;&shy;&shy;;
' j$ ^( _. Z# y            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数6 F; R# O& D' d& a8 v0 C
            {
" v' H; ~5 G6 r; H  C+ B6 M* ?                numw[j - 1] = j;) l! W" ?6 C* G! K3 u+ }
            }! D3 e5 v/ B9 [' `* y$ o& p
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
0 A- Y) F+ Q6 R6 E4 s+ W            while (d != m - 1)! Q+ o: h; t+ b
            {
) y1 [" {; o# L% v. v                if (i == m && d != m - 1)( c3 ], M9 C8 `
                {
3 S7 C+ K+ K" [7 b                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
& c" C3 w6 T% B: g% R                    continue;
1 g+ b5 C  T4 y! ^# U                }
' S9 S, s1 i9 c( a5 G                else
4 C5 m$ @- D  J6 U                {
' M6 |: ]6 {5 b/ _( ~/ g                    if (numw[i] != 0)# |5 P' T. L- |7 w  M) ^1 v7 Z
                    {
9 H" R& w* `( o! V                        i++;: q3 _+ E- z$ r& h" F
                        k++;
2 F) g" u! g0 k4 s& y% k                        if (k == n)
' f" ^0 L3 }3 R; C2 P                        {
& R7 m" \. M  Y5 a& d( O                            numw[i - 1] = 0;//把在n位置数组元素的值改变了8 K  [' j/ C% o
                            k = 0;8 U! i( ^: r3 E" z5 K9 S
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1$ h* y8 c- n9 O& S4 I2 ~# H
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
% ]2 t4 s& O3 ^0 D" E3 e0 Z0 W                        }
7 G# M" i! N5 n- Q. ^                        else//输出暂时还没有改变数组元素的值( G5 f8 Z, c9 l  [+ E
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);' n+ t- X+ v$ W" y- o
                    }& P2 _4 T- x  ]; \$ H
                    else) A$ z/ ?& F2 H. e7 ]. o3 R5 a
                        i++;//数组元素为0,直接跳过,不计数。。。
7 A' j9 l  \- w2 U' r5 s9 m/ [                }" p, I0 q" s$ F! j* K

/ p/ Y  Q6 T1 O  A- m7 E
1 y/ }2 ]; [2 L5 d            }//结束while循环
/ S2 Y1 I! X" j. l9 n* _            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦$ M2 d* m0 i1 U' Y+ X
           # _% N8 h" f2 |' y, S3 H! A
                if (numw[i] != 0)
7 ~9 @6 q! c6 m0 T                    Console.WriteLine(numw[i]);- I* q$ z2 g3 @+ \; }3 \
           
0 C8 D4 ~; f- _) r- W            Console.ReadLine();
# t! e" e2 ~6 }3 f' {  @        }
. y: t( V5 @- Z9 P/ O' U* y2 e    }) k' G' @  w* \2 y, }: P) Q
}  M, h6 e& K* J& F. S/ Z
小甲鱼最新课程 -> 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-6-8 10:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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