鱼C论坛

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

猴子问题

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

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

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

x
大家好!
& w& ?, K1 j# h; l这几天我在忙着编一个问题,我用了一种方法编出来!2 d; p) J% b4 X
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
3 Y' ?9 O# d, g( H) f注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
  q; |" h. u5 o; q. E, `4 P
/ p6 H2 p* l" i% H5 Y' D8 w2 H) A: ~
                            题目
  t- a; z$ [1 ?  J2 X0 b1 ^山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。; n) d& i3 Z& O& U
第一种方法:利用循环链表, Y! l& L- U' t9 Z5 a8 Q4 `+ s' E
#include<stdio.h>( t) w9 z, z& F" `
#include<malloc.h>
0 f  a7 |' _4 R8 U/ f* m0 n6 |#define M 8            //共有8只猴子% v# _  k1 P: ^1 n! [
#define N 3            //数到3只时退出第三只
3 n3 P# G( ]; u% x+ x7 _typedef struct monkey3 V- P. v& x) y& o" f
{int number;0 a/ {1 @& |7 B
int flag;
& I0 ~' T  a  g/ [, w* n9 p3 lstruct monkey* next;* l+ J+ \/ z( m
}MONKEY;) {: u- S( a' x; ?
main()2 t: c" {( t: y3 L' T3 ~+ `
{ MONKEY *head=NULL,*p,*s;2 o3 i9 [) H, x  L# `* J* p
  int i,sum=0,count=0;
) a: K5 G+ V2 K9 s' ?$ I% X! r  clrscr();              //清屏, ^/ Q3 V6 j2 z+ y/ P1 D
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存1 d  B) Z, g( y* `2 s% L# o
  p->number=1;p->flag=1;
* H. w% m1 J1 d  p->next=head;
- \" Q1 v, v% G3 g/ h  head=p;
1 J1 L2 L; C" M! `+ l5 T  for(i=2;i<=M;i++)4 e( Q( U% {8 t0 e! T0 X" l
    { s=(MONKEY *)malloc(sizeof(MONKEY));: {& w5 J/ ^  p% N5 O
     s->number=i;s->flag=1;
) X* l2 ^; s! v2 F     s->next=head;. F* I; W$ o/ h& z! B( v; q0 l
     p->next=s;p=p->next;
# T! _8 x( [; j/ S4 a    }
; m& t" r( y/ l# r9 S    p=head;' z8 ]2 S# Y: Z; M' m
   for(;;)
+ a( |2 ^% I2 I8 N# W  l5 ^  `    {if(p->flag==1)
2 h5 W! O* c9 p       count++;, F, j1 u9 f7 e& {0 Z
     if(count==N)" ^& ]* _) ~- ^: {* ?  Z. Y
        {p->flag=0;$ e' h& c6 k$ \0 s* w$ O
         count=0;% F2 x6 r, q" K
         sum++;}6 l( b5 a" w, n6 Y2 C1 s% L
     if(sum==M-1)
3 [) \# U, @, ?$ c        break;! O' o9 w' i' Y
     p=p->next;6 s, u& w, @& N( K. |3 R( _) V
    }
2 @9 ^5 x) e: E, w$ Q, v    p=
- d7 d4 s% o5 t6 p0 ?1 Z4 g4 B) H    head;
, f# c, n' n# e2 }5 P, D9 Q    for(i=1;i<=M;i++)1 b: C/ j: x' S/ `7 _
    { if(p->flag==1)) y6 s+ z4 L( ~* O5 S7 Y' x* W9 `
        printf("\t%d",p->number);
4 d# ~8 w" L  k' O. }      p=p->next;( X  q( n0 D/ u; x
    }
# P; k. T- i* o, ]- S+ q. B# w+ z: S( l* v$ o8 t

$ m# U' ?) `0 B! {8 q( F# z) J: I6 r3 |
}

# a1 Z, F  F/ R9 B7 r1 @7 L2 I/ V第二种方法:数组( Q& ~) w7 d% |
#include<stdio.h>) A. H: Q. N) ~1 z, s$ G- r
#define M 8! m8 ]! {6 M) N) Y. @
struct monkey% K. m9 r9 c% |% k  b
{int number;  |  i% n& r1 m$ _
int nextp;
: ^0 u- F) K. J5 K}link[M+1];
- e. a4 {4 f1 j; V" T% ^+ n
5 T% }: d% S8 a6 R  p* X, rvoid main()+ `- T# d$ G% a6 N: ]  ~/ i2 L! R2 ]( J- m
{int i,count,h;
; P1 ^  L' h% F) c" @4 y" ufor(i=1;i<=M;i++)3 g; |" S. p- \7 X
{  if(i==M)
. ^5 G4 y/ n4 f   link[i].nextp=1;0 J) e$ v- _$ q9 m1 v" H
   else( n) T3 K& f& ?% a% e8 \' F
   link[i].nextp=i+1;, D/ r/ w: c# x, u  D
  link[i].number=i;# i9 Z( J/ n5 B: v) C' A
}
! G  b. U1 }  q8 iprintf("\n");
7 s0 L$ b$ i! u1 R. Ocount=0;1 I0 W3 o" X+ z' A
h=M;! w1 L* B( f& s) X
printf("依次退出的猴子: \n");
/ D3 M7 ~& q# m5 z% B0 awhile(count<M-1)
' y6 ~3 U) T6 G9 _; ^{i=0;
6 P+ f% d4 a, s( |while(i!=3)
6 X" q% s$ {; h& x. K. ?6 ~4 ?{ h=link[h].nextp;; E9 \' [2 h# e( C$ @
   if(link[h].number)
6 v" _: n5 j! R! b) n     i++;}+ \, @( X9 R- r% o& _7 N2 T
& L6 j0 L: C# Q; V8 a8 I2 A
printf("%4d",link[h].number);3 ^4 K% h8 T, t& ]% Q3 _
link[h].number=0;  Y4 q! o0 D- I3 w( p# m: ]
count++;
+ u  a9 A4 [) @# A$ i}2 S4 {) g6 g% d) l: _8 Z% R7 @. O

# b: R" \# l, D" I. V) dprintf("\n大王是:");  X" B, H% d. ?' f" p& q$ u8 a8 |
  for(i=1;i<=M;i++)
& O* k* [8 o" y$ r  ^  if(link[i].number)
, s8 w. m$ [" D/ V. j! K9 x, W: M7 [    printf("%3d\n",link[i].number);
( A8 n  d5 t$ Y; ~8 W5 K( D7 n; c5 w( b
# H7 Q5 h% l. @
}
3 B" O3 H4 C9 S
第三种是普通方法for循环

! s% T8 W6 i1 k' |3 d#include<stdio.h>2 g! h3 h% C3 x
void main()
/ u5 }# k/ M* }+ \{ int i,k,m,n,num[50],q,*p;6 b5 I! h: c/ L
    clrscr();' _- l! w% [1 v
   printf("input number of person: n=");0 Y0 K/ q! S: T; `/ U! p
    scanf("%d",&n);' G; y" m* r, }  K
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
9 w( n+ g% b) _    scanf("%d",&q);* i/ N! Q: ?7 x# t. W* p% q1 L
   p=num;
8 R7 s7 X9 _# W# O4 {5 d  for(i=0;i<n;i++)* V* |0 E% d7 j
    *(p+i)=i+1;( K3 ~6 \9 K5 F3 ~% l1 c
   i=0;' ^& P* a: o/ d* r1 B
   k=0;+ ~6 l7 N- Z2 _# H) J: S& e
   m=0;
! }2 q! `# A4 B5 g% Q6 T. s  while(m<n-1)
! e" Z* b5 f5 Y2 v6 O3 ^   {if(*(p+i)!=0) k++;
5 L8 i$ I" n; \0 s& y5 Y     if(k==q)% {. ?9 Y8 k  K) {
      { *(p+i)=0;. V; h$ R9 r1 V- f1 _9 l% O
        k=0;: I3 F8 C! s# g1 n0 m# c
        m++;
$ |# y2 {# t' u5 f+ N& f5 H. m; }      }
8 C2 P9 r, N, M& e: y% c    i++;
' S; T- P8 {8 ~' B5 T6 [: f4 r    if(i==n)i=0;
2 t' u9 r. Y2 l9 R9 ^2 B   }
& y0 V6 k/ y8 ]  m  while(*p==0)p++;3 n8 H% a" s4 d
    printf("The last one is NO:%d\n",*p);* i  K: y) s8 M2 o
     getch();9 @6 |" V2 Q, h& E

, c1 w8 k/ O0 }}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;5 G) t1 w) [! _* t% d$ M2 C) i
namespace 又费马达又费电5 T5 s* c( L9 ]0 v
{- f- o8 w9 R9 S3 R  v
    class Program- C( W, u6 U0 t
    {
6 e& H0 d  S8 F) a8 ^" u        static void Main(string[] args)! _( K* p; ?' G0 g7 C; |( ]
        {9 y% ]2 O( A3 j: \$ ^6 c
            int m, n;; _# k5 w& j! w6 m( z6 w
            Console.WriteLine("请输入数组长度");3 v9 U1 _2 _/ P" N& M& p
            m = int.Parse(Console.ReadLine());//m为数组的大小
& N1 Y7 @, i& e! M  w            Console.WriteLine("请输入要截取数字的大小");
( f4 m5 V) n7 N) A% A            n = int.Parse(Console.ReadLine());1 M$ c0 p) d: ~0 ~9 u( C
            int [] numw=new int$ z8 y2 X5 J2 v0 P( P) t; u
  m0 a/ A% \3 H% `0 `+ ]% G
&shy;&shy;&shy;;
, z7 @- V: |2 f  ^% K            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数! S2 ?& A, r# M9 ]
            {+ d0 b+ d# K& d
                numw[j - 1] = j;
) P. {3 G; |0 k1 {& }9 ]            }
7 l& w- _4 M. t1 t  F            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
) [. o' T( n5 ?5 Q- e            while (d != m - 1)
* a' f; ~& Y/ x  R# d5 k6 f            {' S/ ?, J. J) K" x6 w
                if (i == m && d != m - 1)* v  I3 Z0 V# l( |: J* K% F
                {, p9 U) P) E7 j: }- m8 r& n( b
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
" l! }! Y" x- y4 }                    continue;
' a0 {0 q* L3 Q& y9 K2 O3 H( R                }
) }9 W1 A2 K0 }5 a) U/ K# `1 j                else7 E7 x* b9 E" @
                {
! I1 _7 @% o9 S0 f; g7 M                    if (numw[i] != 0)
7 F' w- m1 u: X* r                    {
2 k- h1 q6 t; }" p8 _2 z+ r                        i++;
: ~; e5 \: D1 u& y                        k++;) V& r* h6 T* q5 G( F
                        if (k == n)7 V; v$ o6 A5 ]& f/ n1 x
                        {
4 v& s& k( ?' T3 h, i6 C" D' H                            numw[i - 1] = 0;//把在n位置数组元素的值改变了0 l% ?; i1 L# n) U9 Z% a
                            k = 0;7 G/ G+ l/ @; c1 C% ~# e! u
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小10 Z; `* |6 y3 h2 ]7 b
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
  E2 L/ s) w7 B8 I& `0 w6 y  b# r                        }
- L4 L& s" q# v                        else//输出暂时还没有改变数组元素的值6 v, I1 D3 ^) E! R
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);9 |* {/ ?0 ?2 n
                    }/ h$ t  _: o3 s3 l  b
                    else/ g( e$ u7 l0 O+ D
                        i++;//数组元素为0,直接跳过,不计数。。。/ M+ M- W# K4 s4 }
                }
; ]* r! R$ \8 s! ]$ g+ O- I
2 T8 n7 |# s6 D* i, B- r% s) I* h/ `5 I# M- u! r! S& j
            }//结束while循环7 X" ]/ @+ g% a8 ]6 T( g! ?7 c! g/ C
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
) E: i6 h6 p3 B9 U3 m# M5 h           / P* |. W& ~( ~0 g* s: g6 z  I5 `
                if (numw[i] != 0)
1 t# F/ `$ O9 B- T4 v% |4 k                    Console.WriteLine(numw[i]);
: s( Y$ E5 h6 L! t5 p           " y) K: N0 R, ^
            Console.ReadLine();
5 V( V1 `  H; T8 y! U' @        }
& Q2 Z! V1 J+ Q% s, ^! g9 V* v    }4 f! O+ K& G4 V% s0 c7 L
}2 i% q9 H) ]( u$ S0 n
小甲鱼最新课程 -> 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-5 17:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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