鱼C论坛

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

猴子问题

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

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

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

x
大家好!  g7 A6 O! t1 v( A4 `+ w
这几天我在忙着编一个问题,我用了一种方法编出来!* d3 r5 k# U5 i6 Q& G" l( g: G. e
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!5 v: J3 e% l# t
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 % J1 z" J( w7 {! s# X
0 {# v4 [; ?0 B5 h; j. W- e
6 Y) n% i! l6 O  ^
                            题目# |$ {/ i" c& o  I
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
. D. Y3 k/ k4 r; \5 u9 E) g# j第一种方法:利用循环链表
7 |% L# W, t* |% ^#include<stdio.h>& g0 p, v2 P. _
#include<malloc.h>- R7 s5 ]2 f$ f+ `; \% @
#define M 8            //共有8只猴子
1 L: v+ O9 ~; r2 d  n#define N 3            //数到3只时退出第三只
8 n% t6 S' G3 j4 }! z7 atypedef struct monkey; i: t- ]% @/ _/ M1 X
{int number;7 E0 M8 q5 |/ T+ _7 m8 P, ~
int flag;
1 X3 _4 e2 Z1 S8 {struct monkey* next;
3 ~8 U- C9 e# A) t8 b, B- i}MONKEY;
1 C- E, M( Z" w- D9 y! nmain(), H3 _4 V4 {) v. _3 }
{ MONKEY *head=NULL,*p,*s;
4 |, T, q2 d& O: V8 F+ u8 b. u  int i,sum=0,count=0;  Z! r/ O( K3 g7 |! _
  clrscr();              //清屏
' u; H8 s  _- R: I; c( T  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存; R! X2 @! l" e8 k' v7 {
  p->number=1;p->flag=1;9 e* ?/ W: _* m# }! {
  p->next=head;7 `) p8 A* d* w2 s5 c
  head=p;7 F8 _. Y; r- `# X0 q5 c6 x
  for(i=2;i<=M;i++)+ l1 p, q9 S9 n! f. l6 g% g
    { s=(MONKEY *)malloc(sizeof(MONKEY));
, X7 x! x( }& W: e1 j- b; `- I- |7 x     s->number=i;s->flag=1;
. d  ~2 s# T, u% X" F     s->next=head;
8 Q$ m  P+ C" F2 R/ Z     p->next=s;p=p->next;
' ?  m% h3 o+ ]    }
! k+ ?9 {, T1 e    p=head;
( {4 _4 ]* A+ j. {2 ?8 V) \9 t   for(;;)
& d8 `/ z0 Z) x  ]# k5 t) K, R    {if(p->flag==1)
! H( k. e  n, f( A. M$ i6 \       count++;' _9 Z5 l4 J  m4 O: h' X
     if(count==N)  b( S4 W8 ^+ X6 C8 v
        {p->flag=0;
6 k* P- {# b! M. J7 I* C         count=0;
% u: L' H& @. B7 T         sum++;}0 f" n( M1 _1 U& U8 `$ F
     if(sum==M-1)
/ S4 Y6 C1 I' k- ]        break;
' q5 q7 j" R' n2 O+ J, {     p=p->next;! V$ `; S- B- b) Q) H
    }0 W2 ]0 F! W. h/ j! p1 x
    p=" n& S# b0 v) Y! Q; \5 M
    head;
# y  Y3 n& Q- p    for(i=1;i<=M;i++)7 q% I* a# A) L- v& Z5 U4 x: d
    { if(p->flag==1)& `% @! p8 N2 @. l: L  n, T1 U1 T
        printf("\t%d",p->number);  w3 s- r: {* V
      p=p->next;# B  L8 H1 Q! J8 m7 d9 c
    }
) F) S6 x) n6 a0 v: N
8 }3 H" F7 I" n; M; ~. U) W! r( W" d2 Z5 r8 z; D% X
2 e" h+ k1 r8 E( F6 z7 x; A
}
, F, j. m9 J9 H
第二种方法:数组; X8 Z3 ^. z+ B: Q# |" \
#include<stdio.h>
7 c, f, }% N3 V#define M 8
2 J/ k6 V" c" e9 xstruct monkey
8 h/ ~% Y# n$ a" L% F3 m% n7 A( j{int number;
* C# `: ~( \1 q* P# |! ?7 Vint nextp;
4 U6 i0 Y4 P5 U. ~- V' }" M}link[M+1];. L. C0 U7 a( G+ B

& j, ]. B4 g- _; {void main()
8 A" R: v) l; X6 {! U1 ~" O{int i,count,h;
. L3 ^: `% j4 e& L9 Xfor(i=1;i<=M;i++)4 R  ~) O; @: D5 j  z8 L
{  if(i==M)' q1 o1 Y& _6 W1 y$ {1 g; e( T
   link[i].nextp=1;, d) [+ _6 ^3 x, ?7 c! W
   else
0 `7 ~5 Q3 F4 D; g, _- `- k* i3 [   link[i].nextp=i+1;
& x  p: x/ |0 I, r' w  link[i].number=i;
0 Z) T# e+ e' K! Q. x}) M$ v/ P' \0 {' A
printf("\n");
2 W/ t& P; W/ y/ Q6 x/ q8 Zcount=0;% r5 u8 ~2 L- p3 t8 G# o+ S# v7 m
h=M;
0 K  e' b6 \, }4 Cprintf("依次退出的猴子: \n");
6 I/ I# O+ l  G0 D7 e# h% Nwhile(count<M-1)( G( u# \( c5 L0 L
{i=0;
: [' G+ Q6 s% o1 W$ p- Kwhile(i!=3)
* f* N$ Z" p- b{ h=link[h].nextp;8 p2 V  S- Y- P
   if(link[h].number)0 l( r/ T6 q! _2 l
     i++;}
- U( X3 U% S" q! `) x
8 D7 V+ z* l( r9 \; Z+ s8 ~printf("%4d",link[h].number);# p# ]( L* u# v# S' C( A5 S' q4 m
link[h].number=0;% ]  l% l* A, Q( P! s1 n- [& h
count++;
( n/ D$ i! C2 h7 `! L$ f, `/ P}
) T. |0 K) e7 ]  B  g& k- a( R1 }( `, W" n% W' {8 v% ?0 Z+ M
printf("\n大王是:");
; T: j0 u  y/ i- b1 W) r  for(i=1;i<=M;i++)" ]! B( m. C+ [! |3 f
  if(link[i].number)6 B3 M7 i6 H2 i# Q' g+ X. ]/ B
    printf("%3d\n",link[i].number);+ ?( Y$ p$ P+ C. S( x' S

! D: ?  T- N$ \* Q$ w
( F5 Z: o; A4 o( l/ f, X6 M}
  H# e! K# o+ K( G
第三种是普通方法for循环
# C/ |4 i% x% w, R: ^
#include<stdio.h>: s. ]  K+ g4 p, q' Y( D
void main()
. A# a% _* h7 R{ int i,k,m,n,num[50],q,*p;6 j) Z, I* N, p7 J+ Q9 t% }
    clrscr();
4 i1 [$ i' V0 r; O  [   printf("input number of person: n=");
* k  i- u/ a0 ]4 \& Q    scanf("%d",&n);
: i) G& X2 g, @! e& T3 F# }! Dprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只2 m8 K2 v: Z* L
    scanf("%d",&q);9 O, H1 [4 K2 a  A( c9 D( m
   p=num;
+ o. I& i2 h; D2 l. w1 x9 R5 t; K  for(i=0;i<n;i++)4 P7 M5 b6 R3 ~/ ~  s6 s
    *(p+i)=i+1;. U2 V7 Z( G. S' N  Z; F; v
   i=0;" q. x( K. z) t3 c1 k; a
   k=0;% ^  v, V: d1 U; v8 K
   m=0;8 s6 W6 J; C% i( v" t
  while(m<n-1)
: l9 j4 p' o% V7 Q0 B   {if(*(p+i)!=0) k++;
+ z' j( l. s+ V! @% \" l7 \     if(k==q)
% q9 W7 i, F9 o      { *(p+i)=0;" i" d+ W$ K; {/ |7 u  Q; M& U( B( w9 w
        k=0;
( W3 H: y0 }& i% c# Y( |        m++;
6 b0 a% z. X; T1 t5 e$ J# x8 {      }
* V' y  P3 W& s" Y! I* v( p# s    i++;
% k( ~" I( Q+ A& ]. q- ]- ]    if(i==n)i=0;' h  T6 z, T, u9 J% n# R) Z
   }
4 L7 h( O0 g5 e3 t% M) z& H  while(*p==0)p++;
3 U( Q9 x/ B3 P* r6 ?    printf("The last one is NO:%d\n",*p);$ i  ]- g% {- n# m" G
     getch();' n/ U* t/ N: p+ L
3 x% Q$ }, ^3 [' n% D, s
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
1 t2 Q. [+ S' R5 {1 Jnamespace 又费马达又费电
- ]( M; r2 A* o* i: U* I+ F+ d{) f* C! m" V3 a: C! u: c
    class Program: G: b* Q3 D& x: `
    {9 r8 V% c& x2 y- H! C
        static void Main(string[] args)
! G1 g, R, ?1 o- E0 c0 I        {; r& C7 Z: _8 r. E& q3 Y
            int m, n;
7 d- [3 N7 b$ J            Console.WriteLine("请输入数组长度");
9 M4 {% u3 X6 T* v            m = int.Parse(Console.ReadLine());//m为数组的大小
" x* F: f( _* v. @! q            Console.WriteLine("请输入要截取数字的大小");
( J( J3 ^  t) v2 D: T: j            n = int.Parse(Console.ReadLine());% g5 }% ^; o: t: N. H' ?
            int [] numw=new int# z6 e8 j! R1 e4 o4 R; Y

9 T; F) S5 F" Y8 g) R# m) Y&shy;&shy;&shy;;1 u4 v9 j4 J* }9 M" |' Z2 P2 g
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数1 C5 f; y8 a8 {) p% ?5 h; d
            {
' [4 U1 {  S2 j: b0 C, i- W" }                numw[j - 1] = j;+ U" i# @. X! ]
            }1 a& C5 t3 R8 ^# e6 _, i" p
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
; p# ~* D$ x  g0 _            while (d != m - 1)3 ~# L7 B% s$ \
            {" s, f" p5 L8 c6 |& A% ^
                if (i == m && d != m - 1)& i, G- f3 U" M* X* W+ G% m
                {; S! U) i# d; k: D, I4 G
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
$ S$ ]  f. M( P9 q' Z% ], D( b8 z                    continue;9 g5 C4 P' H3 L5 v
                }
+ g( q0 x; e0 J/ G5 N+ W! l. v, z                else
1 _) S6 H4 X7 _6 J& T1 S# l* Y                {
' `) K1 l1 ]. [5 @3 m0 q* b% N( D                    if (numw[i] != 0)
& ^" a& {6 J1 r/ L- @                    {
8 P5 d4 F7 w4 t/ N5 W% P2 W                        i++;
1 |' L+ [0 ^4 M, {                        k++;2 X0 f& X) o- V, j9 {
                        if (k == n)
$ |. a2 A, l* _                        {
% F: P' M0 U0 U* R                            numw[i - 1] = 0;//把在n位置数组元素的值改变了1 Q5 r5 U0 M5 O
                            k = 0;+ g' ]' M* S1 C4 G, u8 w
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小15 M9 `# X' c% c6 |0 T
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);1 S, _7 s) y! B6 `( `
                        }) L( p, N7 m+ C* h/ Q
                        else//输出暂时还没有改变数组元素的值
4 v; y2 [& }8 g" N; R                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
, Y' n9 k% m- [/ E' y. A                    }
% u5 ~2 X% w# S% B5 o8 L. K9 U$ P. Z                    else
$ S% i) R' J9 ~& W                        i++;//数组元素为0,直接跳过,不计数。。。
' \2 h" ?% i5 W, b- v) V& V                }
4 `+ o1 \8 P* }8 Y" c( D 6 Z! N. @+ ]- b' _
" \( |+ J# Z  U4 m  M3 n; y" J: D
            }//结束while循环. j. k5 B+ X0 r  d& T
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦) i5 ]. p1 d% I( Y6 r
           6 Q9 J2 g5 X" H& p
                if (numw[i] != 0)1 l0 [4 S% m/ X8 N) p
                    Console.WriteLine(numw[i]);& V8 @$ O# m1 ]" C. H, y5 r
           
3 A+ {$ y" ~. }; `5 }            Console.ReadLine();
/ t. a% |/ R' d9 v$ y/ ]- s        }
4 l0 O: `5 x! r/ q! A: W    }  d' C& h# B! Z2 p
}
+ r/ f. [6 n+ b8 I7 v# D
小甲鱼最新课程 -> 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, 2025-12-19 07:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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