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

猴子问题

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

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

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

×
大家好!
; D' l9 D. U5 e) @这几天我在忙着编一个问题,我用了一种方法编出来!
- v, l. K) |. Q但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!$ m  r4 m6 ^! \# w% R; ~1 v1 d0 _
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
! U  H& b' s  L) a0 N2 f2 y3 ]6 @/ D! N5 H3 T$ n( \$ G

: Q' V; `8 Z3 j, t# C
                            题目! |* Z6 i9 N# y, W" P& C' d
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
4 M2 f" E1 [) g. M6 W! L! q! ^" w第一种方法:利用循环链表6 I3 i6 |! q- n- I
#include<stdio.h># H9 p% v% B' q+ x& C6 z
#include<malloc.h>, g  R& x/ S: \. U& _- {; g& Z, _0 Y
#define M 8            //共有8只猴子, M" @% |, t2 E3 ?+ Q0 l6 X
#define N 3            //数到3只时退出第三只
8 m( e3 J- {4 w  Etypedef struct monkey
& s$ H! Z* z. T. C' Q1 ?. N{int number;( c7 ?, O" q$ y6 D- q
int flag;
+ z, U* l# L% ^/ H! z- X0 zstruct monkey* next;
# ^: ~( A7 q9 `}MONKEY;% L7 Q2 g6 w; j: C, R. @
main()
9 g" b- p" r' [) s- c{ MONKEY *head=NULL,*p,*s;
( V; E5 i3 m* m8 A  int i,sum=0,count=0;
1 c  X; j8 I1 x! ]  clrscr();              //清屏# W" J' P0 z3 B6 T3 L
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
) }# @+ f: Y  S& z, f4 c8 x# c  p->number=1;p->flag=1;9 a0 W: H# Y6 n7 e" z
  p->next=head;; q) D* ]& Q6 r! @* i
  head=p;' e8 B, P+ H5 B: l' L
  for(i=2;i<=M;i++)
7 k& n! x! i% v1 B& V% T    { s=(MONKEY *)malloc(sizeof(MONKEY));
6 |% z3 @, X7 g0 I+ a( V- y     s->number=i;s->flag=1;
/ F) w  |  a& D4 G: V' w% d     s->next=head;  n" ~1 p& l! @; m) ^8 {& _
     p->next=s;p=p->next;* w9 k+ i3 }- S4 @. e- c& e
    }
* q  l( X1 g: N- ?: G  W+ K    p=head;
/ ~$ z3 `9 L) g9 X+ _" d4 [# K1 p   for(;;)6 p" }9 c( `1 k; w2 Y( G
    {if(p->flag==1)
7 r2 A# N3 S, q! @       count++;& ~' S3 m9 v: W- I8 i/ k4 m' B: V( ~  ?
     if(count==N)
" c" f) P2 J" ~/ x  S* ?9 y) I        {p->flag=0;% J) [; |# a* U$ N5 k
         count=0;
4 y  k1 p' y& Y         sum++;}  T* ^/ n. g% c
     if(sum==M-1)
; i& {3 g/ Y$ q% ?' O$ N) X4 I. R# t        break;. P7 F: }, `- C9 u* L+ [- `
     p=p->next;
( {/ k* v; ?+ ?3 J8 v3 D6 |, p    }
# W( `- h$ V: \/ {' L    p=) t5 j- x& |- o  r+ A) j
    head;
$ V, ?) R% l8 f' {0 T. q7 b    for(i=1;i<=M;i++)
$ d* j6 f1 N7 m, w/ ?    { if(p->flag==1)
0 B+ N! }: S6 l4 ^8 K4 A        printf("\t%d",p->number);
# Z; M3 c* v( k' |5 c$ L- W      p=p->next;5 d" l5 _/ u5 r1 m, c
    }
8 M# I! z: s3 v3 H7 x% a8 ]
3 D: \% H3 A% B& I2 l
1 O/ E; R& q- O9 ~( |. W0 J& F" P, d0 D8 z$ H3 o
}

: ]8 a  d8 P6 G- j: g; }% C9 ^* c( J4 c第二种方法:数组
7 M" A' D3 d  D6 s' R2 z#include<stdio.h>; ~# K2 V5 x  e
#define M 8
2 y+ C4 [6 U  @struct monkey- j$ J7 J, _% v9 _3 S2 B
{int number;
" u( n" s! ^: g# r! n& [int nextp;# A" X3 D+ P( I9 l
}link[M+1];; m9 {0 K% i7 _  a
& ~9 l% Y; ^2 J( R9 d6 a
void main()8 O2 H  U6 ?/ B0 o6 Y  Y# j' [- ^
{int i,count,h;
0 u. I) U, w9 o. s$ ^. A" ]- ifor(i=1;i<=M;i++)9 \4 J! t* {$ \( Q2 K
{  if(i==M)) s# i% Y, S+ d
   link.nextp=1;
) O# f& n+ E1 M: i: e   else
5 e- e$ y9 Y3 H6 F   link.nextp=i+1;" O% R- X, |. }9 Q$ k3 H
  link.number=i;" C; |( @1 n! _  c' D2 U
}
1 A8 q6 H) C$ A" e8 t/ Rprintf("\n");
8 R7 H% B8 b3 e5 Mcount=0;9 F0 ?7 x$ L, g, b% e! E
h=M;
, {9 o+ x0 g" S8 e. _, Vprintf("依次退出的猴子: \n");
& i9 V1 P: u5 N4 B3 Twhile(count<M-1)
; k! ], Y  s# Y" {( c$ U2 B{i=0;
/ y0 K0 o5 X; e( s  ]0 ]+ \7 Ewhile(i!=3)1 f, _1 j& _9 }$ l6 B1 Q- j. P% s( P; I
{ h=link[h].nextp;# {6 ?4 C) S1 F: Y2 v* I
   if(link[h].number)
% w- D& \- S6 p$ W) b* _     i++;}0 ~1 T0 N0 \! @) ^0 W

