鱼C论坛

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

猴子问题

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

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

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

x
大家好!
+ F! N5 v3 O/ z/ P. I# D6 R, x2 y& P这几天我在忙着编一个问题,我用了一种方法编出来!/ P2 E) I9 V0 X
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
6 r* S0 x- M. s& p& x注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 . g4 @7 ~4 c' h: U# o
. U$ j/ {* t; e# k: }

5 ~+ @& F! ]" K$ O9 j! [
                            题目
9 _+ m4 P$ D: Z2 F0 [山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。. p" R. D  U2 S; A6 U4 e0 e
第一种方法:利用循环链表
/ }9 Q% {" i# ?/ N& I/ n6 u1 T#include<stdio.h>: x! f2 G, i* P
#include<malloc.h>
/ x8 e) ?$ D" f! R/ a#define M 8            //共有8只猴子
! P1 a( Z6 }' W6 d; l#define N 3            //数到3只时退出第三只! R' t/ g) A& w9 S
typedef struct monkey+ L! `( b" Y8 X4 [: C" Z: E2 t# ~5 _
{int number;. L; M) Z: S; p$ [4 z' ]+ ^! ~7 [; n
int flag;
. ~( i+ \$ z6 W+ e* u! v2 M9 l+ @struct monkey* next;; R- s" D6 p/ |) ?
}MONKEY;
+ d! T4 ^- a4 x8 i$ H/ S/ G" i9 kmain()
' @( R, g3 a4 Y& O6 x% v{ MONKEY *head=NULL,*p,*s;
, y2 H4 X  o  X0 X  int i,sum=0,count=0;
) m) Q+ G4 K( p3 G& |2 Z) s) M: v  clrscr();              //清屏" w( w; @! q1 L1 U  [2 P
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存! K3 @( S6 }8 L& G0 N1 n
  p->number=1;p->flag=1;) ^% O+ Y+ ?3 T9 X
  p->next=head;
" t5 J3 s7 N& o) N' a! A5 ?# f% |  head=p;
* q/ n: @* G" A' ~  for(i=2;i<=M;i++)& K! y7 q5 C9 G( m. @* t7 T
    { s=(MONKEY *)malloc(sizeof(MONKEY));( [* q, b6 S4 U% H
     s->number=i;s->flag=1;
7 }2 X7 w7 ^3 o1 x' k5 F4 e     s->next=head;
$ Z3 n% S# ~2 c8 A" f: y! W$ F, A     p->next=s;p=p->next;
$ D3 `# K: ]2 {1 X' F" n    }
: p. p* j; O2 O" o    p=head;0 j( T7 l; T4 j2 i/ n4 {
   for(;;)
