鱼C论坛

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

猴子问题

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

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

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

x
大家好!
5 L. S) f4 B- R4 ?这几天我在忙着编一个问题,我用了一种方法编出来!
+ d: O3 `/ _) u9 m/ M. q+ M但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!: @- {/ r9 J1 b
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ' U, T2 P4 h7 u
+ S+ b2 l! R" w0 q3 q, b% I

0 Z2 N# B9 T2 O$ l
                            题目6 C) x: J7 m' [0 N) ~* z+ p
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。' J% Z8 y3 |$ N( g6 Q' j& A
第一种方法:利用循环链表
$ a& }  S# E# d+ d/ \8 a+ R$ M8 y#include<stdio.h>
9 |4 z6 a% S9 m* k- ?. ^- M1 ~#include<malloc.h>
! _1 V( H3 D5 z; B) e: Y" W- g#define M 8            //共有8只猴子
: v0 s5 l) b/ J9 X8 `" e' H#define N 3            //数到3只时退出第三只0 M1 K. j+ j! m2 J4 U
typedef struct monkey
! U7 i! @' F) g, V8 f9 D1 n8 B{int number;
7 g# m( j+ U- Oint flag;
* P9 [$ m  W4 S3 P) |: Istruct monkey* next;1 M2 A) W$ H' y4 x. h
}MONKEY;. u( z8 }0 c6 H, }+ u: ~
main()3 r; a7 o3 i1 V& u$ w4 k  \
{ MONKEY *head=NULL,*p,*s;% c9 U9 w/ f+ u& y7 [7 _5 F% ?
  int i,sum=0,count=0;5 w% _+ Y+ [  h( C* A" z
  clrscr();              //清屏
/ ~0 \" O: W/ X1 x  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存7 v  p8 N8 k, E0 E2 c
  p->number=1;p->flag=1;, y* c% {" ^& D3 w% L
  p->next=head;. K( s6 U* j, u& L# i6 X
  head=p;
7 o8 b4 Z* f& o) Q, \  for(i=2;i<=M;i++), _& E2 }2 B! U2 r
    { s=(MONKEY *)malloc(sizeof(MONKEY));% a! _" Z3 g" y  _7 c
     s->number=i;s->flag=1;2 a8 E  S+ e% I7 O3 S
     s->next=head;
9 U7 w1 T! P3 c; u% a     p->next=s;p=p->next;
+ x/ F! J2 }' D    }
' {$ {( I  @9 o* |. O0 k" A    p=head;
( a! h& Y$ w$ m% w! C   for(;;)5 q! m& [3 _& }6 n1 t
    {if(p->flag==1)' q: e* g" }* ~" J# W3 }; |
       count++;
! i  {% D8 B4 ]4 N     if(count==N)
8 B, p  `  `+ D        {p->flag=0;# M* b- I. _8 v+ v% I& I2 F! E2 B0 [
         count=0;+ s# {; e' Y$ c. y9 W
         sum++;}
) Q# l# k+ U( T. S! i3 {" Z! v     if(sum==M-1)% k  B: J/ q! _2 @3 k1 {8 S
        break;
1 e% N2 Z: V9 S3 n' G5 P     p=p->next;1 v; Z- i, a; a+ }2 i7 y9 b" b% j
    }/ [1 l' u/ B" @' X
    p=
* g( F. ~! l0 h5 n7 z    head;8 t1 V# E$ o) ~7 ~( ^
    for(i=1;i<=M;i++)% a: I3 h- p2 P+ Z/ v( x/ t
    { if(p->flag==1)) i. {, v$ V8 n0 m
        printf("\t%d",p->number);
% Z: G+ ~  \1 K; ?) g      p=p->next;5 g: t1 _/ b# @
    }, X; y4 x  V. d4 \/ ~

0 ], x1 o! k0 o! z0 a  k8 k' X7 X9 @* ^% L

; K: w8 N) M# c7 z" B}

4 v7 E3 Q: f6 T  v第二种方法:数组
; x+ F: Z- t2 z5 _7 a#include<stdio.h>
; H  {6 ?, L! p/ v6 C) h' ?* \#define M 83 Q. Q# q+ b. I; O1 m/ x! @' k
struct monkey
! J3 k' ~1 p7 q% x0 V1 E2 b( M9 y{int number;/ l6 k2 p! v2 h/ {
int nextp;8 ?" q% N4 ]- O; ~) f. H( P
}link[M+1];
, g' g- O2 @9 M3 _9 Z3 a# @; j7 v' v1 O# _* O. D% b6 z0 {. i
void main()
5 r) m, M' F7 \9 O{int i,count,h;9 ~) [/ f+ X$ n: b; u
for(i=1;i<=M;i++)$ n% Y2 D: [$ w9 v6 M# t* {
{  if(i==M)
% m/ `8 n4 D/ {+ Y1 {   link[i].nextp=1;
) K5 T: z; {% l. x- T5 A# w   else
: [/ I# ^# F  S6 u   link[i].nextp=i+1;; a' Z- Z2 K! r/ n$ Y$ t. }$ ~
  link[i].number=i;
' S/ z- W, T* r7 J& p}
; z6 J% j' \) m* J, V( V! ~printf("\n");5 |2 J+ ~4 H/ T0 S: P. m3 y% h
count=0;
8 ~& u" P2 E! M" r7 k: x+ [+ T5 _h=M;
' r- j" A+ s+ u4 n' Pprintf("依次退出的猴子: \n");+ y6 x3 Q  }3 q- f: b
while(count<M-1)
$ ~; u# N) q* I4 w{i=0;
2 }6 L0 D: U/ x# V& rwhile(i!=3)/ x* D( P4 ~3 z3 i! I1 \# r8 i
{ h=link[h].nextp;
4 l# L) p9 w* ^4 o+ i1 E8 h' b   if(link[h].number)
& T* n$ s  X: r4 `4 x     i++;}
! m  H$ ^) v4 [+ h  F
6 p8 B1 j( n" g3 z) B  @  m9 Y( Zprintf("%4d",link[h].number);
+ \  Q) F; k8 ^# |6 ]7 |link[h].number=0;, M/ U) V+ I" t: w
count++;0 p3 W/ I% x3 r! Z5 S$ u5 i* Z% W
}) X- }' q$ x9 O
5 Q4 u2 g8 G8 O: I9 G; j
printf("\n大王是:");
: U  E" V8 O7 }0 n  for(i=1;i<=M;i++)
9 R0 ]6 n3 R' n# n4 n' D# V, g  if(link[i].number)
2 ~! w& i' F2 b, _9 A( a3 X    printf("%3d\n",link[i].number);
" F; J+ k& g2 J  |! [
  I) Y) Z% K0 A# c4 c0 f) ?
