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

猴子问题

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

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

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

×
大家好!
: m! L# A; C$ E: X& v; J, L8 g这几天我在忙着编一个问题,我用了一种方法编出来!! B- N& F! A% x# P
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!) K1 y( j6 M1 E
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 4 r1 \4 m8 F  b6 G6 A" A
' a: K" W6 l# v
2 W3 `# V& A6 `+ G; ]6 z  K
                            题目
) d2 b, c( a( ^. {山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
& F! g9 a7 l+ O9 N第一种方法:利用循环链表: u- p8 V& V( y: D; _* j8 Z
#include<stdio.h>: v7 |  H5 ^' }- R; c6 W  a: D( I
#include<malloc.h>1 N+ y* Y! Z% n+ f
#define M 8            //共有8只猴子! @7 j* D9 y3 Z, d( P- M+ M
#define N 3            //数到3只时退出第三只
0 o% t7 b: A6 ?typedef struct monkey+ s+ T2 y% ~% h, @- l( P. ^; f
{int number;4 e0 m3 _* x2 }& b+ R
int flag;
; }5 s5 ?& P! J5 ^0 F* j. ]struct monkey* next;
7 G# t; [7 [* A3 y5 t$ c}MONKEY;
- x5 Z/ B, l% e, r+ pmain()* B+ L& d  j4 v9 `7 H. p1 R
{ MONKEY *head=NULL,*p,*s;
* \' s0 {/ S  d& }% E7 I# r/ ?  int i,sum=0,count=0;' L2 B6 H; d+ e. E
  clrscr();              //清屏
( }! b- W# |  t0 ^" L# x  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
' s9 j) s2 b& R) g5 Y( c  N5 s  p->number=1;p->flag=1;- Y# f+ S: ^; b) L( H) O/ k7 S
  p->next=head;
- m; y- ?- l- z9 A  head=p;+ b0 i% H: n2 A" `! s" W% D
  for(i=2;i<=M;i++)
: F9 J; N* U! {  N/ a; I* O    { s=(MONKEY *)malloc(sizeof(MONKEY));
! I8 ?+ Y! W% a. j- O     s->number=i;s->flag=1;  P3 A( [# W. t7 P
     s->next=head;
+ c* X8 _1 ?1 |+ k9 @# z     p->next=s;p=p->next;
& I! z! q9 N" R, ]    }, J7 |% L$ f( D8 @) T0 w+ Q
    p=head;  D; t: P9 b9 J/ S
   for(;;)' {  @, F/ x" G, Q
    {if(p->flag==1)4 D; y6 T( c3 E" r( d
       count++;
/ L: L" N. m. ?     if(count==N)2 c9 U3 x( k+ e& ?! i
        {p->flag=0;7 Z# T) V: u$ R" [3 ]/ l
         count=0;- i8 F, r) l4 U; [! m! y7 z8 X% q9 X
         sum++;}
: m2 G: n5 E! X5 z9 d6 Q7 `     if(sum==M-1)& F! X; ~) Z  G  ~8 ?. v9 {
        break;7 `2 B. R  f* a4 T' S3 |
     p=p->next;
; O; {& g+ u# x    }
* x, T; j& h" U: T; Z3 m1 w    p=
' T' u& V: L' x* S& @9 n% r' W    head;
( d4 U, K8 e: @+ y% h- p- a0 w+ j    for(i=1;i<=M;i++)# E$ a1 D& Q! G9 M; R& z
    { if(p->flag==1)7 _$ v( x* ~0 L& H6 w3 ^- \3 b
        printf("\t%d",p->number);" q( G7 D6 z2 c5 t
      p=p->next;
' Q7 s- V1 Z) f, o' v# z    }
% C, O3 {4 M3 i# s! ~: l1 }. [1 v5 K
4 ]8 ]' X4 e: {- z

8 T% b% C: s2 }1 }5 Q5 R: s}

% w& K2 x7 R  {2 b. t7 r" }- g2 U, `' u第二种方法:数组
" x- Q' A" h8 x1 E! L7 [#include<stdio.h>$ S% ?1 g3 e6 ~1 \: A
#define M 82 W1 O' I/ T5 B: F2 ^7 g" Z  r
struct monkey
( [2 d- J9 n: V( m{int number;8 C) c8 z: v  Q; J; Y& a0 z
int nextp;  M' V! a, _5 T
}link[M+1];! ?9 ~, r$ @+ A

- A: `7 p, {; l3 T& h% ^, gvoid main()- e/ ~( g* t9 m" V: G
{int i,count,h;: D. ?3 t# y9 |# T) X
for(i=1;i<=M;i++)+ Y" P* E( S6 a
{  if(i==M)4 |* J" }( C$ f! |" i$ h  R8 R
   link.nextp=1;5 a: M6 A- ~% k: B0 H
   else; Q. s, a" c0 L0 ?
   link.nextp=i+1;; T) e5 Y1 j  Q) k
  link.number=i;; X9 V% Y& w( Y) _/ U* c
}1 I3 a' j/ e, g% s7 g: B) ]
printf("\n");
; v. U  M/ t' C( Xcount=0;0 ]+ ~1 _8 N5 Y
h=M;
" M1 F$ s% a- F5 W1 vprintf("依次退出的猴子: \n");. ~  C* ?' Y" g: h0 b, h# j
while(count<M-1)
% m* Y+ e( |$ m: v$ v, S) u{i=0;
9 }$ S! Y6 i9 V& ~) B8 Awhile(i!=3)5 x  \7 h2 r( f- S  @# h
{ h=link[h].nextp;" D" I6 D( w: n8 V; f$ ~) o* F* W! P
   if(link[h].number)
2 b! @) W6 \& ]& s     i++;}
! o# O- m' o6 T, m8 h9 l. F- N, G: m, ]
printf("%4d",link[h].number);
4 s" s9 Y' ]3 E: |" i9 ^link[h].number=0;
8 V8 \: O; X  ~; }) k  kcount++;+ X; t! o, z8 Q; M2 I
}( w1 Z+ L6 d) W
2 B1 x/ Z% }  ~% g. F1 w
printf("\n大王是:");4 `& Z/ r, ?& w5 V+ e4 Z
  for(i=1;i<=M;i++)
2 y) B* I* I1 Y  if(link.number)
) m; c  h' a" N9 W$ B% X    printf("%3d\n",link.number);) `% R+ _; {, p( z
) ?4 b: G9 I& z5 O8 |  w
/ \) v: m5 I/ u' x% ^- y
}

, v. S' Y3 n3 \# O% D第三种是普通方法for循环
1 U& ]' J3 a8 H0 z2 P, c0 v1 N6 f
#include<stdio.h>  ~1 k! ^  Y$ p- J  C2 k% u5 @+ T
void main()
3 M8 R! M4 t  z9 d9 t{ int i,k,m,n,num[50],q,*p;! ]% ]: w) r8 k; Y8 w
    clrscr();
1 J+ o1 z- r7 E9 \   printf("input number of person: n=");% |: N8 E+ O$ P+ a. j- }
    scanf("%d",&n);
% [1 J( P1 T& d0 B7 kprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只6 S" z% i5 r( \9 }
    scanf("%d",&q);& d6 z) ~0 _5 W# w+ N3 X
   p=num;4 W* v0 ~2 K4 E& A7 j
  for(i=0;i<n;i++)0 n9 s1 X- k& q2 E3 K6 {
    *(p+i)=i+1;
! r  \" A' _+ Y/ p- J3 @   i=0;# ?: S. t$ `- T: @2 q) F
   k=0;
$ U  T8 q9 }* v4 D   m=0;3 B4 U. A/ x* L5 v5 J
  while(m<n-1)$ k+ s( i$ L  P7 F: u: J7 l+ `: B$ W
   {if(*(p+i)!=0) k++;6 d9 f" W. @: Y8 }* Q; b  \( g
     if(k==q)0 q8 c0 H! e) G1 D
      { *(p+i)=0;+ }# n1 x; W' V2 a
        k=0;
9 K" F3 s$ I7 Y  W* L/ I        m++;
0 z% ~& q# i; W# Q, r9 [% J+ [/ H      }
4 x$ P% I+ z7 o    i++;
; W  U. v. {6 J    if(i==n)i=0;! t2 W- }8 F% g4 x
   }
( F$ \  R0 {& {$ \  while(*p==0)p++;
5 h- x, M- [6 R( j* c/ b) C6 A    printf("The last one is NO:%d\n",*p);
- f  N5 m) K! o: E/ f* l     getch();  m- u) N' {/ l) r

9 d9 u/ O$ d9 S  W! z" Z8 y}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;& i0 Z% V( o  }% |( A4 j
namespace 又费马达又费电
. k- h* D+ ]/ f1 b) j0 S2 S" D{
; n) F' W5 n  Z3 `, n# H    class Program/ W# P0 L9 M' u2 A: k% P/ ^9 A
    {
3 c8 u% t. F* j/ I        static void Main(string[] args), e2 n( \; I/ A0 S6 V1 Y
        {
8 w3 p/ d4 v* p* W- p1 D9 [            int m, n;1 n! I* m  v, d
            Console.WriteLine("请输入数组长度");9 g1 K# V' u2 t9 k3 B* J, _' {
            m = int.Parse(Console.ReadLine());//m为数组的大小
0 }; s" a. |9 z2 v            Console.WriteLine("请输入要截取数字的大小");
) X* k$ _5 i% ^2 R/ V            n = int.Parse(Console.ReadLine());* v( }. ^- V' T$ Y8 ]" ]
            int [] numw=new int. q1 f3 I0 D2 L* N
$ z' o& w+ R- \' f' D# v: b
&shy;&shy;&shy;;
( @% {0 [! A8 |' [# G6 K            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
* Z: u& X- ~& A7 A8 w            {
, K8 v; I: a; u                numw[j - 1] = j;
+ [: \: N  _# n            }, |! O+ ?$ R' f7 l2 }. W/ I/ A
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
% J5 P- z% K& M9 N+ X            while (d != m - 1)
7 @2 {7 G$ V4 n, Y            {" N, z0 w! I5 s9 i3 h
                if (i == m && d != m - 1)
8 m% _: i* Z% d% G/ b                {# ~+ p$ p- i: H% q. q3 |1 d5 X& j
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!9 V3 x' r9 q) K3 T( N* h' s$ @6 c# _
                    continue;
% v0 _9 X; `1 L9 M                }+ c6 ?( Y; Q4 s
                else7 L% j4 \0 c  O' \7 F
                {
' Q! n  Q4 Y; _5 l8 V$ S8 j                    if (numw[i] != 0)
6 r9 s% |5 Z! [% B; M                    {; b& \( ~, u% ^% b8 Z& s
                        i++;
' g  M3 G/ {$ k& Q                        k++;2 q. L7 H+ f- O# f  Z
                        if (k == n)+ g( E2 l5 j8 g% g" X1 I
                        {8 A9 A& Q( L. b# I4 }2 g7 D5 U
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
, P# W) j( h/ T+ F                            k = 0;2 q, Y0 z7 P% P" N; X3 v7 k
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
2 F8 a1 K9 k1 V                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);5 V$ V( O3 v- R
                        }
2 K) B" A# u# ]- v2 d                        else//输出暂时还没有改变数组元素的值
' w4 R8 L0 I4 \+ t7 O/ ^1 r                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
. ?7 f# Y; X% T* v                    }
* q0 o8 g# B' q6 I9 l4 n: }0 p                    else
3 X+ G& f0 u( x) z# h7 T7 u                        i++;//数组元素为0,直接跳过,不计数。。。' c% [5 h$ {* A3 }3 ~! Q: k
                }9 I( W, n% \8 h% `/ s

6 _/ B- ?* Z% {9 n5 M' u& l' z. {9 {1 G5 J5 H3 V
            }//结束while循环
0 e' p+ S' |# k. h/ T8 ?8 C            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
" h+ ?$ s; |8 z" ]  [, x2 K5 x3 l           * I- u  C6 H# l; `
                if (numw[i] != 0)
7 [2 Z" |  m* f7 y                    Console.WriteLine(numw[i]);+ B' u% t$ s; t8 K1 b0 m  ~8 G% A
           
( q7 w9 g% A: _  Z8 W% X* D: q; [            Console.ReadLine();  M4 d/ S+ X7 @! v+ v4 u
        }
# l( ^- t* y6 A    }
5 W% F7 U! h/ j$ @" W}) V+ `% R; A3 o1 u- C, l4 n+ F
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 1 踩 0

使用道具 举报

发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

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

GMT+8, 2026-11-5 14:53

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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