鱼C论坛

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

猴子问题

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

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

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

x
大家好!
, M3 [6 t; t9 g7 f这几天我在忙着编一个问题,我用了一种方法编出来!* s- g7 C$ ^2 b& J' S: G1 k, E
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!! `, ]* j7 M; }, \1 r# g
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
9 K' b9 \8 m; O/ v/ Y- y
6 ^& t7 |8 F% y3 Y
, Z* g. Q$ A+ y8 W& C9 ^8 R( s1 i
                            题目. d" _) {% d' _. E! a! `
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
; Q7 p5 o; o3 a0 A  T* L& M第一种方法:利用循环链表
1 L' U% r7 M4 t9 ^% }#include<stdio.h>
% M5 ~# {: C  P6 I9 G) d#include<malloc.h>
7 n- D- F) F$ S' X7 o; m#define M 8            //共有8只猴子& A/ K# V2 r. f2 F5 E
#define N 3            //数到3只时退出第三只
5 `( a; a& p% |1 v' J1 |typedef struct monkey- X; C8 [# r5 N9 Z+ X' |
{int number;
+ G  Q8 U, G$ ~% c. ]( j  Nint flag;& z9 Z8 x' r" h; t/ _9 J" e
struct monkey* next;2 c* X1 a2 f5 T' |/ g2 }! a
}MONKEY;; r5 B* W; \' \5 G* Z2 [
main()
& {8 V5 e+ i! ?8 ]: B" r{ MONKEY *head=NULL,*p,*s;
+ x3 Z% q3 d/ ?# H6 J5 R6 K$ z, D& k  int i,sum=0,count=0;
# U7 U: e. Q9 R  clrscr();              //清屏
  L, e- L# U6 P0 D, @% |7 k$ a  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存3 I+ G" U* s) g
  p->number=1;p->flag=1;* i$ M! k/ b! V1 B7 O
  p->next=head;
4 d$ ]* q- H$ I3 X2 h2 p% n) T$ S  head=p;% h" J* _" f5 X7 v
  for(i=2;i<=M;i++); K6 y' J. g. u/ K7 A
    { s=(MONKEY *)malloc(sizeof(MONKEY));6 p$ Y% T) z4 S* B9 k  c. s' Y
     s->number=i;s->flag=1;
9 D' K) F. H) n     s->next=head;
0 g1 f2 f, s- ?; E6 E/ d9 Y8 K2 U     p->next=s;p=p->next;
8 M7 d( H& a% f2 j- ?0 S    }
6 o/ x. G, s3 I$ v$ R- c, a7 x1 U" P    p=head;
6 Y2 x& z. d4 d  k! L7 S+ w   for(;;)
* H4 A  W' ~* S8 S( K    {if(p->flag==1)
6 p: ^. ~' H9 ^- \       count++;
& Q3 |2 A4 y, f& @; ^; @     if(count==N)
6 s, D4 V' _9 G9 u' B        {p->flag=0;/ f, g- J' l( E% t
         count=0;1 i. P& G& d: p! D& L6 S3 U
         sum++;}) v- M- [8 J% c9 \- t
     if(sum==M-1)
+ X, m9 T4 x* B        break;+ o! V! ]. v% d+ ?& ?" w  U. h
     p=p->next;
  `, C$ ]  z. s$ T, D) S0 B2 d    }: ~( p* L: N& C$ J. l
    p=& T7 d7 v; b5 y2 e  N
    head;
# j  e. u/ l3 }: X: x  S/ ~    for(i=1;i<=M;i++)2 J0 o  e$ c' Y6 y
    { if(p->flag==1)
9 b: d0 g# E( p6 p2 b6 d: v2 x' G' a        printf("\t%d",p->number);
( Z! d5 P% v9 }5 V. v, T      p=p->next;" i. O' l* K' P& f( f
    }
  W* k% A) m' E3 Y' K4 |
. Z" V2 b" p, h. o2 r! r8 w. Y- U  x4 ?+ h" r
9 y. D( R+ D) d' d# A: z: o
}

