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

猴子问题

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

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

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

×
大家好!
: D& ?" M$ t- t0 _这几天我在忙着编一个问题,我用了一种方法编出来!' `. z' T' B3 C' m( s6 O
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!2 q- p# V5 Q+ H- G
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
1 R* g* n% s% [. ?1 f% }
1 r3 F2 u" }; }' J* L+ I! P# t& G' V$ f
                            题目
1 z; [" h& P4 c2 S0 C# H# n! U山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
" C) ^6 B. S, O8 X6 s8 a5 {! \& P第一种方法:利用循环链表, S" C/ N0 x' E, T0 f
#include<stdio.h>
. S; G) @& ~& Q5 l5 F#include<malloc.h>
. ?8 e" r+ l/ c( R" Z- s#define M 8            //共有8只猴子
6 L" Y2 [6 [% h4 z#define N 3            //数到3只时退出第三只
& u! e- `. ]! @0 p4 w: ~9 C. N$ ^typedef struct monkey
4 c+ z0 a6 M; A7 z8 L( e% N  e( \{int number;
+ Y: Y* ~0 W; k$ nint flag;
6 t% h3 r) O1 P2 ystruct monkey* next;
( ^" f, R, [$ i! O}MONKEY;
: ?6 g. V& I& p- l0 d8 Q5 bmain()
3 V% u/ Q) y: q{ MONKEY *head=NULL,*p,*s;
! |$ Y( z& [7 G3 ?  int i,sum=0,count=0;
5 m: i5 O! k6 P7 H" G  clrscr();              //清屏
/ E* W8 t0 W. G  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
* W5 D1 j1 h9 h- ^% w3 s% F  p->number=1;p->flag=1;
: u) A7 b6 m, E  V  p->next=head;
" Q& O6 Y: K1 Q, t2 Z3 t% K  head=p;5 ~$ n) E1 N+ r: }9 L1 S
  for(i=2;i<=M;i++)
# t8 o' A7 Z9 R    { s=(MONKEY *)malloc(sizeof(MONKEY));$ K9 m! @8 f% K* E% ~
     s->number=i;s->flag=1;
) ]( P+ d, l% l0 ]; H     s->next=head;7 J7 @. \3 U- X3 z4 r4 T
     p->next=s;p=p->next;
- U( L* F# a; n    }. \' Q0 I8 w1 h
    p=head;4 x. f5 [, n7 F$ b9 {( E. B# T8 t
   for(;;)# e7 e2 s: o% ~3 |6 r5 V* `
    {if(p->flag==1)0 H# F, G& F6 ?$ g
       count++;/ I5 A) A. q! f3 i# w% e
     if(count==N); R/ X7 K4 f+ f/ e8 ^
        {p->flag=0;
# v, @% X; c  ], D  Y; \5 @         count=0;- K& r7 R% O9 y
         sum++;}
4 N: w) \* f4 Z8 T& t2 K$ p' \- i     if(sum==M-1)" T: ]- k/ i! P0 \3 T
        break;
# ?- C+ @+ P1 M# s% G9 g# N     p=p->next;
& A  q4 O! w5 x. N* ]! r    }
* {1 ^5 T6 U2 Y* K& \    p=$ D9 o, }( ?& G8 W0 I! D3 T
    head;, l3 w2 }! R  C0 g
    for(i=1;i<=M;i++)7 V2 `, i: c  I3 j
    { if(p->flag==1)# @! p) l. `/ k- G
        printf("\t%d",p->number);4 T& r' _$ _$ l9 O! ]! j
      p=p->next;, C; b" ?; E" }: R* b
    }+ e; {" j$ m" M2 H# I
4 }" y1 Y; P/ R) Q( Y
& }+ ]* C# T( _3 l0 |; A; r
3 |: w" D$ g1 {5 o3 _$ `6 z
}

