鱼C论坛

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

猴子问题

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

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

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

x
大家好!
* p4 z7 ?1 Y, C2 ^, y0 X这几天我在忙着编一个问题,我用了一种方法编出来!0 U. I+ c% N& i+ O1 q. G9 k) [
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!5 G% E* H8 z2 c% [( K/ J8 s
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 - ~( ]8 |4 Z+ x6 B" g

' S: ?0 N) J. G  H! d; ^3 n- o2 ~* a) @/ M( ~* F3 @
                            题目! q; M7 Q, ]/ l  E% r; a, L
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
4 w: L% M4 q: M+ x3 ~  b第一种方法:利用循环链表
; o- s* ~3 A  O8 X#include<stdio.h>  i- z' o! m0 f0 j) v
#include<malloc.h>
( m4 y) ]" e' e% s5 I, X& Y$ U* E#define M 8            //共有8只猴子6 Z9 R+ e/ W8 @, w: v! o; c
#define N 3            //数到3只时退出第三只
# i  c% }/ W5 ?: Itypedef struct monkey8 O+ s0 C/ g7 U  _' P4 G
{int number;, F9 h9 m2 k9 X/ e
int flag;
* v! F  ?& t; c/ ^struct monkey* next;$ w7 S8 m! D4 v+ N$ S
}MONKEY;
2 c3 Y5 _6 _, y) vmain()
# f- r7 P0 E  x( M) z& i: n: D2 m{ MONKEY *head=NULL,*p,*s;  u, B/ t' x$ ~7 m' h: a- o
  int i,sum=0,count=0;
