鱼C论坛

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

猴子问题

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

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

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

x
大家好!9 ^1 n6 [8 y7 w! u
这几天我在忙着编一个问题,我用了一种方法编出来!
/ g0 C- ^. Y) N( b: `) H9 r+ l但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!5 O5 e+ Q* q8 o5 I/ S( S9 ?
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 3 K4 {2 H. s; l
+ D' a  @& J) [
4 |/ g2 F8 M. H/ S$ m
                            题目' O% e0 h& z# i9 l( i
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
# N0 k, @, u. x% H3 X& c: f第一种方法:利用循环链表1 X, m& m: E- t( N% D. N& q
#include<stdio.h>' v+ r# {& Z7 x5 j9 H- W: V2 C1 @. k
#include<malloc.h>+ j: x3 {# p# C9 n' u+ Q2 `4 E
#define M 8            //共有8只猴子% i0 x; R- W6 L6 A/ k' u' t
#define N 3            //数到3只时退出第三只
7 ]$ ^# r& e) c/ Ftypedef struct monkey5 G* f* V: @* J9 C# W2 o  U7 t* _
{int number;& P% N. y  R* o" D! o
int flag;
  H, j! h, B' K7 o# C- e' I1 zstruct monkey* next;# o) t4 e/ U5 B/ V" I; q
}MONKEY;0 j8 Y" l: z; t  ^
main()
4 M/ d/ v+ l& a2 _4 `; Z& `{ MONKEY *head=NULL,*p,*s;
, Q) y- P" X9 ?  int i,sum=0,count=0;
" H6 f6 X/ p* P' Z2 Q  ]  clrscr();              //清屏
' e( K5 V; g  Q3 i6 d2 v! a: z  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存8 |9 r: v" \! T  j- j( F
  p->number=1;p->flag=1;% |0 w. d( @1 |
  p->next=head;6 V9 {6 v. v, J& |8 N+ M( I) }. g' \
  head=p;
  T, p& r, x: i3 ~- W  for(i=2;i<=M;i++)
" y; T8 c/ }! j- ?* Y    { s=(MONKEY *)malloc(sizeof(MONKEY));" R& X! S2 }' v
     s->number=i;s->flag=1;
( j# X2 q' T3 N4 L7 D; O9 M     s->next=head;
: i) l( E: u4 l" O( S     p->next=s;p=p->next;
+ U& O/ x: K- w6 q( }7 A/ a  q* |7 K    }
8 m4 E9 w1 f( D: d) N- O$ O* w    p=head;7 B$ k( f* G) g
   for(;;)