5 E+ c' b1 x" S: N1 a4 uprintf("%4d",link[h].number);
/ b- i* f8 C, H2 n0 }+ @" m# Hlink[h].number=0;
) c4 K" v2 q" s- t" c" y& b% l: d, lcount++;& B. z1 |# w2 k
}
$ n1 q4 S2 S4 L- g
; L; [6 V; j% G& Tprintf("\n大王是:");
) u4 ?8 i) I9 y. j  for(i=1;i<=M;i++)
( B) q' b( s4 R  if(link.number)8 Z9 R! b7 P9 h- L
    printf("%3d\n",link.number);
  U9 s: s! E: D
+ Q$ L3 P" w8 H- x1 s: q( a$ N) N5 M! e: B+ D& ^3 H
}
' F! F% W0 n0 v/ [+ s
第三种是普通方法for循环
, r1 L. F1 T6 s6 Q* a" [
#include<stdio.h>( k& Q4 q6 P0 i
void main()
6 y4 w  `0 V2 c( n# Q# u{ int i,k,m,n,num[50],q,*p;0 A% S' S9 J" a: @. I. I5 t
    clrscr();/ k' P$ m  P! z& h( ]
   printf("input number of person: n=");6 z1 i% G# b& M! N- ^
    scanf("%d",&n);
0 v/ V/ v0 }- j8 D* iprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
- x9 \& f  u( N4 l+ @( M. e" g    scanf("%d",&q);" R. v" N  c2 Z& Q' `( h4 ]
   p=num;9 j# i2 k0 s% g: [
  for(i=0;i<n;i++)
( [* O3 j8 U; f$ i    *(p+i)=i+1;# P7 k" {. J7 G
   i=0;
6 r& x7 W5 m! U3 x; G3 ^) q$ r) y   k=0;
8 T7 C* A. E# i( L  x   m=0;1 R1 ~0 U( e! t* e1 f0 O- B( L
  while(m<n-1)
