鱼C论坛

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

猴子问题

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

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

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

x
大家好!2 s9 R% |: a1 m+ n
这几天我在忙着编一个问题,我用了一种方法编出来!( k1 p/ M1 X. o! o3 O
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!1 U/ F' S1 N: d2 F2 x' d7 i
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
5 j$ L( D% t) u4 l) L6 Y- f
# p; c0 c( h! y8 e0 }! _$ l
( m( l, A2 ^0 o/ T' ?
                            题目& D$ _+ l+ n( e  D" ?" s
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
  `; D( F( d. J- x" U  o& i/ r9 `第一种方法:利用循环链表
7 m+ c, I, y' {, E& v1 Y#include<stdio.h>: \' w; W4 c0 [/ |( U
#include<malloc.h>
+ z, I) A+ Q4 Z& m#define M 8            //共有8只猴子
+ r' C& g- V4 q4 E4 W* C#define N 3            //数到3只时退出第三只' r* k' G4 }  U+ u
typedef struct monkey  o# t! _, e2 Y! u( R- g
{int number;
5 L6 S4 e6 C: L4 H, y. K  d; O1 Qint flag;
& T- W" [: R# F5 S3 o8 k) _struct monkey* next;  l4 U2 X3 c  t4 ]1 m9 z
}MONKEY;
1 g& R) h7 X6 P1 |) fmain()
+ C0 A9 d+ Z" Y+ e: S{ MONKEY *head=NULL,*p,*s;
7 T# Y' p4 |6 t: I  int i,sum=0,count=0;
) C/ G( B4 E5 x' |7 g+ J4 C  clrscr();              //清屏
' D+ k$ r" q& }6 m$ f  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存$ [; g+ u* ~4 W; J0 f% u5 l9 z
  p->number=1;p->flag=1;
: d7 K6 n  I- O* d9 Q% j  p->next=head;
2 V2 N( N1 o4 T; L  head=p;
6 m+ e5 ?, E. O& c/ z. u% s& C  for(i=2;i<=M;i++)
- j7 }- s: G) g. p- v6 N/ ^    { s=(MONKEY *)malloc(sizeof(MONKEY));
* g$ k1 @$ Q8 ~! B. C+ q" Y     s->number=i;s->flag=1;
2 I& b& X4 x$ n: M  D5 C2 [     s->next=head;
/ k8 W7 s3 [2 T, g- B9 m     p->next=s;p=p->next;+ |: Z( E: u( a. L; L9 O
    }% x4 r0 C: h0 _! E9 x
    p=head;1 s. D0 w; ^8 F6 E; R4 G5 O
   for(;;)4 ~- j( M9 c* r" s4 E1 B& }- }: {
    {if(p->flag==1)
& S! q8 \3 C* A; E+ c% b       count++;" l3 i1 i3 h7 i
     if(count==N)1 J; n2 V& u3 D6 _
        {p->flag=0;
, x( v: n6 N7 t/ P! `( E( Q         count=0;
* y! z9 c. F; y  t, S         sum++;}
% s4 @1 H7 R" S# S     if(sum==M-1)5 M) {1 ]9 J3 w
        break;4 z, B* d* L. P! \: F& |8 V
     p=p->next;
/ P+ N: R. \3 F) K" Z; |  W" H    }
/ o$ H. c, {: E  [( ?' i    p=
% R# L. u) @( J    head;  L. ~9 b3 _2 s5 P# |2 e
    for(i=1;i<=M;i++)
6 T5 t  u. g7 L) d& v    { if(p->flag==1)! s/ L7 _: _# i0 {
        printf("\t%d",p->number);* t5 I' e/ {' b: k7 a: S$ K
      p=p->next;% o" B! ^9 `- i! s
    }2 r. }# n: i5 L( H, h. b

% l5 W; M% u! B: ^0 T# Y1 l  Q$ ]0 }  f% J
2 P" ?7 K( c' z3 ~0 Q1 t( @* g
}

) P, Q; g# p( y4 ^; T& `第二种方法:数组
% g) q' E& ~9 R; p8 J1 k. O#include<stdio.h>! u/ S) v! j+ L: O$ v  w+ i, O
#define M 8
7 f. y7 Y5 V- b. K" O& `2 Kstruct monkey' d( O6 A2 l1 S+ O! H
{int number;
2 T2 h% j' a' n; y+ D- Vint nextp;7 _; P, n1 c% W- ]( m& C; F1 V
}link[M+1];* ~0 H3 t( A2 p) L2 A2 D8 a

9 I+ {$ V) l( b; Q. a% ?3 Rvoid main()
: X4 T6 h6 S# m+ t1 U7 f) f{int i,count,h;
8 ]* W" D- ]5 c; S' Q7 J+ dfor(i=1;i<=M;i++), t8 {$ S4 O0 {6 R
{  if(i==M)( ]4 S- S" K0 n$ ]- X
   link[i].nextp=1;
5 Z3 y: o  [* E2 w& r: x5 i7 d5 A   else9 ?) u1 W# y6 U  [0 t* A
   link[i].nextp=i+1;5 P+ z" {6 E! o# s# F7 \+ x4 ^9 G
  link[i].number=i;+ F' s& h! U, C, d; L  v, @
}6 ?$ k& d6 E" j) s! `/ m! g) _6 t
printf("\n");
: {. v; G# p8 qcount=0;1 f3 p" p- B2 T0 ]
h=M;
/ |9 U& X( u+ u* L2 W  _printf("依次退出的猴子: \n");8 }1 g3 X/ X& Q' s5 ^4 f7 [
while(count<M-1)8 n/ e" Z( N& ?3 |0 I6 f3 S! R% _
{i=0;4 e6 V- f* w! e( g0 `
while(i!=3)
8 O& F3 C& W" K7 t$ S9 b{ h=link[h].nextp;
7 y& e6 j% N4 O, [7 p* l2 l   if(link[h].number)" U# b0 K! a1 y# q5 z  H9 A$ F
     i++;}
2 u. p, b' P0 ?7 F2 O4 B7 }' u
  Z4 d7 b5 B8 rprintf("%4d",link[h].number);! B7 A8 ]1 }7 D4 a5 B9 v5 i9 s
link[h].number=0;( D4 V6 q. i3 M4 E  m  y
count++;
7 K  H4 x: s" L/ a}
; f9 [: c) D5 {; r" q1 r% A$ j4 j2 r
printf("\n大王是:");
) U! ]* w6 G' H/ c& i4 j% A" d7 F( b  for(i=1;i<=M;i++)
8 I! p% D" f; `" U4 L$ e  if(link[i].number)) V5 ~3 k( B! }- y- u
    printf("%3d\n",link[i].number);
+ ^. f8 J! J  G9 x1 w" p0 u- w. {1 ]
5 R* f$ |8 ?# F* g6 X* [
}
. _# E  {6 m0 T* r' }
第三种是普通方法for循环

, m1 \- z/ I$ H4 R#include<stdio.h>
0 t6 h: Q  D0 V, ~void main(). e* t" K/ l2 T, u& O. t
{ int i,k,m,n,num[50],q,*p;
- Y5 `0 A. ?1 u" O% t. H7 M    clrscr();
4 V/ w) I; f3 {, U$ ^   printf("input number of person: n=");6 j- S( g- ?1 w: v- g5 y7 y
    scanf("%d",&n);
) [; Z6 a, W0 a$ R0 R- sprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
: T$ T$ m4 _0 S) z6 f    scanf("%d",&q);
$ x5 U8 x0 u1 N- a  G) l; S/ k8 o8 \   p=num;/ o' Z8 ~1 P, ?4 ^
  for(i=0;i<n;i++)$ m% M! E, S- k/ T
    *(p+i)=i+1;
( Q5 N  W8 S- @: O& P  ^7 j   i=0;
& H0 h- q% f  t' \/ \   k=0;0 s, ^7 S5 C8 {1 ]
   m=0;
0 T7 O/ }$ D; d+ ?  while(m<n-1)8 R4 U2 A) y4 e, S$ p4 |
   {if(*(p+i)!=0) k++;
' c! Q6 j4 O; x- s     if(k==q)
' K* X4 Z5 x( P+ ?; F. B' j+ x      { *(p+i)=0;
4 D% h8 Y6 V; S0 j7 E! Z0 Y& F" Q+ Y        k=0;; C8 B! n; Y/ J0 Y7 |4 Z$ [" U. o
        m++;7 Z( L" n4 Q8 y& F
      }
) a7 e' @- Q6 r9 s    i++;. M8 \" _4 W, X) Y7 X
    if(i==n)i=0;
0 o% ?# P1 k( c   }
: f) ?9 l$ w, b  while(*p==0)p++;% N4 I1 I) L# g
    printf("The last one is NO:%d\n",*p);7 Z8 u6 e4 t, t& v; f/ i5 L9 ^6 U5 q
     getch();2 f3 k, ?+ _6 ]) `! g! B! n" i/ t

5 L; J, i$ x" c/ t7 w. R) L; h( n}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;/ d5 {5 X; p$ k  i4 j
namespace 又费马达又费电5 q$ w: r# R4 c7 p: M
{7 j; d  `, r/ y# ^0 q- u
    class Program
/ ~5 ~5 m* V  v. v# t1 k: r    {
; F  y) S2 u! `        static void Main(string[] args), q; g3 J" G- Z/ S, f
        {
2 r6 M% W+ B# Z( T3 W            int m, n;
9 I7 l" Y0 @1 c% P            Console.WriteLine("请输入数组长度");1 P! Z* N1 d( n* g+ k2 k8 E% {
            m = int.Parse(Console.ReadLine());//m为数组的大小4 J) @; \- G" w+ |0 i* Z! j
            Console.WriteLine("请输入要截取数字的大小");6 F7 F% L( g1 h! n) T2 N+ O3 l+ `
            n = int.Parse(Console.ReadLine());
7 k1 k! ~& M. @5 |            int [] numw=new int' }. j3 n% L' ?+ J" ^4 T4 I+ f
$ t/ u1 i: F* V+ f
&shy;&shy;&shy;;& J0 u/ j; v3 V
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数8 z& X, q- J) V; e
            {2 J7 {0 ?' F: k# l
                numw[j - 1] = j;
, o$ J6 J4 {+ e# v; ~5 m            }
$ F0 e  u8 ^7 R$ t            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!# S( A! t! _3 J8 M; A; q
            while (d != m - 1)
# |6 D# I( Y) R: k" K. i            {0 X7 Z$ l8 ^) _. x
                if (i == m && d != m - 1)
9 L' S* B6 C. ^2 F                {
% T6 v5 ^3 P! _$ W; k2 ~6 t6 N                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
: l* M- j, o% U3 g                    continue;" A/ R8 y+ q8 r$ m' d0 ^( {
                }
3 t7 q- v7 `, ]* j0 R, N                else
8 ?, z- h; Z/ e/ P. P' V) q                {7 a; P* b" l2 z& s4 O
                    if (numw[i] != 0)
( s" I' u+ C5 I) U6 V4 q8 F                    {
# J7 Q" r7 k/ }                        i++;! _: N3 I  n9 N' ]" {9 R
                        k++;' G0 W% b2 i6 B0 o" `! _
                        if (k == n)/ A+ Z/ k$ p4 w
                        {
6 _/ G0 O# F; e) z; g( z2 r3 x% Y3 ]7 _                            numw[i - 1] = 0;//把在n位置数组元素的值改变了6 K: Z/ z8 X- B: c% I/ {
                            k = 0;7 D6 C2 L- `' C
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小14 t( g) x/ F' R5 v0 G
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
3 Z% P2 A  u5 L: B% c                        }9 k5 ^/ N% G4 O8 P. }# W5 E
                        else//输出暂时还没有改变数组元素的值, I! p8 D4 ?# l' X6 H1 X/ }
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);8 n& t$ Z! \# X
                    }5 I+ j8 }% O3 ^% g: d+ ~
                    else) z) K7 b. O, S
                        i++;//数组元素为0,直接跳过,不计数。。。
$ n$ r2 A. V! H' I                }: A$ f3 J' Y; l* y- B8 O- U; q
9 x0 R. @" T/ e" x4 q0 X1 i, p

* G5 B3 s8 }3 ]; W            }//结束while循环
- W9 l) ?" P8 [6 P6 U            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦( s+ h5 f; g1 o2 C
           ; }' p2 L: o' ?1 M8 ?8 W# Y
                if (numw[i] != 0)
$ k7 L1 R4 _$ E: k) }' u! M" u                    Console.WriteLine(numw[i]);3 v2 x) B% d! K: M
           2 C4 ]" O' x0 e& y, w( n& W
            Console.ReadLine();: v: o2 \/ d0 e  ]& o+ j/ w* R
        }
) P- j: A- c+ Z/ ?+ ^" g9 s    }
5 J9 ]; e5 d0 ~, o5 l) P+ f& K}, G7 P( p4 S. u, q+ \. c$ M' J0 y& u
小甲鱼最新课程 -> 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-10-11 10:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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