2 @, x/ b0 {. @第二种方法:数组- O! i6 a% t4 c2 B8 V. B. X; p9 {
#include<stdio.h>; V0 o0 u* B  I, ^. }! \# I
#define M 8# N: i! S5 s' W
struct monkey
3 f$ |9 ?0 F. q+ j, R{int number;1 C! j# B9 T! T
int nextp;7 q* [( U1 ^8 g- D
}link[M+1];
4 {/ V& a7 q2 x. W, E9 }1 P" J( K- n6 J+ d# C( K
void main()* ^( T+ V, n+ a1 N8 p9 V' E
{int i,count,h;
! c" m* [8 W/ z# ]: u1 T( Pfor(i=1;i<=M;i++)
  ^  f* ]% B0 k7 E% ]" X, Z' ^+ [: N! O{  if(i==M)
# i+ N5 T; O; C& Z( H9 y   link.nextp=1;
, @/ c$ I- k* j  X8 u8 `   else
: g3 [3 N5 n  I7 V3 g* h   link.nextp=i+1;
' h. R" g6 m2 R$ @* f; {' |  link.number=i;
. T. ^3 Y0 ~5 Y% k+ R/ m}1 F& m. Z" n$ b: [$ @; d
printf("\n");) t8 `+ h. {; ]; e2 _* m
count=0;
& e) K. p1 N9 a5 Z0 Y# sh=M;0 [" ?1 t* E6 G8 i
printf("依次退出的猴子: \n");
; g0 X6 l# x! W% z/ N  Ewhile(count<M-1)
# w7 x0 E# y% W{i=0;1 H2 {5 W" t0 A1 [7 ^$ o1 R3 ^
while(i!=3)
+ F: y) U7 |: ~) G{ h=link[h].nextp;
3 G0 h7 `$ K/ v   if(link[h].number)  d0 V' }7 C* D' W! \7 @: f
     i++;}
  ]. i/ w, y+ A6 c) P# c, Q, `# z/ _% p: J# L
printf("%4d",link[h].number);
6 t- K. `9 H) j6 F2 {  J6 S2 dlink[h].number=0;
$ ]+ v! I' j* u, i/ Lcount++;
/ k, V4 C7 P7 X3 T% \+ G) A}) r3 u" R  K9 }+ L8 q$ W; F; r/ J
0 f5 `, G, Z1 [
printf("\n大王是:");
9 m" ~  n5 m$ J3 J. e/ F+ M# o  for(i=1;i<=M;i++)7 M3 x% }! |( m$ d' i
  if(link.number)
$ k5 I* A7 m  D3 ~' Y+ `    printf("%3d\n",link.number);2 v* G8 U! d  A7 c

; D; s) ]' U" e' E8 t- f& e* q& D" k9 T
}
' G; R& G% g% P( Y2 l$ g
第三种是普通方法for循环
7 p$ z; g0 N3 D* ~* h7 o* H# v
#include<stdio.h>
" q  n$ l. ~3 R7 \8 l6 y: pvoid main()3 `3 |1 X! Q; M1 ^$ v" u+ w
{ int i,k,m,n,num[50],q,*p;" k8 v' I2 ?9 \- P
    clrscr();
  B  l0 n2 Q, @+ Q% e! y, i   printf("input number of person: n=");
; v9 g9 n" C# r' L7 V4 J% @9 D    scanf("%d",&n);
7 T- Z# ]9 x. S; t6 n5 Oprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只/ }* x3 O1 n6 j" V2 b/ [
    scanf("%d",&q);/ B) f& w) y1 }9 u" R
   p=num;3 ], K% _" I' K- J
  for(i=0;i<n;i++)8 H5 F( K) W/ t
    *(p+i)=i+1;$ d4 c( ~2 w8 h- A8 x. w
   i=0;: }  O! Q" b3 Z# N" ?2 E
   k=0;