. \+ D) x2 k7 a   {if(*(p+i)!=0) k++;
2 e1 X. v$ h* a1 A# k9 j6 a9 r     if(k==q)3 D/ d4 g0 x; r/ e8 r
      { *(p+i)=0;
1 ^& P" u0 [, s( Y        k=0;$ u. E* ]0 W+ _' `3 y1 X6 o
        m++;2 B' ^0 Q$ L) T/ N+ q
      }
! w+ D5 h- d- _& H    i++;( B, F. [2 D& @2 U
    if(i==n)i=0;
9 |; ]# _! B8 ^: t# s9 l   }
0 m4 V% |1 t/ \8 y! Z  while(*p==0)p++;
+ p. z+ ~( x! r    printf("The last one is NO:%d\n",*p);
" _( o& f- m9 _9 M     getch();
: _2 S5 g) K$ J- V) U% A! z
! a& B3 k9 [/ c' [. }( D% c}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;; `7 C4 d) m, S3 ^" U, {. U
namespace 又费马达又费电
4 \" M. T* S! U+ v$ n; c0 _{; H7 o! B) U4 p7 `* H; P8 E
    class Program7 y6 F# k, k4 k; w5 l7 z1 r
    {1 M& X5 g6 P  k! k2 _
        static void Main(string[] args)% e# [% A0 d$ u3 S8 e. K9 [
        {6 f9 J- H& l) e: e9 f5 X
            int m, n;7 n' I* J5 A; I
            Console.WriteLine("请输入数组长度");9 i- s( o& _7 h/ k9 ?
            m = int.Parse(Console.ReadLine());//m为数组的大小1 Q1 ]" \# I2 z; w" @0 ]7 V
            Console.WriteLine("请输入要截取数字的大小");) h, a( q( T. k. a- X7 @
            n = int.Parse(Console.ReadLine());9 V8 V7 Q8 E) s* i
            int [] numw=new int
+ y: t. ^& V4 n$ c) i
3 D0 s, ^+ [# _0 O# |&shy;&shy;&shy;;' m+ @0 ^% n& K, \+ B. [
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
5 b9 V2 Y4 s4 L& d" z, X            {
. h6 ^, P. u2 q                numw[j - 1] = j;
- E0 D9 {8 k6 O! v3 J4 _            }
) ~3 }5 J. T) `) G2 r* _) d. r            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
1 G+ x4 t, p8 f  T0 e            while (d != m - 1)
- y; h0 K: F$ M. O            {
+ a' e/ v0 u9 G1 ^0 a                if (i == m && d != m - 1)& _& \5 l$ K4 v3 C0 ?$ @# u4 w
                {; M5 `" M9 g3 ]9 L; V; f* O
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!6 E8 J* V8 V' B
                    continue;
5 p2 p5 k; o+ K1 \4 t3 V                }+ x$ ~  [' V- }; v
                else
' U$ K* Y, n( Q" f) ]( g8 T* q                {
4 X2 D4 O' e& ]( V& {1 Z7 f' Z                    if (numw[i] != 0)
* n" m! V5 G$ M6 o5 r1 L0 F; M                    {$ N, a6 C: s" v7 V
                        i++;( h+ I$ {! `9 r" l2 o3 k# D1 @! y' d
                        k++;
- i) A2 m  H  W9 t% [' s                        if (k == n)
+ G7 U, I' u! T, i/ N# Z                        {
1 R& G( ?) D7 k9 _                            numw[i - 1] = 0;//把在n位置数组元素的值改变了% o9 P. f# v8 ^8 k5 @: w) f
                            k = 0;; x- ~0 c" s4 B) y3 e; i$ a
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小13 _6 f+ y4 r8 C6 b
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
/ y* }$ N3 e. S* f                        }8 E0 O4 ^- b2 b" R( P
                        else//输出暂时还没有改变数组元素的值
6 }+ M1 L9 F; o                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
3 u+ W3 S2 s* K- r+ r/ f5 U                    }  \$ O1 ^0 l7 ~: c. B) P
                    else9 [/ s+ P* z. E
                        i++;//数组元素为0,直接跳过,不计数。。。
# r# \% h' W6 c6 E: t                }. {; [, O6 T6 s/ v5 l% K" [
( N* D! H7 ^' B) j: P
8 n* S+ E3 L) I7 p3 L3 p/ |3 a
            }//结束while循环" Q# }( r1 Y  [) Q/ Z" C
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦5 Z+ ]1 n" j3 O  U# \
           & v4 J) z& V# b% R& t( i
                if (numw[i] != 0), z4 R) B) U- _* I- l
                    Console.WriteLine(numw[i]);
5 F, \# |5 `8 r5 X8 e/ X           1 c6 }  ]. o$ J, Q7 i9 N
            Console.ReadLine();
6 n( ^( p# r( R- i  e        }
, U6 {5 L; J: P, `5 a- A    }
! K* D4 t! o1 P1 }- S5 }, G0 p, U}
" Z+ w! t+ f; T/ s' 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-8 07:54

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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