' o. A/ m& v* w}

! s/ M5 E/ V: E' G第三种是普通方法for循环

7 W9 k$ ]# u9 S9 h" J9 J5 y6 i* b#include<stdio.h>
2 Q' T6 c4 f& Z3 Avoid main()! x# f1 m$ B; F
{ int i,k,m,n,num[50],q,*p;9 ~$ m3 M0 M2 p$ `
    clrscr();
* o9 `/ r  d/ {0 l7 Z, G   printf("input number of person: n=");2 L1 N. P1 s! ^0 n' h  `4 ^9 t8 D
    scanf("%d",&n);0 r6 H, I- C% @0 U
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只: ]; B* p- G2 Y# S2 }  V) T7 O
    scanf("%d",&q);1 T& [6 t1 G0 l' m$ U' m9 C
   p=num;
- z( l9 i0 ^3 L& i: X- r, d- ~  for(i=0;i<n;i++); Z5 g9 X2 K( `3 H7 o& b
    *(p+i)=i+1;
" T2 O4 [- f7 g# ?1 S; h9 q   i=0;+ Y, H% {) T3 J0 w/ C) c0 N
   k=0;- J5 m/ f+ _8 u8 j- Z( ?
   m=0;
  {0 Z+ y1 g0 Q! `6 x9 [" o1 l  while(m<n-1)" e6 R5 M+ R. E0 K2 h0 B( q
   {if(*(p+i)!=0) k++;" `/ M! r, J8 \: r/ j( f7 y7 E
     if(k==q)
* u) M' R9 i+ q: g1 R      { *(p+i)=0;
1 x1 [4 l* B2 {5 y, B        k=0;
& p; ?+ Z. k: t        m++;
) Q% e6 C, a. B% c8 O, e      }
/ \- \4 I  E9 y, G5 k* O0 r    i++;
7 y' l/ p. ~/ b! H& o    if(i==n)i=0;/ j. @" w3 m$ m
   }
4 f0 ~2 }$ a7 H% j. k& Q2 ~1 d  while(*p==0)p++;' N6 |/ v! r; n; X8 g. v
    printf("The last one is NO:%d\n",*p);! E6 {. ?* F9 b& D4 g6 p. l7 e" j
     getch();
7 m- `% x6 l0 z' P: l
3 @; |& ^/ |" I7 M+ U0 L, }0 I}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
+ [! K& j, D" |  ^4 B- [namespace 又费马达又费电
, ~2 p9 h8 w1 |8 z{
7 P( D! t$ K5 I) Z0 b  I- l7 t: {    class Program0 J& c( a3 q1 r8 T4 L* B# f' \' V
    {2 d  R5 [" r" i" Z3 J  b/ B
        static void Main(string[] args)% U3 S5 N* F+ D1 V# t8 F$ K
        {; n$ S2 }) y/ r& y
            int m, n;
1 C" B6 e9 Z) q  V/ P6 T' t5 j            Console.WriteLine("请输入数组长度");
, j: R* ^) f) }. @; K5 H- H! d            m = int.Parse(Console.ReadLine());//m为数组的大小
* |6 H1 I+ m% @* T            Console.WriteLine("请输入要截取数字的大小");
, F6 j& S, ]& `0 I# O            n = int.Parse(Console.ReadLine());  L! O0 f  @* V# I% p) P/ s
            int [] numw=new int- I2 Z5 v- x3 e2 F+ k: t7 O. j
. H  {) Q& t: G" L
&shy;&shy;&shy;;
3 d$ W# {% F% z. g. q( U            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
; X% n2 @' C  x! }            {
. m7 d& ?" c0 y. Z                numw[j - 1] = j;4 \0 Y7 M/ O/ j% r
            }
: S( j  X& m) K+ P4 u            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
1 L& H' T# |6 `; t            while (d != m - 1)' v* e8 ^( ^) J$ X$ a; S3 n
            {; a5 J0 Q3 W5 \4 O! ]+ B  a
                if (i == m && d != m - 1)2 j0 I% k/ H; z7 k! [" @
                {! ^+ N, A, G. p
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!2 k% W: A& v8 L" Y4 |
                    continue;
: f3 e! ]( d: a& m7 V                }5 s" z. _5 k2 H
                else4 C: u- T5 B/ c4 o/ w- k
                {& P$ N( `0 {( U- C: ]) U
                    if (numw[i] != 0)
+ p/ t- A) x5 @& ?0 S                    {
+ u: t1 l' ]3 E$ g! m- c( x                        i++;
6 a- L" _8 Q1 @0 ~                        k++;
( `1 G2 I5 r0 L1 e5 ?) U" ]$ T                        if (k == n)
0 D6 n2 [; i; P7 V# q                        {/ {% b4 R$ t) l9 L& S: i  x
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了6 ?0 l3 A# l+ v* O2 U: |
                            k = 0;0 J) o. G+ u% o  R# p% g2 S
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1, q, E0 r5 ^7 d( M
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);, [* q. V4 `3 H  I) X: J& |6 f9 M
                        }8 y1 x) Y* h9 m; ^* ?
                        else//输出暂时还没有改变数组元素的值
& L' t: @! q$ j/ ~2 U/ ?                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);& u- U0 R; Z. L  c, Q, C
                    }8 ~# m+ C2 ?8 F: v0 Q* c7 O. t; K9 s- e
                    else
/ s5 S6 s2 l1 d4 O' O                        i++;//数组元素为0,直接跳过,不计数。。。$ v" M' T' q1 S  h$ O" Q+ c
                }
  e/ G  z5 p2 ~ & G5 V7 u$ a9 x" e2 Y
( Y' p0 ^3 y" ~" ^# ]
            }//结束while循环
$ n% e0 X) d, Z/ \, v3 \0 i" c            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
6 @) B8 G4 k! I; E; M           
7 v6 p# r0 s/ W                if (numw[i] != 0)
: W; U# I! K0 r7 s- Q                    Console.WriteLine(numw[i]);
4 W7 Y, U0 n4 m# \. N             z6 `' D0 `* O/ v9 T! {
            Console.ReadLine();
* l$ c5 C) ^! R3 z        }
7 \* Y8 U7 {5 O7 s4 ?    }$ S& P' o" r( p6 Y
}: g9 o1 Q& I" w, W7 {
小甲鱼最新课程 -> 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-9 23:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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