鱼C论坛

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

猴子问题

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

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

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

x
大家好!
8 y# u; C+ j: Q( d这几天我在忙着编一个问题,我用了一种方法编出来!
5 ?) q+ E+ ^3 [* N但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
* k/ x# P2 G" g% @$ ]" N! b注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
5 }4 g9 V6 o% u# I( x
5 a" _# B* V3 e2 M; a8 g0 @) N; L# s) W1 {3 J
                            题目: T" \8 ~3 F- K" S) J- E! W7 x
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
9 K) \; V+ s4 F4 U8 t! O2 H第一种方法:利用循环链表7 |1 ]& V/ B. \- u
#include<stdio.h>
; B; `/ {& B! ]/ P4 G#include<malloc.h>
) ]" [$ c2 ?) e! n% q0 Z( M$ O#define M 8            //共有8只猴子6 T( {( A, q% |: c- g: U7 B
#define N 3            //数到3只时退出第三只$ E9 z+ T) m$ D  R
typedef struct monkey6 \7 Q1 r6 m8 d: }  c0 g
{int number;5 ?3 {. h7 r+ H- ]% G' D
int flag;. h7 S/ H+ p+ P6 l7 g; d) W
struct monkey* next;' T/ D; T$ }" G+ T4 c( X
}MONKEY;
  U$ ~( R  I9 bmain()
7 N9 z& @+ a3 {! ^. n; q{ MONKEY *head=NULL,*p,*s;+ b) }6 s: X: W- |/ |0 ~
  int i,sum=0,count=0;
8 d! \) Y. d: [. p  v6 T  clrscr();              //清屏+ w$ H/ J" i& s5 C% q5 m
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存4 l7 a5 u$ I' q+ [/ o; y- v+ p
  p->number=1;p->flag=1;$ |$ R) z' O3 ?8 A
  p->next=head;
$ W# m+ e% B; S, L, e0 p  head=p;4 }4 l0 f. r* k- v
  for(i=2;i<=M;i++)
1 K$ j5 E( \# c# c    { s=(MONKEY *)malloc(sizeof(MONKEY));& `+ I) x, k1 m# G; c, t4 I
     s->number=i;s->flag=1;
4 A! [* E1 f* F  p, K- J/ C5 ~" C     s->next=head;
; k* W) y/ ]2 |2 M% r: r     p->next=s;p=p->next;
: Z6 I% ^' E5 B" B- t    }4 k2 `. r. Q- M2 X3 e9 r2 `
    p=head;# X! I2 \+ x$ a
   for(;;)' k) S9 z; F, _0 ^+ D
    {if(p->flag==1)2 _. Z# I5 a4 _
       count++;
+ J% t5 H" {& |4 Q3 ~; ^0 P1 {! m     if(count==N)0 n$ f. H8 W+ L) w4 _
        {p->flag=0;
( P; h; A! |  K6 d         count=0;5 i  q' D# O! u- G: N
         sum++;}! E% n$ H- ?) }0 \* [2 Q4 E
     if(sum==M-1)
0 @$ E) t) Q" r# \        break;
! w- Q/ E5 ^0 l. U2 v% l3 h     p=p->next;) q0 l5 Y* J7 c' \' ?) O& D
    }% `) W4 j! z. Y( k# C# U
    p=
) r/ K  @" P3 ^9 s1 B4 v) E    head;  j, n/ H- H1 z
    for(i=1;i<=M;i++)4 [& t0 G, m5 }% x/ Y
    { if(p->flag==1)1 i; B3 a, Y  _( N
        printf("\t%d",p->number);
. y) t) P- X  J/ j      p=p->next;, Y' z2 z8 V9 D7 X
    }% `3 d2 n% o2 m- i" [/ L$ X$ D