3 p- h( ?% E4 c2 v! A+ F5 ?- r" b    {if(p->flag==1)- R$ o( _7 _4 a6 h& O& d: o
       count++;& x2 m% Q( q* ~3 C; t! @5 w! C* |
     if(count==N)( H- Q! G0 S2 {+ r4 ~& b
        {p->flag=0;
0 N2 k4 s. C9 c# {. x  }         count=0;
/ O0 S# Z# ]- F1 f  N) ~4 P         sum++;}
9 m! \# I# q. L% q( N" B/ c     if(sum==M-1)
9 F- j* z% S# G+ R( z( e        break;, @$ B" e0 P( d
     p=p->next;
; w0 [0 q( B1 b: T    }
" C) I$ H8 r: o* ?- z1 ~1 i  S    p=4 o6 ^) P3 q* E0 T4 E/ @9 q
    head;
7 o. ~- m) ]1 s6 j* i6 u8 ?# L    for(i=1;i<=M;i++)
: J7 x8 }+ p* G2 A+ G    { if(p->flag==1)
+ F& T( r- Q" y' K1 c        printf("\t%d",p->number);
' a; T5 ~& A0 q5 P8 {" _      p=p->next;7 X+ a; ?& ?8 Z
    }! @6 R0 S! O. }' e* v! h
5 L% p/ m; A3 Q6 n" b- v2 S
) \% N- |7 K# M8 R0 I2 ?0 [6 P

- Z! u- e2 B0 f+ H  H' q6 S0 X0 d}
& n- Z% S( U8 o1 |! ^( Y& D! d
第二种方法:数组
9 Z  }7 z3 i6 ^1 |#include<stdio.h>
6 K. L+ w$ ]- @# t" u) E0 F* i#define M 8% Y1 u9 f2 W6 d! {
struct monkey
5 x; q; v. G5 c* i  K/ b! s{int number;
# P  R4 ?' z, r% bint nextp;  O2 j% V% f6 T& u  }- F
}link[M+1];
9 E3 M( c* d7 |4 g1 b" E
; d! H& w* I& ]9 h; Avoid main()
" H1 e1 A9 h  h) w{int i,count,h;, y& A' [% o% P- \
for(i=1;i<=M;i++)$ W! M$ q/ b' H3 y0 k4 t. |
{  if(i==M)8 Y) @8 W+ Y, `" S+ O
   link[i].nextp=1;& F+ R- J2 q. S" j8 ?  V4 ?( z8 u
   else
. d, K8 z5 Q+ \& Z6 s. _( M   link[i].nextp=i+1;  n4 S" e. Z) h  w" A' ]+ T1 C
  link[i].number=i;! N7 A! s" }4 s( c+ s: N) @) O
}
( R! t0 }4 N4 t% d' {printf("\n");
8 q# ?, M7 Z2 B! P6 [: mcount=0;
: F% a& }( M/ _7 w4 b* Y' J6 s! v" l9 G9 sh=M;
7 c. p; N# e" C8 K# V0 s( ~printf("依次退出的猴子: \n");. e& B# k, b: H) ]6 G. s+ F
while(count<M-1)
4 @' L* u- ~/ [4 t{i=0;
( c" R" P5 K7 F9 xwhile(i!=3)% h! U& A0 `( ]5 x. O% g, c
{ h=link[h].nextp;
; c: {4 D( l  x7 z* b, i   if(link[h].number)
% \! v2 ^/ y3 ]4 N8 {     i++;}$ {  u, p8 f2 \: K- D* W, t
5 m- b6 g2 }# p" l) D2 ^' R
printf("%4d",link[h].number);" N' P6 E5 u* W/ {* ]9 i
link[h].number=0;
5 X: [4 S; u0 l$ `5 ucount++;
$ X; O7 |( S/ E2 l' y: L}! l: F  e6 e$ X( D

8 A. f; `: i7 Z6 e7 |( B$ Bprintf("\n大王是:");
  [* D2 q( ]. `; E& C' p! r  for(i=1;i<=M;i++)
/ ^) q+ P0 ]5 @+ A" q6 i  if(link[i].number)3 |5 K* |" \1 z# o6 u$ y
    printf("%3d\n",link[i].number);
* F9 v+ c. X& a  r! `$ Q8 Q  _6 ]2 |9 I' `) M' P

( n) t5 l3 b+ Q! E}
# f$ c. U) _5 F
第三种是普通方法for循环
( d' k0 h# d, i9 c, P
#include<stdio.h>, W; @; C* `8 [% P0 a: O
void main()& [# _3 a' i/ w4 E. Y0 t
{ int i,k,m,n,num[50],q,*p;
. y, Z( H1 m% V8 |, D2 c  ^    clrscr();
9 X- R0 j' q  U5 f   printf("input number of person: n=");
$ r! ^+ L+ H& E$ d! l2 f0 b* _    scanf("%d",&n);0 i- i& O: A" H5 O
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只0 w* w: u9 }% R
    scanf("%d",&q);- }/ ~' K2 h/ b, {3 l$ W# K
   p=num;! Q' ~' b2 m2 n# A# z7 x( H- n
  for(i=0;i<n;i++)& q7 U" d. @* ^" s+ w  {
    *(p+i)=i+1;
$ N+ t" D6 X1 u( x( Q$ ^- H$ O- `   i=0;+ \& U- [5 T- |, s/ ?/ T4 L. F( l& p
   k=0;. e; l- d1 d) `4 l0 v$ k
   m=0;
( C: o* g& F1 o- D  while(m<n-1)0 Q, ~0 ^" m1 C2 u' M
   {if(*(p+i)!=0) k++;: c# L7 J$ ?  F9 w1 R
     if(k==q)
: R5 ?) k# q+ p  A0 T* A      { *(p+i)=0;5 @6 z- P$ K. s6 d
        k=0;9 ?& D6 {3 }( z) F& q4 I
        m++;
3 E  K' b5 E5 c; I' |      }+ g* W  l2 ^* |7 ]: Z
    i++;! [$ n! \" U6 j1 M3 g3 T1 t
    if(i==n)i=0;) a9 N2 B5 L, V  d7 _6 ?: Z# ]0 a
   }
6 H# @' I5 |, Z! Z7 {  O) z7 X  while(*p==0)p++;
6 ^& r0 P' i9 J" k. d. q* p# C4 e    printf("The last one is NO:%d\n",*p);7 Z8 |9 F; M& I+ [. f
     getch();
$ \1 `8 S& g: a
; k; R& m' U; q6 l}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;5 J  _: s+ @/ ]! x+ K
namespace 又费马达又费电
! _- P. t+ G( Q6 y: }( P  {9 R{5 R/ u8 i; I( J4 O7 c7 [
    class Program8 D  f3 [7 z' A
    {2 R& W8 J' `  k9 }" S. {
        static void Main(string[] args)* h: P4 s; J7 o) o2 Q& c4 a4 c) y
        {& w  n" ?2 e" X% f) N
            int m, n;
( s- G7 I3 S9 _% y            Console.WriteLine("请输入数组长度");
' L: l3 z: Z& _! S8 @5 T3 Y0 ]            m = int.Parse(Console.ReadLine());//m为数组的大小
0 {8 O' U. E1 c            Console.WriteLine("请输入要截取数字的大小");+ _- G8 U. z0 ?" r  C0 z% N4 U
            n = int.Parse(Console.ReadLine());# @' K6 U( x8 |
            int [] numw=new int
5 j' a" Z' b$ b; N
& m8 `7 S* J4 I; m0 {. M&shy;&shy;&shy;;6 r& [/ m: O' z! G( ~8 Y# V
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数6 {1 w: i/ m" V' X2 o4 _: o
            {6 y# F9 j- b, M4 c) F- R
                numw[j - 1] = j;
- {# Y7 N; c% [9 n* V. B! e7 U            }0 V9 Q* L) |0 n' k4 S
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
7 j' m# _2 e9 e8 W! g! V5 X            while (d != m - 1)* s- s& C+ W; E- I# Z8 N4 a
            {1 L' v8 Z1 l8 u  a# a* }2 i& X
                if (i == m && d != m - 1)
- g/ P9 D" B! m9 i, {4 E                {
; S7 E8 h% L8 f& V, X$ E                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
) G5 r& k' s. B' [5 a  V" j9 H- t+ B                    continue;
8 @, E# A) F3 G                }: v3 D/ K1 _& i8 M; `" e' L* b. m
                else
7 C. x9 D& W. A, S" ?8 e                {* d/ h! c+ A7 r3 G7 g" U. A; O
                    if (numw[i] != 0): {/ V# b9 e( j) Y) r
                    {
3 ~5 \# J. }* k4 Z) ^' y! E% {, H0 w                        i++;
7 h3 t# L; n9 ]                        k++;
) V: {( D0 E8 e* o9 H                        if (k == n)
6 |0 r# _  P/ |                        {; X" r3 {# F4 ?% ]% A
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了5 j* {$ J& o$ d2 u; U
                            k = 0;( E9 R8 Z' g9 @. h8 o- W2 W; Q
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小16 E9 b/ P$ `7 a, k8 q# _
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
" R2 k( o7 }1 y                        }* e1 q- H6 }/ ]' s* }7 Z
                        else//输出暂时还没有改变数组元素的值
0 ~, n. j5 |9 P+ i# x2 F: M                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
' ?1 n0 f( X  x% K( W9 h                    }
/ T2 G2 L1 m0 f  C) S, {                    else5 b, G* t! c& [8 s! Y, X3 I" u5 J+ A
                        i++;//数组元素为0,直接跳过,不计数。。。: `! B% h5 p5 |2 R! `
                }7 _4 J4 K8 P2 m
0 N4 ^( b6 Z% z0 ]2 `" D) R

  ^8 @2 t3 T- Z5 B2 A            }//结束while循环
9 o$ q4 v+ h, v8 t            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
& t- {/ t0 H. O6 z) \( ]" D% ^           
5 R- I* f# m# c4 E" H6 q                if (numw[i] != 0)
, E& o  S7 ^6 K4 x$ ?                    Console.WriteLine(numw[i]);6 I3 D8 w8 Y: j2 i: j2 O  A
           8 v) u1 w! @5 ^3 h! M3 n& D
            Console.ReadLine();
' O* A" }! ~% v6 ]3 w4 \        }) j  y4 F8 P, V' M" a8 ]" B4 p
    }0 ~, ]& N/ K4 m7 \7 ?2 a& W0 y
}. f8 F6 S7 P2 J( A+ T
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com

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

GMT+8, 2025-4-8 04:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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