鱼C论坛

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

猴子问题

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

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

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

x
大家好!1 N  g! A, b' B+ z
这几天我在忙着编一个问题,我用了一种方法编出来!
7 X2 N/ O: |* b& x, J2 G% P但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
) D8 ]  l+ {+ I1 o1 w9 d注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ; J3 P! `  K! `4 F% L. ], Z

) w3 o" t8 S! T; d0 C2 ]2 f
: w  Q" _* ]6 |" f" O$ |
                            题目
! n9 V' |: ^2 q山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。5 t5 l; k6 q6 S( F( p* l
第一种方法:利用循环链表1 M4 C7 x) @5 ?/ u3 C
#include<stdio.h>$ }4 y' x0 J& _# T9 n; Z
#include<malloc.h>
( [; u: g6 X) {* ]* G5 b. X* C#define M 8            //共有8只猴子5 I. O8 q" p3 ?* a/ e9 j
#define N 3            //数到3只时退出第三只' F4 e0 K, o$ h0 W4 g1 g) w
typedef struct monkey
+ V& ]7 I& y; p; d( M{int number;
! a2 w! {. d7 Hint flag;
% A4 `3 S6 E1 M1 A# istruct monkey* next;; W4 z: L8 k/ K: Q6 F! G: W
}MONKEY;' \! N. J/ x! g' b% O; \1 Y) a4 q
main()% B6 Z) R" l. [$ N
{ MONKEY *head=NULL,*p,*s;
6 ?' _& p5 R3 Q) I  int i,sum=0,count=0;( C( \8 J: r* B1 Z
  clrscr();              //清屏5 x9 @$ h4 l& B, u* J
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存, w3 V. a% |' B' u" ~
  p->number=1;p->flag=1;* Q( q) y% z; o+ G
  p->next=head;# _. z. K8 D; u
  head=p;. V* P" N+ j0 @% @% Y' d3 q2 A6 U$ e
  for(i=2;i<=M;i++)2 A# h+ l* X: N0 t* A/ `
    { s=(MONKEY *)malloc(sizeof(MONKEY));+ h; }! g/ z! J
     s->number=i;s->flag=1;1 S1 p" \1 `& |0 P( o" [
     s->next=head;3 @# ~4 }6 K' p3 ?9 |2 n" s
     p->next=s;p=p->next;
0 q  \" z- \! h# A    }" n9 S- D$ g' F0 U4 |6 P9 w% D( j
    p=head;
4 h7 I6 h' p. E; V' y6 W' C) l6 c   for(;;)8 X! o& ]! ]+ ]* q
    {if(p->flag==1)
6 `8 l8 l5 T( k- N       count++;8 T' g5 G9 ]1 u% W+ B
     if(count==N)
" f, G: _  Q: J( r8 p4 p6 w        {p->flag=0;5 I  W: i" P6 @7 O
         count=0;
7 ?; R2 w8 P1 U         sum++;}* O! V8 ?, I' H6 M( q$ a9 H8 N. A
     if(sum==M-1)- E# u/ ]2 _' o. G
        break;" U+ K8 k: q5 R! O& l
     p=p->next;. f$ c: w% ~9 K( u
    }
: s4 B  [$ h& r    p=
. p. G5 ~% r" c2 [9 q4 x; S5 b  o* R    head;
% J+ l+ D. j2 ^4 n) m" \) k) z    for(i=1;i<=M;i++)/ E  \  M! b/ q; s' F7 o
    { if(p->flag==1)
+ M8 o: o; X) l* |. c- @        printf("\t%d",p->number);4 I$ d/ d% C3 x4 m& x
      p=p->next;( W) J5 r4 {6 f& V
    }$ [6 H7 c) _! ~' Y! A; d+ a( [$ [
5 ~# R2 u, j3 X- e' G, W

0 k! \; m# L) d5 q6 d6 e
8 r& p# F. Y$ N2 W* J4 f5 w}

# b, n4 s: z9 V! J5 [第二种方法:数组, Q4 E- q4 b4 @8 Q4 H9 x
#include<stdio.h>
3 G3 x- y5 D+ S* B8 d- }# H8 x#define M 8
1 Z" W9 R5 l% _2 O. ]$ n, pstruct monkey
  `* Q, c" \$ ^0 u3 F% p# {{int number;
* P5 T* e# |% }# tint nextp;. `6 i. S5 O1 n' }/ N, B" ]
}link[M+1];
5 Y0 e' V, H8 q% ^+ R
6 Z! _; z2 `4 R' z/ X' G8 e" Uvoid main()
) n. M3 D/ w) h  H5 L' `( a, [{int i,count,h;
7 |4 F* {( e; Y. P; p$ Q7 f6 Ffor(i=1;i<=M;i++)
8 O3 G7 q3 B) h2 f. y{  if(i==M)! p* x2 P, _6 P" t2 ?: r: I' _
   link[i].nextp=1;
( j$ ]( y6 v+ I1 I" k& Y   else
' L: g0 o4 |; ~7 {& w- N$ B0 t   link[i].nextp=i+1;
+ @0 N) g9 V3 C; A, R5 }! ?6 ]2 E  link[i].number=i;
$ D" f2 O5 v3 K0 Z! g0 d: k}9 v$ g6 Y, v9 R+ q3 ?' u
printf("\n");
3 O1 y% m+ g+ x) C2 U  [9 |9 K9 ycount=0;3 {" K( W& ^/ t! v
h=M;
& k/ S$ S% O  q8 hprintf("依次退出的猴子: \n");
) ]* m- @' S, w: Q$ y& Vwhile(count<M-1)8 f5 M7 z( w/ Q' \, ^% K! x& {
{i=0;
- P7 T, P% @" d; v0 N1 Owhile(i!=3)9 J4 {* w- o6 p3 I) s
{ h=link[h].nextp;
7 @8 \% P  A7 A$ ^   if(link[h].number)
4 H5 u: U2 X/ `; s; F     i++;}* ?6 [! y. w; }1 s' [; J3 v6 X

# L3 P5 P# s& J0 ]4 B( [0 Nprintf("%4d",link[h].number);
, r. L7 l- Y9 `- J3 M/ c. Y; Dlink[h].number=0;; w4 [9 [2 O4 X
count++;
: b) e4 M' h, g$ G) b}
' K6 i% Q& @0 {" b+ V6 i0 y; p" n& _. p. j5 t$ W. {. Y% o
printf("\n大王是:");
+ T4 I! G$ P2 A  for(i=1;i<=M;i++)' S* L% o5 F; L. s; N) _
  if(link[i].number)& A" r- x7 C( u, T
    printf("%3d\n",link[i].number);
0 I4 l% N* |9 Z7 E! D, l8 b# P, X/ C" Y5 g& `+ k
& w% i& s4 c: R6 D
}
  p! P- Q: t: ]5 P2 W7 S
第三种是普通方法for循环
; @+ i4 H; V+ o
#include<stdio.h>1 Z9 ?/ t' ~# b" T
void main()
/ O2 a' y0 e* G7 a3 R* E7 v{ int i,k,m,n,num[50],q,*p;1 |% e; a  y* H$ ]" B
    clrscr();
7 ~/ N# R5 N& u" V- ]! v% l6 a  L. Y   printf("input number of person: n=");
# k  ?+ {/ Q; o) R  g$ F    scanf("%d",&n);
. [2 d$ n4 s" J, j' y& Aprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
3 ]; [; q- u) t    scanf("%d",&q);
. X* n  Y/ R: y: w   p=num;
2 f& P, ~+ A/ ?# P3 P9 D  for(i=0;i<n;i++)/ w1 T( }5 y; n) ~  h+ Z1 ]# O
    *(p+i)=i+1;
- B5 q6 N3 _/ O9 ?   i=0;# u* y! r+ A$ n- [, B
   k=0;6 `/ O% a9 p9 p  S5 h
   m=0;( H" P$ h  Y+ X6 l/ {2 e5 g2 K$ s
  while(m<n-1)! _7 V9 D% m, g" P, ]0 i
   {if(*(p+i)!=0) k++;
3 R, X( Z' |, p     if(k==q)
  z' m  X  ^2 y4 m8 F      { *(p+i)=0;( T, j! f  g7 n
        k=0;
$ n4 b5 u3 S# O* K4 I/ a        m++;
( ], F/ X! f4 \' e      }0 ?' F9 q5 ^! r; b' ]1 L" ]
    i++;- j5 M& v4 N0 ^6 J" U- G2 b# ^, S( ?" O+ l1 T
    if(i==n)i=0;
( L+ k% @. \/ ?$ W+ n% b( Q   }' ^; W. n7 ?0 n2 u/ J
  while(*p==0)p++;
" Q% |8 c# ^  @3 R, F  m+ J    printf("The last one is NO:%d\n",*p);
+ M. L7 U7 e& E9 X9 `     getch();
* o. s, W+ T  x$ _! }& {
- v/ u# W8 i; [% ^}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;" [! q" X: d0 I
namespace 又费马达又费电) T% k8 ?8 `& Q: k
{
* {$ o3 l* m9 j& t- g    class Program- K, ^" J2 U3 k3 j% W& H) D) E" m
    {1 m% u+ t% F/ `& J9 p- H! ?
        static void Main(string[] args)4 o3 d; h$ N4 k0 y
        {
8 s. o! X. Z) ]; u& X            int m, n;
6 \( b* }$ A0 S2 h* E            Console.WriteLine("请输入数组长度");
* N2 B4 \+ U5 z5 S7 _            m = int.Parse(Console.ReadLine());//m为数组的大小
) e7 E' q2 g* c5 F  Z$ p% a1 D            Console.WriteLine("请输入要截取数字的大小");
( u, H2 N2 z# H$ t            n = int.Parse(Console.ReadLine());. N9 E, p  x& k$ ]/ G% I- U- O$ S
            int [] numw=new int* {5 Q5 f6 [* L+ I/ a* b( w6 w

  e" ?+ U/ N& r" V7 ]2 d&shy;&shy;&shy;;
  L6 e5 [! V) i: M1 X2 U            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
9 F" ^$ @# d' |& Q$ l            {
& b& f. i- j+ j7 G* ?3 B( T' h6 w                numw[j - 1] = j;
1 l/ S/ ?& T! a2 W" E6 A" f            }
: U4 a5 n. z1 ^4 b9 W            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!$ z6 I  ^* I8 n# T# ~
            while (d != m - 1)
% H8 n- M" v- X            {
. P* T- {' x5 y/ |                if (i == m && d != m - 1)
' B( r! D4 m" o# S' A6 t9 u) m                {. I4 Q/ A+ N8 C5 z1 I
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!2 \2 ?0 [" \" @7 p- l9 b
                    continue;
+ x/ t6 C4 u+ W* n# H. E                }
. w2 _: R) l5 ^* y" ?  `9 ]                else
; F8 a3 p$ [  A0 X. u- c                {  x$ D5 D, W& z
                    if (numw[i] != 0)
8 t" k/ r$ {! A' A* v; K( x. y8 N                    {+ u6 b! _0 W% ^# h/ [
                        i++;
- F5 I7 e: Z$ k8 j4 J3 ?) _                        k++;/ I$ m. P2 m& w0 n
                        if (k == n)
; H9 q4 P9 h9 N* B$ ]- E5 y- |/ l                        {
/ D0 ~( l" p3 r1 Y& v5 b7 G/ R                            numw[i - 1] = 0;//把在n位置数组元素的值改变了! s0 b5 v7 W, o; ^$ }% c0 ~: [
                            k = 0;( L: O; `# w4 e! _6 C
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
. d# G, Q1 Q  e2 b- s" P  A; h                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
1 p6 m$ n# e$ n6 O$ [                        }
- Y. [9 X2 b  k: X1 U6 J$ T                        else//输出暂时还没有改变数组元素的值4 U% A' ^2 I  Y* H/ x" z6 C
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
* e, Q- V0 m4 G/ M! }! f) G4 K                    }, v( y; N0 l, q: @
                    else
( {3 M3 n7 g$ y8 Z/ V$ K: U: F; x                        i++;//数组元素为0,直接跳过,不计数。。。
0 }# u( d- A6 h/ f% J                }" X. O+ r, X/ Q" ~9 I) a

5 M- i* a; R. f! G8 k
9 w0 i5 E9 E  G( {2 b            }//结束while循环
; A- D3 ^! k' u+ q9 O            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦2 I' b5 A6 k* [- M* Y, u
           
3 _/ O# S  o1 G5 k; u# \                if (numw[i] != 0)
; Q, W7 B! l0 P+ D  G6 H                    Console.WriteLine(numw[i]);
# e) B7 F4 s. O% |           
. P1 ?0 s, ?# \+ E, f            Console.ReadLine();
) u! |, o, U% J* g1 p        }
& |7 p; G% O, H/ N3 l: }    }3 B, D$ z# u% B: V+ x" a
}3 r; X6 b( d0 U4 @
小甲鱼最新课程 -> 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-21 17:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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