鱼C论坛

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

猴子问题

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

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

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

x
大家好!
  J; X+ _# T  H. U  V' ?这几天我在忙着编一个问题,我用了一种方法编出来!( [; X& V, \- {7 r
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!0 }0 U, n6 `0 X3 R8 R$ W# B
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
  ~4 e: V, ]# q9 S+ i
$ s) M" ]3 \( [# V( Q$ g, `9 J$ ~, R0 a/ _0 X+ \
                            题目4 y! F/ a; f6 ^2 Z/ P
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
# e& N0 U) p/ A8 y# T% l+ R1 V第一种方法:利用循环链表
8 |) S5 C  q/ F( @5 p. @: R; I( z8 n  {#include<stdio.h>5 K7 m$ h. a% _) A
#include<malloc.h>
  \: }# }5 E1 P, ^1 b9 q7 f) ]/ @#define M 8            //共有8只猴子
. T$ q# A5 x/ l% N9 [  ^7 M#define N 3            //数到3只时退出第三只
+ ]! w1 _/ h2 C: Stypedef struct monkey% E! Q+ k7 Y" ]% S! N
{int number;% I0 P% L  n% E1 z. ]* W
int flag;8 l, f' m+ O2 Q. s+ n  r2 W6 v8 C7 }
struct monkey* next;0 |% s$ J+ f' Z% u8 k; `* ?5 L8 W
}MONKEY;$ _' O/ f. ~! P1 e$ b2 K( P
main()
; B- g4 j, v3 }/ O{ MONKEY *head=NULL,*p,*s;& ^. c4 ~. M1 h; `% O
  int i,sum=0,count=0;
. `7 Q/ J$ s, [* B6 O  clrscr();              //清屏% _' x' ]- N7 x
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
3 s! h2 U# r2 k1 f0 J  p->number=1;p->flag=1;
  e; `; u. {: C: ]4 X5 e  p->next=head;
2 Y! g) ^1 R# {" V  U- H  head=p;8 ^: k$ W+ J& j
  for(i=2;i<=M;i++)" D2 K) B) N5 V0 r( ]3 L: [) V( g
    { s=(MONKEY *)malloc(sizeof(MONKEY));
6 x4 ?; |8 L6 g' [6 w     s->number=i;s->flag=1;
; |, S6 l) [& t; }, t3 w+ z7 \) q/ p     s->next=head;  ]* p9 `! i$ i! e) ~8 B
     p->next=s;p=p->next;
3 P) V7 @5 s. f2 P$ R* c    }
2 j1 H: ~2 Y3 l! |3 C  R    p=head;: P+ o: M6 d& o6 ?% ?# X6 g
   for(;;)2 ?1 p- c3 ^6 a, a/ X: m1 ?: z7 O8 L
    {if(p->flag==1)
+ L) A: b' o/ Y9 b1 h0 X( m; l       count++;
4 i  O$ x" F, i& Z3 Q     if(count==N)) Q5 K: Q# M/ k' E
        {p->flag=0;
- e' }9 v- n! \& D- N         count=0;0 E. D- u3 v  x! y, p7 V. g
         sum++;}/ l6 f5 k& |; i. P. g+ c& ?
     if(sum==M-1), i# f5 `3 M+ w+ Y' j- ~
        break;