; `7 J! l/ }: o% F' F: N  Z. P6 E* X第二种方法:数组% Q5 t/ u) o& h/ f: S+ P3 @
#include<stdio.h># G% s: t% g; l( j$ ?$ e
#define M 8% ?$ n' u# Q8 H2 N3 {% j7 F$ s
struct monkey6 S9 e- s3 H+ M) s
{int number;
4 d8 g1 w0 t. ~0 K" w4 G5 dint nextp;( u8 t4 v9 b$ v% [* b
}link[M+1];' f# ~% k* A0 ^4 D+ Y& ?

3 [$ C1 n7 i9 S! r8 {5 C5 Ivoid main()( ^7 O. H0 R1 v9 [
{int i,count,h;
% W) q/ ~: v: _# i! T! U) [0 gfor(i=1;i<=M;i++)7 v$ C; ?' G6 b$ D
{  if(i==M)
! X  q( y6 |' D8 Q4 M; h9 G0 {: M   link[i].nextp=1;
8 B: \. z6 e/ P' V   else
1 w9 r+ e: ^6 c7 H   link[i].nextp=i+1;
+ x7 l* R0 x. ~7 p7 c! y3 `3 ?  link[i].number=i;
1 z+ ]9 E7 m( g! t}
. ?3 d# U% T' Q& N) \; }printf("\n");
7 K2 z4 x4 x! m6 s/ R. t$ ycount=0;9 Q8 C1 f2 @- }6 T3 i* I
h=M;  ~) t' F( b6 l; T
printf("依次退出的猴子: \n");/ J( {" m. D3 |- C
while(count<M-1)
. n  u6 Z+ F9 x  c# O{i=0;. F! I& z4 S6 p+ {+ w+ H
while(i!=3)* N0 _& v. C9 Z5 V
{ h=link[h].nextp;
/ Z. I  f) `0 U: k% S% W0 K   if(link[h].number), Q& |+ w& U" z' B' S1 @
     i++;}
& P* D& m! C5 m# k
+ W" b, b- v4 x7 f3 q+ v) Z3 yprintf("%4d",link[h].number);( Y/ [9 A4 \2 R
link[h].number=0;  r$ R' s4 Z% X' \
count++;; V2 F* E0 Q  [6 I, w
}
4 G6 H- m7 b  G/ X/ ^2 S! t$ k
* |% v6 n# q2 l; e8 X1 q/ fprintf("\n大王是:");7 C9 G: [/ I0 T& V
  for(i=1;i<=M;i++)
/ H5 v. E) O( m. P0 x8 g7 ~5 g  if(link[i].number)3 }" U3 Z. B9 t' I! |
    printf("%3d\n",link[i].number);
* |  F  `: w+ d5 V9 |
4 k2 m* D0 R% K7 y! O, Y3 a) e$ ?+ {* c+ N, I
}

( b! \$ N4 j- @& H' L$ C2 P& r' K第三种是普通方法for循环
- ]5 X4 \3 F& v* u
#include<stdio.h>8 G7 r0 C, i" V$ }
void main()
7 T$ p+ d  v% [# I: ]{ int i,k,m,n,num[50],q,*p;: p( b& u! l  _* {
    clrscr();* B7 o* f; v$ `+ W
   printf("input number of person: n=");
6 p* E" A8 b- }4 m# K, P" L    scanf("%d",&n);+ Y/ e3 A; O/ n( r2 c
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只4 b7 l- d2 z/ Z6 [; i) c
    scanf("%d",&q);
# b+ g6 K  w; }- Y$ r# b! W   p=num;1 a4 c3 E& q! G2 k  U1 @
  for(i=0;i<n;i++)+ H: n5 [0 M( |6 \) @1 }' i  e
    *(p+i)=i+1;
8 {( h2 h* _3 P, e" Q& G   i=0;
  f1 I# |$ s+ O% n- V1 d   k=0;& A- p  T  i8 Y: S: ?  x* A
   m=0;- g0 c' H5 j3 E0 M
  while(m<n-1)
0 C$ h9 I* H8 m   {if(*(p+i)!=0) k++;
, w# x3 X0 d: S  M     if(k==q)7 f/ b; R. t7 W) \- l
      { *(p+i)=0;
0 E, O: z5 M& z) d1 m8 d        k=0;) S) d! V( _# X$ G$ I- z* t
        m++;
3 E6 L6 r) l5 H" N, Z; G      }
$ M: }# t9 [. G2 m& h    i++;
+ G$ R4 t8 N+ M7 z    if(i==n)i=0;
0 Z. ^4 {; Q% O, y1 U   }
7 m8 ^2 t% ]/ m$ T& q! S  while(*p==0)p++;
4 o* L# E) L8 P# m    printf("The last one is NO:%d\n",*p);: {: I% k0 _; Q( m, a
     getch();
/ p  p6 |) c# |9 T  F4 y" s- S# Y9 [2 P6 @, c# ]
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
1 ^% h( W* m4 T8 e* @namespace 又费马达又费电
9 \. o+ D- P; N3 w{( {7 l( q/ N$ }0 t# ?) D3 |/ J
    class Program8 X' ~; c' s) K4 {: g
    {
6 z8 M( R  E- {2 B        static void Main(string[] args). X2 f& \" @$ ]* }5 ^) w, O  P% ^
        {' y% Q; l' S: h1 G+ ]* k
            int m, n;
: P( {/ e( B, p0 N5 e8 }            Console.WriteLine("请输入数组长度");3 c* i' X- T3 }* A
            m = int.Parse(Console.ReadLine());//m为数组的大小: `$ }4 K% Y- O6 ]
            Console.WriteLine("请输入要截取数字的大小");
