鱼C论坛

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

猴子问题

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

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

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

x
大家好!( p  ~" v5 p6 d/ v  M% x* r
这几天我在忙着编一个问题,我用了一种方法编出来!, t1 Y$ `1 _/ v
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!! g" L' p' o/ R! }$ }  D
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
9 |$ ]- r- A( G6 N+ x: o+ |6 I$ M* d- S% w( r- A. M% z

  U+ W# ?. C- }0 r/ G5 R
                            题目
4 S+ H* ?( K: e- L+ K7 j5 `6 U山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。8 X) U, {; ]5 M8 x) P1 k& h# n; ^: q4 _
第一种方法:利用循环链表
% o+ a6 h" H, J1 c4 o0 O#include<stdio.h>3 j- _( }* K# U" X( g
#include<malloc.h>/ p6 A8 p5 l: E# u- d( n5 x/ d' q0 f- n2 F
#define M 8            //共有8只猴子
0 k* @4 X' V" D6 T#define N 3            //数到3只时退出第三只
% O" s, G# h& q( F& ztypedef struct monkey
% T* ?, H$ U3 Q# h( d{int number;
  x3 S6 E) _9 l: t, d8 }! Eint flag;
: X6 ]- F3 v3 Z( O+ l9 M; ystruct monkey* next;
+ C0 X' W* I4 N! Y2 h$ ]; Q}MONKEY;
" A; @7 @* t3 N  n6 m: \8 u- rmain()
& R$ i! J2 l) a4 \{ MONKEY *head=NULL,*p,*s;
7 w- j# l9 T3 r8 K  int i,sum=0,count=0;2 J' z; ]% }* R# u' E
  clrscr();              //清屏- ?6 s! N& X3 N5 N5 B/ \) Q
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存+ E6 L7 I, B4 o2 i9 h4 |, H& ?' L
  p->number=1;p->flag=1;, X3 T7 }4 U7 D9 N+ w1 _9 U
  p->next=head;+ w) l' T( x* U" V
  head=p;+ P% i- o0 m* z) U' f' c' H
  for(i=2;i<=M;i++)2 @* U) S$ e: ^& L5 S+ u  \
    { s=(MONKEY *)malloc(sizeof(MONKEY));5 V+ d  e( Q. i2 b* B
     s->number=i;s->flag=1;
0 q# p- h6 C) R: E     s->next=head;
& v4 I+ X  q4 M$ b6 u" ]     p->next=s;p=p->next;1 a. V3 L/ O7 ?& L
    }' s+ k: \' l5 w/ b
    p=head;/ r5 I5 G, R3 G. Z. z5 o
   for(;;)! x+ V# ]/ w! p, E, z
    {if(p->flag==1)" Y% w# p* o( [5 [; ^, x
       count++;! Y6 u& m) R( C9 j
     if(count==N)) F$ p- R* b. ~/ D/ r
        {p->flag=0;
! M& g9 M* K  n         count=0;
6 [2 i* N/ c9 \7 g& m$ |! t         sum++;}
' |2 Y2 ~3 l$ X: V     if(sum==M-1). w) m  T6 `: j& ?$ z. J
        break;* i$ M; q, @2 M/ O& @
     p=p->next;/ p, B7 }' Y6 ?9 [' f6 ^% H7 t
    }
; Y  C* U) ]- T2 G' E, P5 R$ v    p=
; a$ _; w0 r; Y% }3 R, s0 g' F& E$ X    head;4 _; }* M3 N( P* A# _. ?5 m
    for(i=1;i<=M;i++); }2 _% S5 W: h/ e
    { if(p->flag==1)
1 @6 Y& ]8 P  ^; b5 z1 \# {% @4 I& |        printf("\t%d",p->number);
& H2 U  Y7 W, R) h$ N      p=p->next;+ I% ~$ t% B+ o3 n- m: C5 Q
    }