& Q+ B$ _5 F1 F3 W3 M" C/ N; n3 @  clrscr();              //清屏$ i' a* N0 s6 g: m0 S
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
+ E( s+ @* V" ~) M0 l$ t  p->number=1;p->flag=1;* Y( R5 u, V7 `( Y, C8 `- H, k
  p->next=head;3 y5 i3 r! e8 ]6 _8 t0 ^
  head=p;3 d2 x$ S/ {3 X+ v1 s
  for(i=2;i<=M;i++): f, }! X3 z1 q1 N
    { s=(MONKEY *)malloc(sizeof(MONKEY));. m9 Z% Q# P7 _
     s->number=i;s->flag=1;: Y  m2 {3 u( Z' v: R. z
     s->next=head;
5 F8 V! I$ ?  q# ]     p->next=s;p=p->next;( W: ]; @3 w8 O
    }2 D! E0 b. m2 ^, l. B8 w
    p=head;* T$ B3 J/ d) f1 Y  |2 p
   for(;;)9 B7 z, W7 v- {4 I5 Y) T
    {if(p->flag==1). _, Z7 g. b" r  E" s2 G
       count++;
! X2 g/ D# c  H) C9 j0 M1 J     if(count==N)( U, d+ I0 B: D+ F$ _
        {p->flag=0;
; m7 R# ]7 {; _         count=0;. f, D( \, G- J* _
         sum++;}: ?3 T3 g1 W! u6 ^/ o* W
     if(sum==M-1)4 ?# M3 H0 l* y4 k0 a; j
        break;" @0 w5 a) g- q! g
     p=p->next;
2 T; N& i+ j' S( o' f+ L, N    }0 E& [- m( s  W
    p=& u3 k9 _; G+ k% m
    head;
7 }6 W: T" F2 ]! x% e8 D, w, b    for(i=1;i<=M;i++). d4 h3 r5 D8 r
    { if(p->flag==1)' h, Z  e; i) S/ k
        printf("\t%d",p->number);/ Q: Z& V( m2 V) t( u% p
      p=p->next;9 Y8 H: F4 g2 _& S4 y8 S" i
    }/ {2 n* I7 x/ _& r7 f

4 D4 X0 p) _+ E9 y& x1 w! N1 ?
7 E/ l, U" j" r" T$ g) o9 R4 y. d/ E* d9 k; h7 {' T5 ^1 c
}
- |$ t. J1 z, N4 f, l9 I+ V$ W
第二种方法:数组
( ]2 E" y# l6 i5 X( d: _( U#include<stdio.h>
: `7 l0 C3 t: T. y1 Y! V3 U#define M 8: M- A0 e1 ~6 W' _/ m6 f
struct monkey
3 P* I) n' Z+ l/ J- q{int number;
1 E# n4 |1 |& n4 X1 r% l9 iint nextp;* {/ k7 m0 n5 k; r5 x. d( Z7 w, s! X
}link[M+1];
0 V8 @4 ^1 ]# W! t  ^& x* J  ^( o4 E) w! u8 h; h
void main()# O: |0 N7 Z6 R: q( n4 A
{int i,count,h;
1 ]& m" d4 z5 Dfor(i=1;i<=M;i++)/ Z) @5 {  m  D5 X3 n. N
{  if(i==M)& V/ \/ w1 I7 [9 X8 b2 ~" j$ Q
   link[i].nextp=1;. J  g0 e6 N5 F( V
   else
; q2 Y4 Q) N& p. n! J0 I  G   link[i].nextp=i+1;
% s  E5 G8 @) h4 v! ^  link[i].number=i;: r, y1 c3 E: e: L; ]+ z$ `
}
( w& ^+ c- E4 c( m% Z% t2 Hprintf("\n");
! y4 d4 V. V( g' ecount=0;7 W8 H2 f& m, W" o8 V, k5 o
h=M;. m) h9 K; p  y% @  p% U! P
printf("依次退出的猴子: \n");
  i0 e8 z$ Y4 `6 N" `while(count<M-1)7 e8 I4 S  s) [, ]# X6 \
{i=0;
$ C1 z7 |5 [  Nwhile(i!=3)
4 x8 T  m8 k" u1 O6 h{ h=link[h].nextp;2 T2 w# s, I: z. j) N  V
   if(link[h].number)
- Y; o, P% H  _0 j     i++;}
% {) J% }: z" H+ g4 X/ n
, c. |& n/ R! C: R& B3 O! Fprintf("%4d",link[h].number);" U+ e5 t% \) G$ T1 _4 x2 ^
link[h].number=0;
2 a& i  x& Q9 N! p8 Y! k1 [count++;
4 \: l8 K$ B/ L8 |+ s}) ?  p/ E1 j2 s( R- a* j. q
3 s3 v' A0 y4 o% e/ G6 P
printf("\n大王是:");% j, i: u& o! a3 T% b  P+ v1 _
  for(i=1;i<=M;i++)
- N5 U; u8 b! [6 r1 V  if(link[i].number)
( p# S+ h" L% f    printf("%3d\n",link[i].number);" G7 d" t* u0 ^( S, V; v9 L* C& {3 u
- u! G- o2 ?% F) X' W

! K' z- M" C  w$ \- l}
; E9 \  {0 K: L0 w
第三种是普通方法for循环

( l0 ^% D+ m! u$ ~' e3 l% s( V2 i#include<stdio.h>4 v- P# j9 B2 ?
void main()+ c) a9 x7 z3 x! E
{ int i,k,m,n,num[50],q,*p;
/ c: j( @4 m. q" d    clrscr();: H+ m% _* X0 F+ x) u) V
   printf("input number of person: n=");
7 [* T) I* H" l% @+ X) d    scanf("%d",&n);. j3 G7 j% \8 i8 v0 e/ l# D
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
; \: X8 G$ Y- h5 e    scanf("%d",&q);
+ a/ p% {8 I) U( C   p=num;. R9 w5 Y( S& M' |# e
  for(i=0;i<n;i++)
% s8 t) g. M9 x. e3 B/ ~  }    *(p+i)=i+1;
) D& h5 n( G% B3 B   i=0;
1 y. B7 d& X$ G# J/ I# P   k=0;. I7 z2 K7 O. N, q5 u# W4 [
   m=0;% {5 b3 H0 W1 D  a, G
  while(m<n-1)- a3 m1 p1 J: `, P0 G/ S
   {if(*(p+i)!=0) k++;
( e* X. R& O4 K: I: N2 @9 M     if(k==q)
7 n/ f5 O: _! W' u( y( L. e      { *(p+i)=0;
4 P0 F' O: l7 Z$ ?        k=0;
- A3 O, J/ s) f* g$ K/ ^        m++;
5 Q0 d9 k! z* w) A0 W      }  L3 r/ b& q% D! l$ _3 w, B3 f5 c% k
    i++;
% |) `  o0 \8 }2 T8 L    if(i==n)i=0;4 ?0 d' y  k" ?( P4 e; l
   }; d- N5 J) {4 ], r
  while(*p==0)p++;
$ p# S+ D, v- ?  T    printf("The last one is NO:%d\n",*p);
, E, C% Q5 t# }: [. t5 }; i( J     getch();
) H- Z0 K$ g" t6 b( Z; \' A! ]3 T% E3 b, H+ Z$ q
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;  i. P7 H  ~( b0 ~
namespace 又费马达又费电$ o% ~6 r3 M, N# K
{
& q% w* U8 R5 D% d8 k0 f$ s    class Program
0 m& N$ }) W: m% G9 |    {- Q9 X- J% {2 d2 {3 B8 U
        static void Main(string[] args)
& `2 z4 q: R# a" M4 r% m        {
0 o& w- M8 h7 a) r( Z  c( K            int m, n;
$ q3 F7 t9 s, V% t, r            Console.WriteLine("请输入数组长度");! G' p/ G' F2 ~! E1 F* e; ^- l
            m = int.Parse(Console.ReadLine());//m为数组的大小3 a; ?6 \# G6 D  }( u: h
            Console.WriteLine("请输入要截取数字的大小");  G, }- X. j9 L& ?
            n = int.Parse(Console.ReadLine());* S0 j+ G5 b2 Z! |
            int [] numw=new int
( ~% D0 R2 x& |# T8 a0 J1 ~
; i5 Y& v, i3 Y3 K. Z" u&shy;&shy;&shy;;
& T8 w! H( l# X- v0 |            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数0 ~$ k5 U1 P6 [8 P
            {
' V. F3 e$ p& T8 ]                numw[j - 1] = j;' S1 L( Y6 r9 `& p$ c: ?
            }
* h! h* T+ X) r3 `; \3 a/ v            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
7 L2 ~! ?; @' v9 v* u" i. J& M( W            while (d != m - 1)
& h0 z, e, L) {6 i: {% s$ W            {" c4 Q3 Y  U4 N1 T1 V
                if (i == m && d != m - 1)
" W. j7 Z- u: t* O                {
  A9 F7 o- ^1 {* }                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!9 S7 O3 ]: n' Z; j1 b' ^3 T
                    continue;' s$ s1 N; C. H6 @/ D7 t7 o. O
                }
& j" @7 ]2 l7 ?9 P# e7 R                else
: C, d1 h# ^( i+ @2 u                {
2 t$ Z4 H+ y- c( Y                    if (numw[i] != 0)9 }! D8 ?. T2 Z
                    {; l+ M3 Y1 z) P
                        i++;, {7 S8 u# g% o6 d* Y
                        k++;
5 R. Z# Q5 }- A( s+ S2 V: }. [                        if (k == n)4 I/ }: r" ?. k3 S& C1 Q( v/ F
                        {
% E* X$ R/ m$ e! c* `1 P4 U                            numw[i - 1] = 0;//把在n位置数组元素的值改变了" h/ @) p2 H3 M6 K2 Q; p% M; g1 D
                            k = 0;
* b7 H8 ]4 x, ]: l, E# J5 l              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
$ k1 v4 l. U3 @7 M$ ]( S8 S2 Q                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);; Y6 I) }7 D4 y! ~8 e7 o0 D
                        }7 A* J% y9 Q. h+ h0 v! ~: v
                        else//输出暂时还没有改变数组元素的值
2 O% i  `- B9 Q" K& k6 u                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
: h+ y2 g% Y4 t1 \! P/ `+ ~: m( G# E9 X                    }3 C+ m9 M  ^3 S) D
                    else8 c* j! i( Z/ ]! p/ L
                        i++;//数组元素为0,直接跳过,不计数。。。& j: E5 j4 e7 x1 v( W) e
                }2 X$ y# K7 ?& h7 @4 C; D) F

0 n5 [; \) Y) Q& o3 _" b' n$ V( \
; J& K0 M2 ?5 [  A& E            }//结束while循环
6 Z+ r7 U; l# c- j* V, \. x4 Y            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦0 E4 S8 E4 O6 a1 h0 C3 i9 ]
           
3 @* P/ J, i7 v                if (numw[i] != 0)0 F9 d) O$ }& P
                    Console.WriteLine(numw[i]);! F1 E5 Y0 m& \8 y" @6 F
           
9 H9 L$ u) X" p+ u7 r; k            Console.ReadLine();7 @* A) j; Q7 o8 N
        }+ e- W, Q" C8 F4 w* ?2 t2 c" g! R
    }' S" B  ?* v/ o9 k
}
0 D7 I, N3 Q' X- `: f: o/ x4 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-6-23 23:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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