鱼C论坛

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

猴子问题

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

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

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

x
大家好!5 b! a9 A! _8 o5 c
这几天我在忙着编一个问题,我用了一种方法编出来!
; B5 i) e( z: ^* y$ f但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
/ F# x. K+ [) @# w% v; T注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 4 l) t; B- k7 e! H; ]  _4 i. Z4 m

' i3 {$ l% [" {; \# {# v- ]
: _( [7 K& A# v  O. p  L) k+ `
                            题目, S0 v# W8 @7 f
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。1 \: X- k' e' k% z4 R5 U
第一种方法:利用循环链表
& e/ t" L8 C0 E; a  x( Y#include<stdio.h>
; X' H' b1 z  X& a#include<malloc.h>
9 n& S* @* P8 q& Z, [1 w$ x1 x#define M 8            //共有8只猴子: t: y# N% l# d
#define N 3            //数到3只时退出第三只
: _8 ^( K7 O: P5 R. V7 otypedef struct monkey- f6 f+ s' z+ P5 Y$ F; Q
{int number;, Q0 b* A) v4 a; z( f1 I; Q
int flag;
- Z% r& R+ E9 M6 `( V: Y3 Jstruct monkey* next;
& Q0 R; X" l1 T5 l# v4 _}MONKEY;4 `; d( h) M* Y( `! ]
main()9 j) X$ o/ `+ M1 B+ U: {1 B" X
{ MONKEY *head=NULL,*p,*s;# D: R9 f% [9 C+ u5 [
  int i,sum=0,count=0;
2 x% j6 I3 I% I  Z) C  clrscr();              //清屏
3 I! ]! x7 k7 q; r! v  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
5 g1 H( ]8 G( `& [" P4 j' E+ v, m  p->number=1;p->flag=1;
) U2 {, E0 J; |+ }' f  p->next=head;, P0 _; E4 L; Z. D- l# ?
  head=p;# y! s& ]  b! i/ s3 ^8 K
  for(i=2;i<=M;i++)8 Q. y- ]1 `- \0 M7 V
    { s=(MONKEY *)malloc(sizeof(MONKEY));
$ e7 G8 B# ~" _     s->number=i;s->flag=1;
' T6 z3 E. v- \0 ]" f4 O     s->next=head;& \  \" F" I4 v6 b
     p->next=s;p=p->next;
. S* |, s% ~9 F; ~. c# o    }: u3 K9 F  t: s) B& f+ `
    p=head;
* t$ s- d1 J* g  T9 C2 {: a   for(;;)3 |9 ], E0 N+ }$ v$ r7 e
    {if(p->flag==1)
0 x6 G$ O1 o: V$ w5 H0 k* H* q       count++;
& D9 M9 T  k: ]& a( T  H# J     if(count==N)* F9 l% ^& B7 b$ G
        {p->flag=0;2 t2 e- L: r1 h- k9 F
         count=0;
9 [* Z8 U' a5 q8 l' Q; x         sum++;}  y% `7 I* j0 `7 S
     if(sum==M-1)  y+ ~& W: {. }( i' u% t
        break;9 Y4 r' Y  ~6 c1 c2 R- L- M  w
     p=p->next;9 x/ D* s3 C6 |3 C8 W6 n9 u: `0 x5 @
    }& s6 ]# C* V$ U8 H* |& ?
    p=4 [6 k+ |( I0 w% k5 ]- P; U  G2 Y
    head;
7 r! B/ q" B4 @, _5 e    for(i=1;i<=M;i++)0 w3 \3 r% T- S) n( @
    { if(p->flag==1)
; O9 v5 }2 U; y  B5 d1 G7 Y        printf("\t%d",p->number);* c8 }0 D  t0 d  O' ?5 \3 Y8 I
      p=p->next;
4 V4 G2 v: R9 e5 Z1 d$ H! V    }( n7 L+ J( _, L7 M( c

) f! S: \0 B, q3 B% N; r8 x- l+ M2 M8 ]6 M! {' W5 y5 r2 @* k! b# x# C6 d! y

; R8 J( y# e# P. b}

6 K/ @0 e) u( O, Q第二种方法:数组
8 d3 w! s0 j/ O& n#include<stdio.h>; _" x) }% H5 C
#define M 8/ r. Z0 i9 d1 k
struct monkey
. g7 v7 O9 w' ~/ w( @{int number;; N& R. b- F) U* g$ K; |# z
int nextp;
5 x6 B& K# r8 P! Q( I6 H4 s}link[M+1];
# T6 D1 B0 e' T7 z
. J* O! L: _' a4 d: C' i8 Yvoid main()# D$ d5 ?3 E0 U: K; P0 I. p3 {
{int i,count,h;
) M5 u6 u+ W  R: w8 Jfor(i=1;i<=M;i++)
+ y1 C" k9 y" a: _( [- M' `- _: Y' l{  if(i==M)
- M# A8 ~- Z  Q! J0 w   link[i].nextp=1;
6 U# T7 Q' @1 ^$ f+ J7 }; }   else
. B" ~9 J( M* W- Q4 r% f( B1 H1 B   link[i].nextp=i+1;6 d$ u+ h6 |* U* e+ d8 t+ l; I
  link[i].number=i;
4 A4 N9 J1 N( t/ S# }- o4 b}
+ B, \7 q# M: m4 aprintf("\n");
* g$ \' b, x6 Ucount=0;: V) q; [( m- `3 h: p3 v
h=M;
; j0 y' i4 ?$ _printf("依次退出的猴子: \n");( Z0 p2 l/ S1 k7 |- _6 D& |
while(count<M-1)6 e! i, t2 r+ z& v: [
{i=0;
1 C4 I! j* R1 ]6 l6 U5 o- kwhile(i!=3)5 ~, ^* L& K5 K1 O" b+ t+ F
{ h=link[h].nextp;
- R& k) C$ X0 x: `7 `4 \! n   if(link[h].number)) y% h- O$ S# a
     i++;}
1 k2 x9 G" F9 r. ?- Y3 _( U! I, {. w
' }% ^. k& A! v  L6 D: n5 u- xprintf("%4d",link[h].number);
$ `, Y; o% B/ t7 ~' tlink[h].number=0;
; p4 z# U+ c( n4 g" I( D+ |count++;
8 J4 q4 T5 q) l* N' C}7 a! N4 l& J% e4 b: E8 D
- E% t' n- Q  h; z2 X* d1 s6 T
printf("\n大王是:");, H) x% q5 I2 q3 A% P: b0 b! v
  for(i=1;i<=M;i++)
6 }4 @  A; r8 e  if(link[i].number)
0 J* i  n* P. l$ Y* c  G) R    printf("%3d\n",link[i].number);% z' D* E( M# K
* z* G8 d( s4 j

- n' Q5 B, `* D& U}
) d- F3 E$ d/ i- r; ]
第三种是普通方法for循环

% ~; O: \* F: q+ ?( L% A#include<stdio.h>
; r+ M3 o- J- d; l5 X' A" pvoid main()
7 Z9 \1 F" w+ V, f# F{ int i,k,m,n,num[50],q,*p;
' `1 M: m- Z9 m+ n    clrscr();2 J( H0 H, K) Y
   printf("input number of person: n=");
9 p$ e" D9 x& Y6 G    scanf("%d",&n);
% f7 ^! T  b, |printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
& R4 A& ]2 r+ f) C% j8 D$ O. w/ K4 y    scanf("%d",&q);4 K" G4 b0 i3 V- {$ }: v
   p=num;
4 s" G, V7 I4 L) w  for(i=0;i<n;i++)& x& K' m4 Q; Q  \% @
    *(p+i)=i+1;2 V* z5 ~5 `) r) z  ^  Z8 g% ]
   i=0;4 \/ A3 p8 |- J& d
   k=0;
; A% Z9 \9 X+ O  b   m=0;
$ r8 l) g. C% V' P( [+ B  while(m<n-1)0 I8 e$ f& l" l  _7 u7 ^
   {if(*(p+i)!=0) k++;2 J! [% H9 E8 f' |) v+ H3 }
     if(k==q)0 u1 `8 ]- k0 `
      { *(p+i)=0;
' a( C# I* w" S: Y* J0 u        k=0;* p1 q; [& v  h, P  d
        m++;3 A5 D5 `; y+ s9 O' W
      }
! F# o, L! _1 `7 D    i++;
( C9 W$ T  e5 p; i- Z    if(i==n)i=0;
) _/ L. I) _/ y. `; s   }+ o$ l0 n4 _+ X: {! r
  while(*p==0)p++;: f8 e5 D8 y3 X2 \# a
    printf("The last one is NO:%d\n",*p);
4 U% ]9 g5 E# k4 T) N; d+ Y, ~     getch();6 {$ T( k6 _9 D' S

) ~1 G& a, z' y" l9 J}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
- ^8 o* P7 U) E' _; O. G# g) tnamespace 又费马达又费电# z3 E$ i( d/ j  E8 z$ x
{0 W8 |/ _! D2 h% y
    class Program' `" ?% |0 L0 x: u! c
    {+ Z+ F4 _6 V+ v( _$ ~
        static void Main(string[] args)6 S8 S# D( f6 U6 l" u% X% w
        {/ d* h: ?8 L( w  i& s& ~: r
            int m, n;% G% x$ b% Y! G$ S. X/ S) Q4 }
            Console.WriteLine("请输入数组长度");
5 q! O- I% h9 {; C            m = int.Parse(Console.ReadLine());//m为数组的大小
" b/ i# F+ X1 R            Console.WriteLine("请输入要截取数字的大小");
% d8 X' y  N) t1 u' ?) g0 K            n = int.Parse(Console.ReadLine());
! ~2 A$ w0 L# M4 C, _0 X            int [] numw=new int
9 S+ v, d" @/ I3 d8 `1 u: e( W: L6 k* u4 B
&shy;&shy;&shy;;7 L7 r  p0 i" S3 }$ H9 ?: `
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数) J  S+ s6 a- y: Y+ W
            {) q2 p  ]2 ^3 N$ T  S% b- C# f
                numw[j - 1] = j;
% w' h" y+ K. w. d! _4 M! ~            }
& r- B# |+ P' T            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!5 `2 q* H0 B9 t
            while (d != m - 1)0 J% r- k4 }( ]# {+ K6 ?$ g
            {
5 r0 Z! M7 r6 S7 F7 P                if (i == m && d != m - 1)
: L; T9 i5 z8 w                {
+ b. [- q& D- D                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
2 G8 t5 s; r) ~) k                    continue;6 u+ {# j5 C! W; k' M- y% g2 |
                }: L3 i0 C1 ^( R9 \. D. x8 a: b- ]0 {
                else2 M! |" q! w/ G) U- B5 c
                {
# B& ~6 s  K) A* P                    if (numw[i] != 0)! V# Z, ]4 d6 n  M+ U, ]
                    {6 n0 L# g0 g" n2 }- F8 S- E
                        i++;
3 ~! e  T9 W% D- N/ D2 a                        k++;6 _( W! s1 V1 V" F) c: n. |, T- C! X
                        if (k == n)1 ?5 X' h4 V4 {) {6 m1 \* R! p
                        {
' o- W0 x+ B' p3 D% C. n0 S                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
+ Z6 o( u$ _) g- D/ _6 k! H( }                            k = 0;
) E" N1 _" ]* ]( T              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
9 q1 M  L1 R8 p. Z' d: p                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);7 P- E6 g9 G3 A+ ~
                        }
' _& N) A+ Y$ J) Q+ J- ~0 R+ n                        else//输出暂时还没有改变数组元素的值: W! G; H0 B. x' w* p/ i1 x$ ]
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);; z+ u) K/ H& w$ D; O2 I
                    }
6 p( ^% F3 [' e8 S                    else
) f5 A4 G* D" [/ F1 c/ F  @                        i++;//数组元素为0,直接跳过,不计数。。。6 d) {9 I+ Q. z
                }: }, J7 R* K% y  C/ w8 c

2 D* r# p$ N: x- z; w: M7 I; G/ q0 ~& C' Y8 R! I
            }//结束while循环  L7 L. R$ R( N
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
8 Z9 s* e. z0 V8 o1 @# r! t8 Z           
2 b" Q6 f' q$ x1 i, `6 h                if (numw[i] != 0)! X8 I0 y  R  b5 F* y! i
                    Console.WriteLine(numw[i]);
( c+ x- ^! T% y5 U! H           + [. {  U6 e7 X7 L0 k
            Console.ReadLine();
" w% M, Y# X; ?# r$ e  r        }) Y* T, b4 v! M' B8 s
    }
# c5 x% a( p& i6 d  A3 h) x}: \; g  ^' v9 o0 Y! k
小甲鱼最新课程 -> 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-3-28 04:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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