8 h9 M3 p: v9 t# |- `% i
* m2 v+ ]4 g( O9 J
& Z3 L4 _- c, j
% }+ m' r( k6 Z' {  O2 U# r/ A}
" a' z; I, O5 a( O  d
第二种方法:数组# }' x" S4 Z9 D7 Q- b( H2 y
#include<stdio.h>5 ^, Z7 T! D4 |1 _( C3 S: M. }# ^; f
#define M 8" m/ @/ v$ a4 t9 f$ v3 ?' ]
struct monkey+ Q9 N* ^2 P) e* u
{int number;
2 X' H- x* V9 |% @* v, n8 {* Tint nextp;
! X& L& j: y( w) c  i# p5 k}link[M+1];- b) z( Z" O2 M) O

' k! m; H0 G* U* m8 N3 [4 Z( Q" bvoid main()
$ [6 z7 e8 B8 [{int i,count,h;
* E7 w' @3 e6 U+ M+ L7 Nfor(i=1;i<=M;i++)
& M1 q1 K- V. j+ N* @- R{  if(i==M)( B3 j. a2 I, D" D; w8 m% ^3 `! `
   link.nextp=1;
4 L1 C: i# O0 u) l$ y   else
. D! D& D0 n# H. w  x8 P4 o' C7 L   link.nextp=i+1;# l( z5 `+ t& _1 H
  link.number=i;+ V( U  a& V7 Q# K
}
) h" f4 [; ]& n1 Bprintf("\n");
+ h$ n6 p2 R, V+ lcount=0;
) ]+ V( J3 v. R2 }* a* Yh=M;% c8 u' `0 U/ W& A9 l; V
printf("依次退出的猴子: \n");
% F! h3 n" P$ [# Q# z2 dwhile(count<M-1)
' _! [; Q# U5 H# G{i=0;
" ~. h; I& G" I* Q- ^8 M! [while(i!=3)* P: ^# t6 |6 B: H1 b, u
{ h=link[h].nextp;* L* G5 E, N' x6 S2 V
   if(link[h].number)
) N- {9 R1 H6 v! y$ `     i++;}% b, d6 C0 I5 ^- E

) d0 R9 Q: b. G9 t4 I' _printf("%4d",link[h].number);
3 {/ i; f6 b/ a9 c$ Flink[h].number=0;
: X8 S" E# F. e" G  t2 L: kcount++;
4 `8 D, g% R. A}
7 ]' P. C. j3 N6 t
3 [, p7 n1 J: b( h2 y' ?2 D+ {printf("\n大王是:");. G( b% a8 t8 P& P
  for(i=1;i<=M;i++)5 w0 W2 d- ^7 c, M
  if(link.number)
, R& \: _9 [  w9 ^3 k/ k    printf("%3d\n",link.number);, P7 E8 c: K/ P/ K+ j% F9 t) E

6 K# n2 T5 d' ?  C
/ D$ v9 B( w) t1 e& }0 J7 W}

& k4 p4 U, o( ~& h, P- A" ^第三种是普通方法for循环
' G* w! b, }* L5 U- M1 J
#include<stdio.h>
8 I( ]1 @" b1 {! P  {5 Nvoid main()
9 E' J: ~' @& W' B{ int i,k,m,n,num[50],q,*p;0 R+ P4 D' J6 _( l% d
    clrscr();6 p# a5 P4 f, v; |% \9 I& m
   printf("input number of person: n=");" q! g2 g% L2 L3 X- |  s
    scanf("%d",&n);$ t( W7 D4 r9 w
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只0 |( g3 }# g6 d% G) B  L% @& o
    scanf("%d",&q);  ?! b0 M6 x( B7 ]  s
   p=num;. z+ a# u1 \$ d+ ~/ p" p; i
  for(i=0;i<n;i++)
, V, B4 H7 [$ W* y    *(p+i)=i+1;
  _. a! u8 x5 d/ j! H   i=0;
( ?" T! R$ z2 C3 I. Y/ n, t! k   k=0;
- X$ C' h4 P, C, v6 Q1 k: H3 R   m=0;% F6 d5 q5 @9 D- X0 f
  while(m<n-1)! M4 G+ {3 Z! F/ `% Y8 _8 l, z
   {if(*(p+i)!=0) k++;5 v+ ~- \5 D- _" p: c% ]! R" a
     if(k==q)7 ?* c" b8 G$ u  l! }' J
      { *(p+i)=0;  N; Z, c8 O9 e+ t/ l2 }! P
        k=0;  Q( @8 n% D( g* D& B3 I: V
        m++;
7 I9 W. _2 b, P4 J: f      }
3 d& \( f) u) y! M    i++;7 ]) p5 \7 `8 i) X+ R6 u& j  `
    if(i==n)i=0;
% P+ W3 R" q0 b9 E) f   }+ ~! W& C1 Z( ~; O
  while(*p==0)p++;
* k! \* Q. }! J6 d/ ?$ a4 f: j2 M    printf("The last one is NO:%d\n",*p);
  ]$ ?+ s$ p* F     getch();
+ i' G- h# g7 m' A7 S! Y2 _$ Y/ W: ^; s2 M, B. U
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
: o' P0 D+ q" j; L- Inamespace 又费马达又费电
" X5 M* Y! Y2 j& ^3 {{
0 M  F& W  Q! q; m    class Program8 G7 Q5 x: H9 s: j( h0 k/ ^
    {2 ]# Y0 E1 ^7 y6 |1 B
        static void Main(string[] args)
) Z, P! @- E0 H& `- X        {8 }4 C% B5 g( b  [( T( y. w
            int m, n;
5 N9 a$ ^) f, J7 B            Console.WriteLine("请输入数组长度");: o7 O) R  \9 ^
            m = int.Parse(Console.ReadLine());//m为数组的大小) ]2 m* M' z* D* a) ~! n
            Console.WriteLine("请输入要截取数字的大小");
& F  P. s& Z7 }, P4 B& [% t2 ]            n = int.Parse(Console.ReadLine());
) f# i( Y! U8 W            int [] numw=new int
- ]" u/ ~2 T5 I5 V7 K% B, Y1 W9 ]
&shy;&shy;&shy;;) T( }; t% h* g! h! T
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
/ Y7 l0 \- T3 B7 z% |% ~            {3 S+ N5 a' i( M8 e9 {
                numw[j - 1] = j;
! S6 K# m/ F. X! r9 M2 A            }( L! x* B  v; x8 G1 U( Q1 R& f
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
5 M: @8 |2 N' {& E" W6 P1 x& o" q            while (d != m - 1)! g- ^5 @0 J: l! q* Y7 Y
            {; L6 U) o: B  C7 i- ?* N8 X
                if (i == m && d != m - 1)
1 N1 X5 u" m7 O" s% J                {6 C; ^( i9 u* z; X; n/ Z
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!) e4 E, `0 x, @5 U) C
                    continue;
) D2 f3 R0 n0 T/ I7 h# Q& ~                }8 e' E5 G7 T) f* e8 J
                else
# Y7 c$ P9 p1 N4 W" V- J% W; ]. i                {  y8 ^6 u3 V5 x
                    if (numw[i] != 0)! D' G9 C2 z9 |. J. t5 Q1 ~
                    {
% }% p2 E' o) L                        i++;, \& L# I: D% Q; K( K
                        k++;3 y! B' ^" T2 p: a( M
                        if (k == n)% r& m" ]* ]; e) T4 G8 b1 \" s
                        {( T, v3 H$ u; T- F6 Y
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
. k- B! \  V: P" [) K3 M/ C8 v& _- {                            k = 0;' P" j( u3 h  o1 S' k4 Y1 v
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
+ p5 J* r" Y  O- M7 l                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
! `7 a, G( i! Y9 F1 c/ y8 U; ^* q7 q                        }$ t2 c1 S7 W; X5 Q# |, E
                        else//输出暂时还没有改变数组元素的值' l  Z1 J8 W8 f7 K$ t
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
3 x+ Z; A8 T& J* k  u* u                    }
  d/ \# r4 L3 s' \% w                    else6 Y8 [1 c- ^1 j8 P
                        i++;//数组元素为0,直接跳过,不计数。。。5 Q: V2 O/ h/ J+ S5 d4 R  D
                }% t& T6 i4 ^9 u
2 f2 h) N. R5 |: G+ Y
4 C, F0 i; k6 E" J' u+ f6 P; Y
            }//结束while循环4 P* e* ?+ R! n+ T
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦# Y: D$ z6 [4 m# L6 R/ ~6 A! e6 w
           
$ O7 F, J8 l0 I- j5 r, _/ y                if (numw[i] != 0)
+ u' v+ U/ D. s1 J/ b, U0 O                    Console.WriteLine(numw[i]);$ F5 X8 \& S9 K3 F5 L6 t$ F# ^; I
           
  Y; R; d3 e0 \6 t4 x$ ]            Console.ReadLine();  V+ o6 u" I, H* J- J; g
        }
7 n; i, ~3 z/ d5 W* t% D) d) }    }' M+ m7 h2 T5 S3 I! d
}* w8 x2 ]0 I6 z! _: Z  w  X( D5 k
想知道小甲鱼最近在做啥?请访问 -> 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, 2024-4-28 07:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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