% [# J) {, S3 ]" K& L: x     p=p->next;
, |$ b" G0 J3 W3 l! }7 _2 g* |    }9 _$ \% ~- B; M4 J$ B4 G
    p=' X0 @' U, f( d3 f
    head;
$ Q  v) i2 V. R    for(i=1;i<=M;i++)
& T2 _' }$ j  f' r- ~, y7 @    { if(p->flag==1)
' D+ C, O9 [1 l% i0 o        printf("\t%d",p->number);& u( t/ W  ^" r3 \! D/ p* u4 c6 e+ |
      p=p->next;( b0 u0 Y; v5 j& l: u5 Z& I
    }
  {  k% ]: e# G7 r  q6 o+ N2 ]) Q! b0 z) S/ g5 ?
6 ]6 f' a3 y0 a, ]

: p( M  a1 E* U) W. F4 _9 X}
% A7 s( i$ i, e5 C0 c
第二种方法:数组
4 J" @3 g2 T* R7 T#include<stdio.h>+ U# _" }* A8 j! Y' J, `
#define M 8
" G8 x" }9 H) r+ n) F6 G! \struct monkey, z  t8 k  p: q
{int number;$ C* \( _& f. x" \& c7 q* W( P
int nextp;0 a: J- n& D- x
}link[M+1];1 C$ @9 H7 l5 s% t
# [) i& j1 I; o6 F+ c- ^* s) k, _
void main()2 I; c* w3 j* p7 D  A. E
{int i,count,h;
" X& E/ T9 X/ j) Y2 y" ~2 _6 m3 C( P( qfor(i=1;i<=M;i++)% Q4 u5 Q5 z" |8 v' S
{  if(i==M)! q; S( y9 C* F/ F. G, i
   link[i].nextp=1;
8 _1 G. v8 |# c5 m  v7 D1 u   else
' r  B2 z  @$ g5 m3 ~# G   link[i].nextp=i+1;
/ y( l( b3 N2 b* K& z4 e9 I  link[i].number=i;: _/ Z2 U) y+ ]3 H! a4 g
}2 L$ _) O* A3 z! w2 B
printf("\n");% W$ Y! k/ ]6 o4 u1 u
count=0;
8 H+ c  D, W' b) ]5 C0 E) s0 gh=M;5 U8 _5 @  K0 X9 u" J8 d& H6 u2 C
printf("依次退出的猴子: \n");
6 B  v9 z4 c( D  c# ^! ~. cwhile(count<M-1)5 Q( [8 r( x& t7 p1 L: O
{i=0;1 G  k/ {  j' l1 K3 v( J3 M
while(i!=3)
: M5 `9 T# h4 _3 z0 n{ h=link[h].nextp;
4 m: Y' [8 T! ]3 d. o4 a) a   if(link[h].number)5 f) w$ F8 u! W  ]; J$ E' t$ a
     i++;}
$ a6 c& K4 t4 U0 I, e9 S( x- ^1 ?, G6 V1 k0 v
printf("%4d",link[h].number);
' s( t2 f( n1 r6 t. A/ Mlink[h].number=0;" b/ r" M6 V' N+ ^% n
count++;# K& V: o$ l3 g4 o+ \8 X
}9 E: B# w% h, ]/ I6 k

, Q8 O! c. F9 Eprintf("\n大王是:");
, f# M% P2 ?( z: @  for(i=1;i<=M;i++)$ |  c" J1 N3 D! o. n- t3 y
  if(link[i].number)
; q* q+ O. W8 l0 `* a8 O3 [    printf("%3d\n",link[i].number);
# l# U6 S% {6 ?3 u9 `2 F( T, D: C8 q; E
8 Z9 c) `( U% x2 H6 q; W* l6 |
}
' n9 i0 ?+ }) k! B3 T5 F
第三种是普通方法for循环

* h! Y+ e' g) Z/ p#include<stdio.h>
3 Y. I0 }- ]2 H/ T9 C( Vvoid main()+ B: D1 G  f: S' a. c3 y4 ~
{ int i,k,m,n,num[50],q,*p;1 w. ~. K2 C1 K+ |
    clrscr();
! G7 m# l; D* e; V& t8 r   printf("input number of person: n=");' W* L3 p  g( s# C' f1 R$ p
    scanf("%d",&n);+ N& G3 u  U) L: {8 P
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只( _" \5 S- X# R/ e$ X. T/ ?% m
    scanf("%d",&q);
* w2 B! x$ V6 O  K: W4 e) Y   p=num;5 _. N" j( A- H% t3 k3 h
  for(i=0;i<n;i++)
# I' o+ t/ C6 z/ B' {    *(p+i)=i+1;, z, `7 q) ?. U! g% |' Y# ^
   i=0;
: c3 H% d6 i6 l   k=0;) o5 @8 A0 V1 O
   m=0;0 U% n+ X+ e0 G/ Y: r+ D
  while(m<n-1)+ _, J3 Q; t2 i3 A# ?# C$ b2 H
   {if(*(p+i)!=0) k++;
; {6 c/ ^9 B/ q, B     if(k==q)
5 }; ?) g" u' R      { *(p+i)=0;
% i8 {  b- K1 u( F* M/ \        k=0;4 U! P8 P4 m- @$ C
        m++;! l, p1 f& c1 x' v, k; E+ \
      }
6 a: F5 Q# p$ i+ `    i++;: s3 G3 p; M% A( @
    if(i==n)i=0;
4 O1 z9 b# V: r   }
4 ?* X3 L6 a6 h: h3 p: H  while(*p==0)p++;0 e  s6 f+ W2 I. `
    printf("The last one is NO:%d\n",*p);( \5 Q/ k' K& p8 ]* G
     getch();
8 w$ j; W6 U8 Y4 r& n6 K; b) r& O8 W% L" Y, d( A0 k0 @
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
7 _+ P& y1 W) I5 Vnamespace 又费马达又费电
( G$ R2 i6 ?1 f0 q3 {$ |' X8 P{1 n5 ?% z2 e7 c8 k6 m4 r; \
    class Program. A. d) l) e: X& w  @
    {+ o; J/ Y+ v4 ?
        static void Main(string[] args)
9 ~! h: [1 z) I% U0 Z/ h5 H) @        {5 @; k1 a/ V  I2 s. ^. ?
            int m, n;3 R1 a9 Y- ?! i5 a; G8 n6 g- s0 p
            Console.WriteLine("请输入数组长度");
4 G! O5 }" f, o- _, P            m = int.Parse(Console.ReadLine());//m为数组的大小5 L9 ?! _+ W9 y" `4 d
            Console.WriteLine("请输入要截取数字的大小");, w3 L5 X' f5 l7 x4 P
            n = int.Parse(Console.ReadLine());8 C4 `, s8 l% u/ t5 m
            int [] numw=new int$ L9 B, @0 O2 ?5 z/ |6 R

0 f# g/ P7 G; F+ P, k&shy;&shy;&shy;;7 p& P9 A2 w; S& V7 _3 |* M
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数. {& B2 L! ]+ p+ H. y9 T4 {
            {2 E4 G: n0 n2 Y, v) s! d
                numw[j - 1] = j;7 K' k6 m# F- K- z0 M* ^4 z" C
            }- R  D% ~3 }, I) U+ k) K
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!# F2 `4 G0 [1 e3 k6 c5 S  a
            while (d != m - 1)& N6 E2 x6 F* m. M
            {
! C$ k7 r  L& [5 k7 F                if (i == m && d != m - 1)8 W1 k1 X( J/ k7 B
                {
. Q% @* {* M/ `1 E: ?9 G/ H                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!- [8 m+ F; W5 [
                    continue;* P8 I9 ~$ f; J. I+ l- I
                }
" o- Z5 ^5 D5 A' P" P/ q1 b! ^                else
/ b5 l- C1 h" x+ j+ N                {
; d% T& `  T/ \2 N9 i$ L7 \                    if (numw[i] != 0)
1 f( L& T* i% S' u0 K' p; H                    {+ t2 N5 q+ Y: ^; |. w9 x4 ^2 o  S$ U
                        i++;; t/ t8 u! }$ M5 D
                        k++;& P* a1 e, c" O7 O; k# h$ F
                        if (k == n)2 C, U2 C+ R* _- p! O* K0 i
                        {
; m0 ~! D; ~9 T1 P5 |# Q8 s: r' S+ w                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
. S) C5 Q* C2 S+ A5 P" [  x5 L/ t                            k = 0;& M' E0 M! S/ J8 j
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
' x0 ]+ a+ n0 y" G3 `1 X2 H2 ]" g                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);9 Z# i8 A) \1 \. i/ r) x* ]
                        }) Q  n/ n) b6 N9 `* |
                        else//输出暂时还没有改变数组元素的值
) s+ v$ @$ r6 [7 e& B/ e7 g                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);8 S' Q, F. [+ {3 p1 W3 A6 H+ K. e
                    }8 I. Z, A; i# v1 ]
                    else7 X0 R2 |* E9 P3 p# X; {9 ~
                        i++;//数组元素为0,直接跳过,不计数。。。
, Q# S# V4 l5 \- l/ ]. n                }
4 C" o" W. }5 q; R
" I$ [# u7 T) G; p6 o" o( W4 e" H3 Q4 q" ?0 I" a" S
            }//结束while循环8 E  m5 H0 |6 Q' F+ N
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦, n! P" _' Z1 A9 y
           * }  m) C7 ?" L0 I, `
                if (numw[i] != 0)
3 I: A( \& C4 ?3 V" D                    Console.WriteLine(numw[i]);5 x% G# ^! A* C( P1 X9 X
             D2 S, R/ Y" e0 I8 n
            Console.ReadLine();
4 d- b+ r0 T' f2 Z. b/ Y) V1 k        }
" G4 {9 I( @( k' p0 O* L* g    }
$ |  T- _8 K% z}
* u- O9 g8 S+ ]+ N4 L+ S
小甲鱼最新课程 -> 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-1-11 06:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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