7 k2 @& f) m+ Y* q! d( Q: x* ^            n = int.Parse(Console.ReadLine());
1 C, K+ @5 n% s9 S" d0 ^- F$ @            int [] numw=new int
3 l: S2 f2 c" J$ a' R7 ~" q2 f, F, x! m5 V( J
&shy;&shy;&shy;;5 h7 R+ i$ f! Q- G# |) J/ x- g
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数" a6 A! S8 J% t: g- G
            {6 a  I/ f% p; v4 S2 ^8 Y+ C+ W
                numw[j - 1] = j;
  P" g6 L! p( Y. I$ |            }# P& H# e- ?; B
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!3 |8 k! O5 y& V: B% o
            while (d != m - 1)% ^9 }  o6 D7 N/ J9 P5 ?
            {
6 x, S: y% Y1 d" W5 q8 H                if (i == m && d != m - 1)
8 S- M8 R* c* A* {$ i4 o                {
; u3 K- V, K7 @) u3 L& M* m                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!3 A8 [; U: u; s/ t  n0 W
                    continue;
6 U5 k$ x  a; [& e+ N3 k0 ]' K7 C# M! B                }
. _; N! Q  z9 p( I# k& C8 E+ }) S( b* A                else: m6 u3 x4 E" _1 `
                {) e' `  W% R% p% L2 c! v
                    if (numw[i] != 0)% {+ H' P6 Y, A) e. m
                    {
* ~5 Y  F4 x: o, `; Q                        i++;
# C; X6 |7 U1 C; w  ?4 L2 f' m, X                        k++;
% K5 I, B/ C/ x: }1 m( K% @                        if (k == n)/ }; O& e# S) ~3 [) y  {" ^, a
                        {# ~  T6 K7 p8 c0 d: U
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
, S1 s6 X1 r' w, k3 h1 b) Z- S. ~0 U                            k = 0;/ b& }  Q( W5 m  |! G
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
5 c) T" s4 i5 s                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
1 f! ^7 A" [  ?% ?: f5 k                        }
) @) M3 G, [/ R7 s. {                        else//输出暂时还没有改变数组元素的值) U* K9 g1 S/ x' p& O: }' B# q2 k
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);7 K. p: t. ]: ^7 o" Y$ e- N) ~: s
                    }
$ ]6 j7 k* @* D6 F" o3 Z( o                    else: z* J/ y% g) `6 i$ z
                        i++;//数组元素为0,直接跳过,不计数。。。
- |6 A9 v) q# X* F. j! i- V                }
# O7 j: t2 J; M! x ! S; P: \, y- P
5 T% \+ m4 f, V" ?- B/ A
            }//结束while循环
; ^* N* _  e( F+ F- l' M            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
* w( S, U" }9 F3 `3 n6 }; f           
8 F+ _& c( t4 e; F0 f7 B4 V, _8 E                if (numw[i] != 0)7 t+ |  K1 l+ V( L/ Z2 S% ?. I
                    Console.WriteLine(numw[i]);
4 z- F( o( x2 D0 d           3 p/ V$ o/ Q/ P( ?/ A8 H" X( y1 `* c7 W
            Console.ReadLine();
: e+ P0 M. Z* D+ ?        }( I# Q( |6 g7 n- K2 a+ v
    }" R0 U# ~3 m3 |/ d7 F
}; n# L* g( j! b. t! \& K: g
小甲鱼最新课程 -> 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-2 19:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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