% x+ f, o% c$ Y, Q   m=0;
) {$ f" j; O3 k0 \  while(m<n-1)
" }2 C# g7 K+ q' _7 I  J3 A, q   {if(*(p+i)!=0) k++;
0 U1 V! e* T# B; P: W8 K6 |     if(k==q)
$ i* c& c3 @3 D1 b- D& L* I" ?* g      { *(p+i)=0;, F  M. v' v# I. r9 J. p
        k=0;
4 q5 D$ G2 q, q. s: s: N7 \3 ~4 l4 t6 f        m++;1 P  w- T4 k+ h7 T. l! c
      }8 P* q% ?" u' D
    i++;+ h& X  o6 k& c( {, c8 S
    if(i==n)i=0;
& @: G3 s9 [9 f0 k   }
- Y" @3 g; V& v+ b2 d9 l* Z  while(*p==0)p++;, ~) d. H9 [( J& h9 T4 d' ^
    printf("The last one is NO:%d\n",*p);
" ?8 J3 ~: A0 m2 n; ^3 n( q     getch();% p& k) F% m% `9 X5 T
( G# n! o1 i5 K4 E% E# W
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;* _% z) J0 I# W
namespace 又费马达又费电  F; Z: y$ Q: s
{8 f9 I2 y3 X$ c9 ^: v9 E
    class Program
* Q) H7 O; b+ f( L. u, ]! B! R    {
% n7 ^7 i$ t4 y2 P) j8 M        static void Main(string[] args)
+ J1 F; q$ w+ J7 I1 h2 j# k        {3 e8 [" `+ _0 X9 z
            int m, n;
  @9 A; ^. a9 W% Z# J            Console.WriteLine("请输入数组长度");
2 W+ p" b3 a( v: a( j            m = int.Parse(Console.ReadLine());//m为数组的大小
. a; B: l5 n  O8 K            Console.WriteLine("请输入要截取数字的大小");
' P! C# S- x9 M9 U# {% p            n = int.Parse(Console.ReadLine());. I' S7 e( C+ v
            int [] numw=new int- v9 D, m' @4 n; N# Q2 o9 `" n: n

2 M0 w7 E4 }$ M/ {0 s' b/ F&shy;&shy;&shy;;
) B# e% B0 b, I+ A3 x1 _            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
# G* ]6 F/ ]0 `  Q: L* _5 c            {
2 d" C5 d/ i8 l) r/ f1 @3 A8 \                numw[j - 1] = j;
/ j8 ]2 l; ]/ x            }
9 Q# t" O  u0 f+ B5 c            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
. V! c6 B% Z" k            while (d != m - 1)" i: ?0 b, L  Z/ l2 E
            {. H+ i( D% l; P8 u
                if (i == m && d != m - 1)$ D. I1 Q# G( [2 v
                {+ N+ m: S# A" E4 ~
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!1 L' l, A) b3 f4 m
                    continue;
1 t) O" @* |+ I4 N                }
! J0 Y5 H6 |, ^$ I9 V3 E                else1 [- Q. {- s" A! p8 c
                {
4 y; C" o% f1 y                    if (numw[i] != 0)" P" S0 o% F2 |* H9 T+ s
                    {
. ~( ]/ J" o' M' U8 c2 W                        i++;
% w" b  w' ?( M/ h9 l/ }8 D                        k++;! h, k  F5 J; }+ u1 W
                        if (k == n)1 d5 E" o. w9 k- E* E# i
                        {
9 {  e/ B) }2 I  e4 Q0 }* v9 n                            numw[i - 1] = 0;//把在n位置数组元素的值改变了" `" v2 P; ?3 L) p1 B
                            k = 0;
" N: h: z& I6 h5 Z: W6 X  E* l              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
( x( u6 K6 p; N+ D- Z% U                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);1 ~7 e4 }+ A7 c% v
                        }
  D- [0 F2 q4 S# @$ Y                        else//输出暂时还没有改变数组元素的值
1 S- f* A; \# ~6 C" J- s# q                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);, M, Y& @' C! G% K/ G5 q, H
                    }4 Y/ d4 n9 L$ d* w& A! A
                    else. H9 c3 ~& B; ^; h' X1 m  b' m
                        i++;//数组元素为0,直接跳过,不计数。。。1 U3 y/ e# w  m6 H+ s
                }
, _* s) _/ F2 V( n( E) H
# q5 L% z- P/ Q* L3 S
, c5 n2 O& q% m  a3 W* r& `            }//结束while循环
) W! ?: ~7 V  R9 J. V! R            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦7 R5 |' x5 r  a0 ^) m' ^) h9 @) c
           - E* @! j/ T3 \/ B* n, B, ^
                if (numw[i] != 0)
$ v( d2 a9 z0 @8 Q: R! M1 s; X% r3 H                    Console.WriteLine(numw[i]);$ Z" L: m2 T8 C( U
           
% T1 O; O+ n1 }/ R' C9 d! a            Console.ReadLine();" z' r6 ^( M) Z+ K1 i4 z- |8 z
        }: u: P+ F! Q: A$ T$ t$ ~" x
    }
. }- m* X  G  M1 S6 b}
" w9 f. R1 f1 B% r2 K8 t$ Q
小甲鱼最新课程 -> 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-15 09:40

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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