1 Y: Z0 q! O! D& b( A, ~    {if(p->flag==1)
" B8 \, j* K) R# m, e" D& I       count++;
/ L: h; g2 a! z     if(count==N)
- t+ m( F/ G; y8 M* t        {p->flag=0;
. r1 c( \( C  n- c         count=0;
6 d7 S3 z1 i' X$ ?6 ]' Z         sum++;}0 P: C* v% j* |$ v. E+ M
     if(sum==M-1)' o+ Y6 M5 ]3 v, `4 o/ K
        break;
* G( c; s! N, v6 Q     p=p->next;
2 Q) ]/ I8 E* {* U" h- n( w: g; O: J    }
' R# \) t# P$ n5 f    p=
1 ~6 x" y, H6 c) ]% @- A    head;& X7 N! U4 v4 ^
    for(i=1;i<=M;i++)0 B- }+ x/ d7 {) \$ l* [2 }
    { if(p->flag==1)
+ e- h, x! ?8 `( N/ r; X; Z2 q        printf("\t%d",p->number);. u: O. y2 V: l2 b& V
      p=p->next;
: _$ y% }2 l5 {) C" |  H: n* w    }" K' p& w/ I# `
; P9 T0 V% M4 j5 ]# l9 d

+ Q4 M9 W4 s' Y; I& }% K/ _$ p0 J+ M+ t
0 v) I: u5 Y' Y7 ^4 e( V$ i}
8 T+ d  n( x5 W; ]( j
第二种方法:数组6 j& l: m+ [7 ~6 n$ e, b
#include<stdio.h>
( t9 J/ U1 E- |. S$ O8 W#define M 86 y' R; G' c( G& l7 G  W) \
struct monkey/ j2 _6 R0 i& X) l; a( g! y' [
{int number;3 u4 B' w" t# l
int nextp;  M) I. T! X- Y+ ?1 d/ i7 i4 z4 ]
}link[M+1];4 M2 m; q* T: X, v, m, J

, b; {/ W* a' a0 g3 Y+ o; Y' m/ u  fvoid main()
; I& N( \' X$ D( X+ m{int i,count,h;% Q! M' N) q/ _. u
for(i=1;i<=M;i++)
6 M4 r. \5 N- j, i8 b{  if(i==M). _- i/ ]/ U6 K* H' L. R
   link[i].nextp=1;) Q) U5 [! v/ D9 i* t, L
   else# R* z; X' d6 o- _9 G! n
   link[i].nextp=i+1;
& q- I: I% B+ c  [  link[i].number=i;
) D# m& ^) a" e" H6 G}9 r' n6 I0 n) [5 i  K
printf("\n");
1 N8 Y$ f7 }; x1 ccount=0;/ i. q' a8 ]: V) W7 H5 l( G
h=M;1 y9 P+ B7 N. P+ R
printf("依次退出的猴子: \n");4 |* h/ t, ?( |) d: F
while(count<M-1)
8 Z( Y# D% q" H' _{i=0;
9 F' B+ ~5 A1 q( zwhile(i!=3)% J6 o" I" x2 O7 {' T
{ h=link[h].nextp;  `" D3 v$ ]  S" @/ P
   if(link[h].number)) @- v2 a  s( b7 U
     i++;}
/ a* R6 y! H. \/ d! j8 o  @
: E& Z& J, B! ~! Wprintf("%4d",link[h].number);
9 ?' P3 {  J" s/ V4 \7 ?! g! X; A4 Jlink[h].number=0;
8 o. @3 _( z  \7 Pcount++;1 }. s* E* ?# w
}
1 L0 M3 W" z4 \# c
3 [2 k+ P( K" o' j! i3 M3 Oprintf("\n大王是:");! z  Z2 ~/ {2 {/ D. a( Z, Q
  for(i=1;i<=M;i++)3 K: e8 h) d) A' l$ U/ g8 A
  if(link[i].number)
, t* {8 l8 I% O1 l    printf("%3d\n",link[i].number);
# T( J2 a) M( }9 o# ?% H
! J* N4 W: k6 C: E
, }' L% U! w% i: Q! z( f+ u}

, }- r5 p: f( g7 E( Q; d第三种是普通方法for循环

' q+ X6 q6 |$ Z. s% ?* |#include<stdio.h>3 G, t' m5 i& a0 d
void main()
( [" D, T! H# r( _{ int i,k,m,n,num[50],q,*p;
/ y# P: K: \' P" @. W# g3 H    clrscr();
4 u" a2 b: b/ l# g: k+ |   printf("input number of person: n=");7 Q/ ~" w# h- X. t( J: {5 M
    scanf("%d",&n);0 V) ^' h' e) g0 J
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
) N% x5 ~1 v8 }; f- h% O' F    scanf("%d",&q);1 e# x& A( K9 r& B* ^/ ]; s5 Q% n" s
   p=num;1 n3 m- l5 N; q1 M% r7 ~9 D
  for(i=0;i<n;i++)
& g3 U/ q, z! ~9 o) V/ K7 u* T    *(p+i)=i+1;7 y* q  Q2 m: N4 b: b5 I% y+ F
   i=0;& a) i7 M% Z  A% a6 d7 W/ r- A
   k=0;8 E! ~% K- u) I' S
   m=0;
* P8 B7 V* S8 T4 I  while(m<n-1)
6 e* N( p: ?* T' F3 s   {if(*(p+i)!=0) k++;: _/ z& y) I5 Q2 h. T7 y
     if(k==q)
4 Y- s- V8 l! i1 Q. k      { *(p+i)=0;
$ L% H% L' n% `        k=0;: k) V* }+ L4 F) r) f
        m++;, ^$ ]( U% ?. T7 D: `
      }1 a) G% @6 w; K2 [( R. }
    i++;
6 ^4 Y6 b: f6 j9 b( s. I! X    if(i==n)i=0;4 w: ?; g) y6 `* z% V3 B
   }4 n* x( Y4 \# y
  while(*p==0)p++;! Q# q6 E* d' |) P5 w# u+ E, A
    printf("The last one is NO:%d\n",*p);# Q: i. U5 k$ Z' \
     getch();: Q3 `3 S8 E0 ?3 T
2 }3 D. E+ I8 R% a: G. _
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
% V5 e" j  i1 K3 Onamespace 又费马达又费电
# o# ?: b. Z( `9 \+ d{; L2 m2 }) y( l+ D0 H
    class Program
. K" V3 i- R) ]    {
7 z, k4 {! y3 w        static void Main(string[] args)" y0 b9 R" ~! A( a2 c
        {3 @, K6 s2 Y( Q* {& U
            int m, n;) d% u9 E+ d' K$ E" w1 A
            Console.WriteLine("请输入数组长度");
& o' r" P* d! h            m = int.Parse(Console.ReadLine());//m为数组的大小
# B! [3 T& W5 [            Console.WriteLine("请输入要截取数字的大小");3 z- {: S4 t9 M
            n = int.Parse(Console.ReadLine());& ~( R1 ~" d, N; x& L
            int [] numw=new int  N! ], P/ V4 j  c& K1 T3 _3 k

- g6 C% m$ S/ W# S( E+ D' V" P&shy;&shy;&shy;;( {6 j! t( h6 q) b# v$ t3 E
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
5 X6 f  D8 b8 t% E) \4 g: T- w2 ]            {3 z- m8 c1 f4 o, J: O' t  A
                numw[j - 1] = j;
/ U7 Z7 ?. `  y( z4 l            }, {2 Y5 J2 m" d4 q, W1 z" G0 u
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
4 C/ f3 |$ m4 G1 X  z            while (d != m - 1)8 K( [' L1 S; D2 S6 R0 N
            {& M, X# d% _1 `  ?, ~& G
                if (i == m && d != m - 1)+ P* `! t1 \2 o
                {( \; `  _+ A( Q, z, f4 O8 B
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!+ X' e+ ~( ~0 K+ ~  W! n
                    continue;2 Z" c8 d6 j0 i( T# z, j  z  w% Z
                }
' l. O) F9 t/ ?' `. D) |                else/ ^- M( j( V! o' f% x* \, Q) g$ _
                {( T- p( B) |6 S0 N% L# b
                    if (numw[i] != 0)
1 W* v/ r% K1 j9 {                    {
: f2 z& J7 q% M                        i++;
& v3 R. @$ x* E& A9 X                        k++;
1 {( \: C6 X4 K% P" B. c                        if (k == n)
3 v5 m/ w- K" a$ b( ?# H                        {
8 g6 a4 N) E. K, ~; ]$ J. I8 G                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
# i! z+ r0 l/ M                            k = 0;! ]( R6 c5 }1 {7 I1 a6 e& T" U0 j
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
5 I9 Y, b' m+ S) Z; ]8 a                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);7 D& T5 V. _, F4 g
                        }
# x& r$ Q& l/ ]7 d0 \( W: L                        else//输出暂时还没有改变数组元素的值
3 l5 Z# e. \* D2 Y                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);! A' z: m4 [) j% g. S. f) p8 M
                    }- _" U" k9 q% y% m* d1 d
                    else
8 R  Q& ]5 \% ~2 J6 u1 Q                        i++;//数组元素为0,直接跳过,不计数。。。2 A8 t' B9 z) [6 o, N+ f9 `
                }
4 P" _% L' m6 ~, J* o
! p  u0 T, H8 Q9 N7 D8 D/ P1 c6 I, V+ p
            }//结束while循环* h0 J* q( X9 k5 m6 _# h' c3 s
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦: N; s0 g$ N$ L  q, T
           , w  s$ L3 l  a3 s6 V0 i: d
                if (numw[i] != 0): e* m2 B4 o7 g' V2 O
                    Console.WriteLine(numw[i]);5 t* c+ u2 t% K. H9 _" s+ j
           9 K9 a+ Z! J! P" q7 J" b. F& P  V
            Console.ReadLine();
7 \7 `, G. e2 Z" ?. z        }8 u9 B; @6 b1 ^4 F. m  {: c
    }9 Y+ g7 N7 D0 P$ _5 d$ j
}. I1 G  C. t) i- `7 A- ~8 ]
小甲鱼最新课程 -> 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-3-31 11:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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