鱼C论坛

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

猴子问题

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

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

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

x
大家好!2 s) o& Q6 O. |4 y/ w$ L
这几天我在忙着编一个问题,我用了一种方法编出来!" v! o0 Y# p# }. _' e3 I
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
8 i+ z7 D; w( K4 H( y* f注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
3 w1 ?' z7 w' _4 l( S1 B& w8 ?7 k. v
# k" C: U2 f" j- H4 ]# U2 l5 L7 \% ~& S; V$ h
                            题目
6 \$ q0 q2 f# W0 ^% L/ R0 c山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。, e0 ^) T$ D  }# U
第一种方法:利用循环链表: d' E+ G7 ]' a$ Z# e  F) c, g4 X
#include<stdio.h>
2 }7 g3 {. F- N$ F; H" [#include<malloc.h>
& Y9 H/ ?  U- u) K1 _$ n& Q#define M 8            //共有8只猴子( G; G" p6 E) T4 X
#define N 3            //数到3只时退出第三只
  H3 f1 U# f! w) _4 Gtypedef struct monkey
4 [* N; y  O- k, H{int number;8 G. h# \) v3 |+ U
int flag;( q( G! y( N# A! h' e( D
struct monkey* next;: D% N; w6 D% \5 B! Z1 s1 z+ V6 d
}MONKEY;
& H3 Z( g. B& R9 ~main(). b0 o0 F7 |9 O" f, ~
{ MONKEY *head=NULL,*p,*s;; c( ]3 z3 l+ b: Z+ t
  int i,sum=0,count=0;+ q6 m$ }: u% n  ]+ A% e% {
  clrscr();              //清屏
2 o. I% O0 D- b1 S# C" n: B+ [  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
) i5 g( p2 E/ U" u  X5 h+ ~  p->number=1;p->flag=1;, d: O+ h0 e* }+ u) L2 t
  p->next=head;
1 U, z% G1 N4 `1 Q* H' S  P  head=p;) y- I- a% `5 G5 ]
  for(i=2;i<=M;i++)
/ ^) Z1 w* [( v2 g  E; ~    { s=(MONKEY *)malloc(sizeof(MONKEY));0 z8 w1 ?4 y+ }
     s->number=i;s->flag=1;  ?" i! h6 v! |" Y
     s->next=head;
7 e: c3 V9 j2 e2 N     p->next=s;p=p->next;
; K5 D4 f2 Y& L$ `5 R    }
  I, }1 [; [; u9 s0 v- h    p=head;/ ^+ I$ I. r& j0 p  h. w
   for(;;)2 k- i! O# A* ~1 n3 B% U. M0 h
    {if(p->flag==1)
, p6 A) H, C; l5 ]+ K5 Q       count++;
1 Q3 I" R2 F% U$ t# K     if(count==N)% K% j$ A! }0 N! Z1 J
        {p->flag=0;
- S9 ?( d0 \, L, j! L1 q         count=0;
  n( W" Z! ~) c: u. x9 z$ u2 R         sum++;}
% S# A- i; E1 C* V$ g# Y7 o) v     if(sum==M-1)
2 G9 w' H4 b4 H2 c' Z/ N) E, d5 @        break;
+ Y# j% O+ n8 H, G/ A; ?& j     p=p->next;# M; V; _' r- ~& m& K. S) s2 f
    }
1 ]2 ~6 V0 G7 O- V3 ]    p=
* ~/ Y) W0 a# i! y3 E- H4 q' p" p    head;
8 d  a; q$ l7 s$ @4 Z/ t    for(i=1;i<=M;i++)8 a: I! p- m) M7 ^. \0 B
    { if(p->flag==1)) t* m* P% w3 R3 T
        printf("\t%d",p->number);
9 G( W+ I* p0 J% T- e      p=p->next;
$ o3 W$ r, ~2 M0 z5 S! d  ]+ W1 w# r    }
! {* Y: v8 J  G  ]
) r6 M) M+ ~. A4 b4 d( p" t$ F. w4 E: h6 z; k; f
- c! J; O1 w, }2 w
}

  k) p7 S2 h/ k8 |第二种方法:数组
. T1 G( W0 |3 ^#include<stdio.h>/ H# s! Z3 O; f" j& B/ x  i" }3 P
#define M 8
8 I# k0 T( n: n5 Pstruct monkey
( d, c- |. Y# u) y  X5 M( H{int number;8 ?5 y3 z! g" y/ P9 {4 k- w. i5 J
int nextp;3 F9 P& ~; y) _& |
}link[M+1];; j1 y4 l5 _2 k6 E

$ ?5 C" `- N2 Q/ I& Gvoid main()
4 Q4 ^- T. b7 T8 }* K{int i,count,h;' q6 M. n. }' r# @, F
for(i=1;i<=M;i++)" _) G. [2 j5 m+ t/ b( y4 O% q
{  if(i==M)* A8 ^9 q4 \. Y+ s0 J* N
   link[i].nextp=1;
+ b1 e1 b3 G$ Y1 l9 p( ?( V& t   else
* Y' ?9 C  j& W5 f  |, m   link[i].nextp=i+1;" d: i( T1 }4 n8 u
  link[i].number=i;& t9 b2 Q6 u( {. q
}
; l; M9 j; b: X/ a5 A3 Q, Eprintf("\n");' D; g0 [& q3 ?( y& m) @
count=0;5 V! C% T% r& Y
h=M;
( p8 G( s7 M+ u: _( \' v( l4 sprintf("依次退出的猴子: \n");0 S/ L/ b& i, I5 v' f
while(count<M-1)
# B: o1 ^8 d- q5 w5 x' a* {{i=0;. l9 h( e& E3 ]. s$ a" F4 i5 F8 Y
while(i!=3)
5 ]% E6 G! L& f$ ^{ h=link[h].nextp;
2 E% F, B/ n& r. @   if(link[h].number), p, _& n# O' ?. ?! I
     i++;}1 z! Y" i7 I- W' I  d

; C" s1 y) M$ c! p" [+ O( C1 A; lprintf("%4d",link[h].number);: a9 o3 {, K; i7 l6 x
link[h].number=0;: S7 e2 w. r8 M' S
count++;
! h: _8 U+ _1 T7 M& U}
% o0 ^8 N: j0 M2 [, n, b8 E" N; G+ h( D" F
printf("\n大王是:");
9 j/ a; J6 _: G3 q' G& p  for(i=1;i<=M;i++)
4 H' L+ |, ]: g! I: l" S8 I  if(link[i].number)) |2 ?5 p7 `6 s4 z7 Y
    printf("%3d\n",link[i].number);6 J7 D$ A$ l  Y! A# G2 M! z0 c5 `

5 `$ K% k% A6 ?! h- }  y  Y1 I  F8 E, m
}
$ T0 ~* W& _) W
第三种是普通方法for循环
0 B  ?7 D; j" _3 C7 f. g
#include<stdio.h>
, L# ]( H0 I* G- O( N' [0 Z6 Ivoid main()
. m3 m, E7 j  O{ int i,k,m,n,num[50],q,*p;
8 o3 t# f9 P( O! J3 n( L# O# ?    clrscr();. n9 D9 Z! W4 J, f- J$ l4 v% y
   printf("input number of person: n=");
3 x) r$ C9 z& P) u/ {0 B    scanf("%d",&n);
( r- B3 r, i' y7 ?! B/ U) Qprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
4 g4 P) l- L, G" z6 r0 ?0 _    scanf("%d",&q);4 u' [! N6 v+ Y, |
   p=num;$ D5 ^" V9 F7 G: s, J7 q3 e
  for(i=0;i<n;i++)
9 D# t! [" h+ r0 w0 w  ^! H    *(p+i)=i+1;6 r6 x$ h* u2 w4 v3 x7 p
   i=0;1 c) v6 a, V& \# Z
   k=0;+ c8 B4 r. j3 X2 V- C7 `8 h% P
   m=0;
- [9 s- m- W2 ^6 P5 ~  while(m<n-1)
* W+ @% y& [: ~   {if(*(p+i)!=0) k++;
8 H& K8 A% g* T( R! m     if(k==q)
7 Y6 f! v7 f5 T3 F: U      { *(p+i)=0;7 Y- y# A! D- \6 m; ?
        k=0;
( e1 s8 o3 N( ^3 j/ u% m- J- W        m++;# \2 @$ o) e" K% d  t6 B7 u
      }! R/ ?$ `$ M1 y  g
    i++;
8 l3 w; ]4 `9 P8 v  b' Z3 M6 i    if(i==n)i=0;7 W4 n; U# M& d& H/ l" z; e, u$ V
   }# w; c$ I5 w, j& g7 y8 s
  while(*p==0)p++;- o) x& b# A$ ]" U
    printf("The last one is NO:%d\n",*p);5 H" ^$ v/ e0 a
     getch();- D) }  x& A4 s5 x( a
" U0 m7 W4 O# D- [$ q: P
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
7 s- ?7 e# R1 p0 m! g$ Anamespace 又费马达又费电
) G3 @: e3 D0 ?' \2 i2 O3 q{
) S  `. _' a/ V    class Program
  x( p! `+ {0 B3 R    {
: [# C. t6 h: D# R, B        static void Main(string[] args)1 x! m6 e5 H; p, G1 \% R. ^
        {0 V) P, Q7 |* f) E# t  M5 H( ], s) h
            int m, n;4 y4 s* R1 L  ~( f! Y: |7 \
            Console.WriteLine("请输入数组长度");  _, K% d, q  y% ~$ V( n
            m = int.Parse(Console.ReadLine());//m为数组的大小
1 n7 M9 r- x: h) H! x/ T            Console.WriteLine("请输入要截取数字的大小");" ]3 _9 A7 j; T% M( E- A! j8 q
            n = int.Parse(Console.ReadLine());
& ]! H* J; M; f1 h            int [] numw=new int
3 j: b' b0 F- D$ o% x: h2 M7 S' D1 G/ w2 B: i+ W
&shy;&shy;&shy;;; |5 n" w4 y4 m# ^  Z
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数/ ?+ I2 p2 ]3 j
            {
/ [9 q; ]  [" ^                numw[j - 1] = j;
# b. p+ |  g+ W2 p! G9 h            }7 I% D% D/ `) @
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!, k% b  w! }5 s+ V! p8 ^
            while (d != m - 1)
. M4 m+ m7 ?* I6 S5 n/ j6 H' Q            {* h. q7 h6 q; ~2 n+ a% G4 J
                if (i == m && d != m - 1)
5 ]. f: ?# K% @$ ~1 o                {
# C3 z: W2 |, n) s                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
3 |/ Y& i# x  b9 K5 s3 K                    continue;) ^$ A0 l# Y0 x0 U: \( @6 m
                }: X/ F# o$ R6 P2 i, ]4 q% g5 G9 d
                else# {# A- L  \" F2 _
                {' G+ K  M# K6 ?* t" T% R
                    if (numw[i] != 0)
' S, u1 Z/ y; T                    {
7 k) J3 d) F/ L. C' ?( f3 J                        i++;/ S1 @9 [( n# Y2 d3 `- m, M
                        k++;4 u& f/ a0 }6 x' a' R
                        if (k == n)$ C' C( I* j0 \( m$ K
                        {4 a6 F; h6 z0 ?2 E2 c- E/ Z
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
) z8 {. M; k" h; V4 |% V                            k = 0;
0 Z. A- ?. m7 X- [0 S8 U# I! R              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1; v! k7 W9 T' ]7 x) D0 @! _- E
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);% \% |+ a0 X7 n) p$ F* K& G$ f
                        }
' f. A* m7 d9 [0 n                        else//输出暂时还没有改变数组元素的值
' h4 R& f0 u5 |+ A                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
& F0 Q& q1 e3 p( @/ H                    }
0 }" |6 J: F' D                    else. E* g& v0 M1 P: v; w
                        i++;//数组元素为0,直接跳过,不计数。。。3 Y: [7 M! j4 w; g- C
                }
7 F: S+ J2 i6 D! P# v + n$ l% R. H4 ^% h% \
# u1 ?) f0 M" S( u9 I& A8 A4 r
            }//结束while循环
3 B0 j  I, T" ~2 Y. w            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦+ @* J2 f% x+ E1 b
           6 J" R7 P2 L- x, o7 }6 Y4 ^
                if (numw[i] != 0)4 G" I# F7 }7 W& e
                    Console.WriteLine(numw[i]);" b! _6 F( }% O0 Y6 P/ p8 h9 n' |
             Q3 G9 y, V5 m/ h2 ]
            Console.ReadLine();
9 C$ W3 \( p# R% D" r        }
* W$ E% V1 v! D. c0 R    }
+ c% o. K, S7 V; t7 X8 ~}8 c( L% n& o8 }
小甲鱼最新课程 -> 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-7-12 19:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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