6 i! b, G9 M2 `/ g8 `: @- o+ }* e6 Z: G
5 w# F: d  o, ]/ Q) S3 [" D! x7 u2 R4 m7 s; q
}
# d. u  Q8 l  g/ ]
第二种方法:数组
) }3 b- ]) O5 V( s1 r& n#include<stdio.h>0 S' l& \$ o$ ?9 M- `; O5 H# _
#define M 8
' Y* S# z: _0 Rstruct monkey
+ h& j0 ^- ~  R. B{int number;
" [+ J# m+ P7 A5 B* tint nextp;
( n2 f4 F* m3 N2 ~/ a4 l}link[M+1];
! w0 N! ^6 ]  ]2 j3 D+ z- r" h) G8 W- o/ I
void main()
6 T" J8 u# |% v& m! }+ |{int i,count,h;2 e, [9 N# D$ d( G
for(i=1;i<=M;i++)- z% S# \6 [5 z4 h7 E5 _/ F1 k4 q) S
{  if(i==M)! v# t4 D5 U- S2 _' x
   link[i].nextp=1;
( t; N; S2 [' ?" n; s# F- y   else' A2 U, E$ ^, E
   link[i].nextp=i+1;
  i2 V! F/ l$ o0 B  link[i].number=i;
, D" N' p9 C) m: b5 o% U# L5 j}
1 p/ p( m* K6 h' k1 c) [( pprintf("\n");
3 N& C; ]8 E# d6 q) Ucount=0;
) N; i2 M  q! z4 q) [h=M;
/ r0 ]. U) A9 `# J- W. q5 Q1 c. Qprintf("依次退出的猴子: \n");
- I! k1 l4 Q. W+ j1 |while(count<M-1)
7 ~$ d( {$ D0 I# A: ^, `{i=0;
8 l0 d( I* ^; S4 `0 awhile(i!=3)6 l! ]' T" n8 x* Y) H5 R
{ h=link[h].nextp;
+ G4 @/ n+ I5 a   if(link[h].number)
9 e: `/ ?' b  S  X' D     i++;}
. z1 A0 b% w7 j& R) H1 O5 m. g/ ~8 Z1 @* J% M. x& _0 R. _. e
printf("%4d",link[h].number);
9 A. F& q% j9 g1 I! M6 F% q3 F" Ylink[h].number=0;
, t; v3 }% _& N  ^count++;6 E1 y  _- z8 C' u! b
}4 L: C  A- o% N% M* `, H

0 {! g2 i+ ^7 M/ n3 O- d- O( Wprintf("\n大王是:");
# `: J" f9 ^8 a0 c5 v  for(i=1;i<=M;i++)
3 Q" ~2 F: Y: _- [2 ^" R+ A! j2 U  if(link[i].number)
" U+ q4 i3 b$ R) N    printf("%3d\n",link[i].number);8 X& q  @2 f" y, Y8 [) \
% h. W% w+ v3 X6 h1 Y! g1 G

' J' h' Q& q, `* n( x- {7 r}
" p! V9 E# ^, T0 b1 {( T1 F* N7 R
第三种是普通方法for循环
# _6 E: k5 S& {% @
#include<stdio.h>2 t* q1 S0 y: t/ m  |
void main()+ ^- l* q) ~! N! Z4 S3 U0 a* p. L( y
{ int i,k,m,n,num[50],q,*p;
* V' [$ L! V. Z1 \1 Y    clrscr();3 h- Q' F8 I6 x0 p4 X1 K
   printf("input number of person: n=");% R' a* s% S6 w# N8 @2 G
    scanf("%d",&n);
6 ]* [* L. `6 F& ]$ d6 \printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只: e+ r: K0 J. y2 t* ^
    scanf("%d",&q);5 b! |# s- _' T# \
   p=num;
  F* f) C" `. W! D5 x  for(i=0;i<n;i++)& K  ?$ ~+ w5 S6 P" V" _
    *(p+i)=i+1;
6 L! a# N! f2 c  M6 X   i=0;1 V1 K' O4 e! X# ^& Y
   k=0;
$ M2 n" g' @& R* N: p( W4 ^( f   m=0;* M3 }4 h' g4 _' L3 A2 O; i4 a, D
  while(m<n-1)  Y% [- O0 Z+ s
   {if(*(p+i)!=0) k++;% e. B" [: L  G" J, f
     if(k==q)
+ {1 ]0 L; q( j9 |) G& X      { *(p+i)=0;1 P  p  N; G) J
        k=0;
5 D& R; E, G" N- d1 B        m++;4 J! }9 I( s' ~6 P* W
      }5 ^$ |7 P  J+ G7 O% \( E
    i++;
& X0 i2 v% F' I0 y: Z$ a: u: ~    if(i==n)i=0;
% \. ~9 C4 J/ R) @   }( T' W& b, c. ]- w! B5 n
  while(*p==0)p++;
" _4 y; B- @8 z" c* H! J& D    printf("The last one is NO:%d\n",*p);6 s# v; _6 G9 M, p' Y9 j- }
     getch();
& I+ \% s" n' S9 X1 }( w( t
( Z/ X% S; Y. [7 y" I}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;: N4 c( }1 D3 U* ^8 E
namespace 又费马达又费电
* f* a0 t, o, s( c8 Z9 v2 \3 t6 q3 l{
/ M6 ]: ~. E2 O! U! N' U    class Program
$ n3 t# j/ U% r1 j    {1 y5 m' r9 p/ R
        static void Main(string[] args)4 g+ u2 Q3 W- K0 g: [9 b
        {* M2 V  C( G  p6 H2 [% J3 R
            int m, n;
/ z2 j0 n# e* @" ^$ q. I9 E# ~8 f            Console.WriteLine("请输入数组长度");. ~  F$ J: f3 T9 s0 n' L6 E  ^
            m = int.Parse(Console.ReadLine());//m为数组的大小
/ y3 ~- ~( P4 E) S' g! L% O            Console.WriteLine("请输入要截取数字的大小");
$ [3 O; V# t( [  f! `            n = int.Parse(Console.ReadLine());% D8 J5 B$ W. p
            int [] numw=new int
* f" c8 ]" u! K( C
9 A* H( p" V1 ?&shy;&shy;&shy;;
7 S0 ~; A  J- h0 B, }            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
8 U9 @9 n/ t  r            {" |- z& c+ T7 D+ D$ G/ r/ F
                numw[j - 1] = j;/ ]2 `0 E) D, P% O  p6 y
            }8 x5 P" F% ~' Q/ ]. a" ~% p3 D" `# t- I
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
' {7 y  @  ?7 P" c( r, p& q9 ~  Z            while (d != m - 1)
& f8 m( ^. w& d( u  u9 j            {
& w0 K+ x  z2 V  _                if (i == m && d != m - 1)
$ s3 q5 ^3 F- i9 ?                {
, ]6 d3 d6 C- k, f; u3 C' m  X% c  K                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
/ y6 m6 K+ r1 d                    continue;
5 A5 F4 i$ N) d/ a( i                }
, z3 |6 S, B* B& C2 N; R                else
' b- O& _6 {8 f0 C2 g                {
" p! M+ N% h/ k                    if (numw[i] != 0)' @* v* z, c5 l) T3 k! [" K
                    {5 z4 f9 |: p" g( _. T' @* H
                        i++;
7 h, w; o, k0 U* Q3 g# I/ C- L                        k++;$ H5 o: H) x1 O* c! j- W1 N
                        if (k == n)$ j$ J! X+ V) C! {$ q! ?) d. C
                        {
. ]: y' g- \2 T, e/ d2 y' q                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
( t" x) G9 |/ Q( h* @                            k = 0;
& J1 J. V- C' _: E: x. I# z- B2 ?! Q              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小15 `" f: Z5 _/ ^( l2 \
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
8 D7 v0 {: k" r                        }& ]% `* H) J# U, W# ?5 S" k
                        else//输出暂时还没有改变数组元素的值9 F$ Y% h. T, J6 t2 H% g
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
% R9 z3 L1 ~+ V                    }
# A' s( @! u# R& `9 s# C6 `" a                    else
1 A1 X+ ^$ _: U3 Q6 ]                        i++;//数组元素为0,直接跳过,不计数。。。- n6 a1 G7 Z& T: M) F
                }- X6 F1 W, ?" S8 d2 v! B, R- d

9 M* _( m- Y* C0 I$ W2 O+ z. E1 t* ], H
            }//结束while循环7 ?$ I3 G+ [* W# v' ?. p
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
9 z6 J: w4 f8 X& X* g' E           # K) o3 I, b4 r" d
                if (numw[i] != 0)# I6 a* ]) `% H% k2 {
                    Console.WriteLine(numw[i]);) e% u+ [. ?  e3 I, }9 l+ A
           
% a+ Y# o, h+ o# g" ^9 }            Console.ReadLine();: r8 i( {& o& |/ p( V% d
        }
6 Y0 s/ @# _- O/ d$ `. s    }  {( C3 L( b8 Q) K* P# r
}
7 D& U5 M. A9 q
小甲鱼最新课程 -> 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, 2025-12-18 21:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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