鱼C论坛

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

猴子问题

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

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

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

x
大家好!
* r/ O: m+ r6 `3 ]: k' k; Z# @# f这几天我在忙着编一个问题,我用了一种方法编出来!0 X, U$ M* \7 |( }1 E: ]
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!: Q- O( g$ c$ i
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
& L1 ~% D: y8 D% G- e8 g
/ M7 s5 m1 k$ w" y; i8 T4 D$ N( Y8 \. M5 \
                            题目
! V" q  r6 }6 d山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
. z) S' e% t7 i' L第一种方法:利用循环链表
$ S$ ^( e) `7 C  `/ O" ~" X" o#include<stdio.h>
8 {- f$ i4 W4 @) n#include<malloc.h>
5 l. J: P! U4 ]1 N+ l#define M 8            //共有8只猴子5 k0 H4 d1 D; p9 G: h- e- k& N
#define N 3            //数到3只时退出第三只+ O+ ^8 {5 D" p& W% P+ x; q5 {2 A# d  J; d2 i
typedef struct monkey
0 ^$ `3 o$ G2 J8 t! U{int number;8 {* T+ F! X2 w" |, H' m" Y/ B) O
int flag;
0 F, W& I7 v: I4 m$ Sstruct monkey* next;
/ u# B0 V9 r" c7 {9 Q: k" Q9 Q$ ]}MONKEY;
( t. |. U6 S# Q3 @8 U% D/ o# @main()
( f; @# `* K* G" t, `0 ~0 ^{ MONKEY *head=NULL,*p,*s;
- ?: \. @5 N3 |3 U8 {7 D  int i,sum=0,count=0;( T5 B8 \" v1 s) ]. ?
  clrscr();              //清屏1 Z4 h- M/ h: Q! B$ Y  N  d
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
* x0 F1 G( V# x, M( J3 {  p->number=1;p->flag=1;. g: H3 j# ^; B: l. v4 b9 H
  p->next=head;
  x  S# G1 N" y) Y' Z  head=p;/ g" x  z$ d2 [& ^5 b
  for(i=2;i<=M;i++)# I5 |: ^" m% h: r( u  }
    { s=(MONKEY *)malloc(sizeof(MONKEY));
% n! {- t$ Y. Q6 F9 e9 O5 t     s->number=i;s->flag=1;, T- Y6 Z3 l2 p* z. [. e& `
     s->next=head;# F& w* ~( w6 o2 L
     p->next=s;p=p->next;
  V% P3 p9 U+ _+ O    }
& u8 s) A! `, n! `- Y- t    p=head;0 {2 _3 T% X. B7 b9 i9 V
   for(;;)$ _  ]8 K. M" u, V& B
    {if(p->flag==1)
# ]+ \4 d* U# @: F& D. X& P       count++;5 Y' E9 E3 h$ S4 ]* n
     if(count==N)- l0 j+ O+ k1 d# A% B1 s3 [5 P
        {p->flag=0;9 c7 H* v! p/ g5 S  {
         count=0;) x* s2 ?3 n; o& l- b
         sum++;}
" S4 z, v5 C9 i) @6 Y1 ?3 h( I  u; H     if(sum==M-1)
3 U. P: U: W7 \' X9 e% `        break;
' F7 F; A/ K; q; O5 P     p=p->next;
& ?" h0 i. l4 ~8 M, A9 X- ~& ]9 V% W    }
6 X7 B; v* v  g0 J( |    p=
0 B0 s. D/ C/ s+ T* Y    head;
  C$ o" @2 D4 h# Y' C! w    for(i=1;i<=M;i++)& [# W8 Q7 |. [) u- l" A1 w
    { if(p->flag==1)
' G0 a" S7 v' ^) q4 z        printf("\t%d",p->number);; [" \6 C% J; |( _4 f
      p=p->next;% R8 w6 ?% y8 o9 {/ ^5 j- h* a
    }7 T3 o6 \' j; x, U# P$ T# w9 v4 u
# s# G# m9 ?7 I& D, V1 M" J

! ~  l- `# M# ~$ O- W3 h' }  H
}

+ p) [+ }+ U% u" }+ Z" m8 I6 H第二种方法:数组
4 @- a7 C& D. X: ~#include<stdio.h>- a* ]6 o( Z; z8 V3 J& T0 x
#define M 8( u! p- R  N$ l# Y, C: Z9 g
struct monkey& j9 d) I9 g/ \- _5 [% ?
{int number;: f9 c0 P& Z' G+ M3 |+ F6 r
int nextp;. `2 @* }+ T" W! I4 I
}link[M+1];
7 Q$ H! ?4 T; y
& {; {- z4 h% {8 }2 B( uvoid main()
- |: G- k2 Z( R! h{int i,count,h;9 r/ M5 y8 J+ v; F
for(i=1;i<=M;i++)" a1 n1 l6 i3 Y, b0 K
{  if(i==M)  s+ y9 J" x) q6 K( P' }
   link[i].nextp=1;$ O% k' z2 D( P% d# @8 F5 C
   else* ^: g6 o3 [* M
   link[i].nextp=i+1;
, f" ]- B/ q6 _0 f  link[i].number=i;- N9 p6 K6 ?) \2 Y/ v( J
}+ e' R4 l" Z5 Q; [( N$ ^  I
printf("\n");
2 ~) u: N" m0 @count=0;
; i0 m  A: s3 m( ?* zh=M;$ }/ l6 x5 W6 f* V
printf("依次退出的猴子: \n");4 ?, C9 a* y1 s. Z- r6 A
while(count<M-1)/ T9 {1 E4 K/ ?6 V& ^; M$ a$ a
{i=0;; H$ u, a( C3 Y: _
while(i!=3)
5 I1 z- L1 ~5 \' y) a8 n5 h{ h=link[h].nextp;
# T' z; T% N7 g. O2 w   if(link[h].number)
+ D- s+ w3 D0 P& J     i++;}
  s7 ~! F+ ^0 q3 Y4 M
0 B+ a5 m9 k3 k: i/ g5 P, dprintf("%4d",link[h].number);' p( z4 _  j% k( W/ a, A0 ]- Z
link[h].number=0;
# @) `5 O0 b" vcount++;0 k1 E9 e, T( G* X: z* W6 g
}
! r# r4 ~" u/ H& v5 M' R, _; z
; x: z$ P7 u2 Jprintf("\n大王是:");# ^& ~. y2 {8 ]
  for(i=1;i<=M;i++)6 E, T8 E6 L7 n6 h) C- d& m: B4 x
  if(link[i].number)
+ e* ~+ e4 T! @    printf("%3d\n",link[i].number);
0 V3 V3 {7 A' N7 E* U' w. |
" Z* f9 l; k; Z! _. I& p! V
: O' i& Y; \% e1 t9 W9 ~# Z}
) V7 g, J1 P7 k0 P/ C
第三种是普通方法for循环

$ U6 l6 T7 C0 D+ R#include<stdio.h>) X# E0 _% O9 S% k# l3 ?( P& F0 t2 g
void main(). p3 r0 z* W4 j
{ int i,k,m,n,num[50],q,*p;1 m6 Z! K* w. o( {! n! v; e/ j) ^. S
    clrscr();5 t% Z, i$ X0 g3 M, P
   printf("input number of person: n=");
1 i  J  Y: l# D/ ]    scanf("%d",&n);
; i, B6 ^, Z) f% o7 @- q# mprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
6 s/ j" u. B" P( G  e1 F    scanf("%d",&q);' P0 g* `' }0 O9 o
   p=num;, |; K8 V: K1 h! l4 r, f9 I. f
  for(i=0;i<n;i++)/ C6 \6 c5 {, A' r7 S: k
    *(p+i)=i+1;6 j/ [2 p* g- X% H* z6 k+ w1 x
   i=0;
7 V9 L! s5 J: k   k=0;1 R& F7 X% D4 U" \, F9 d. o+ d" \; u
   m=0;1 Z* \2 S! h' S! y
  while(m<n-1)4 f, m2 o. p2 _" \
   {if(*(p+i)!=0) k++;: w7 e0 \) \; q6 w% B& _
     if(k==q)& X% }; e( C( b, n7 V. J" n" q2 K) l
      { *(p+i)=0;; G( |4 I5 l; E* D
        k=0;3 n0 s% ^' I1 c; X6 S- {
        m++;
# v6 R! X& B) s$ l: k' U: c      }
- k* @" H5 W1 U4 U8 F    i++;
& p9 x4 `; g( ^8 y) x    if(i==n)i=0;
( R9 x1 }# k( N/ u4 J   }
3 h! Q2 h6 {$ S0 ?  c5 z  while(*p==0)p++;# ^6 N0 a8 ~. r8 r6 O- D
    printf("The last one is NO:%d\n",*p);
$ S6 N5 M3 u! t6 j4 r( Z     getch();; _1 h6 x7 H# I$ a1 `4 C0 \+ |3 w
% W: V9 F) F8 r8 r2 R$ P
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
* x  o( _$ [& |3 mnamespace 又费马达又费电: L/ }8 r1 q' O; _+ \: H
{; w/ ?/ G  t7 D* K# z9 _
    class Program8 ~! F, M" R& B
    {  P8 `: t8 }. z1 X/ j
        static void Main(string[] args)1 s- C! D% w4 c; o6 H
        {: }  w$ \- Y3 |: Q, ^$ O: A
            int m, n;
6 Z2 @( Y9 m, r% P( }            Console.WriteLine("请输入数组长度");, Z! w5 D' X, W3 f
            m = int.Parse(Console.ReadLine());//m为数组的大小( T- W% w! g: S6 n# B* a7 R
            Console.WriteLine("请输入要截取数字的大小");4 O& [& `- h: y9 h
            n = int.Parse(Console.ReadLine());
# L7 W2 g' `! t! Y2 {# b5 {            int [] numw=new int8 i, p7 r5 X1 P1 i- k

2 h% }' _8 Y: X$ K&shy;&shy;&shy;;1 k; C( [1 i9 I7 }: C9 k
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数$ b7 ~* N9 \- Y' o; a& g
            {
* l2 U& d3 e$ G6 |6 ?( k7 M% g                numw[j - 1] = j;+ Q  A* W( h* ^9 ]
            }
6 ]' m2 O; Y8 C7 l, ]; P            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!$ H  G+ m* Y4 P& V. x% ?0 e
            while (d != m - 1)# w) V% x3 z1 k8 h2 V7 V/ b' O% D
            {4 s" w7 K, y  N: Z3 V: q! e
                if (i == m && d != m - 1)
* p% Z# u& A; R3 h/ E/ B* H                {1 Y9 B5 i, y: i5 ?' F  y
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!; Y3 W% c1 C2 d/ y7 a  |' M
                    continue;8 A3 {6 w: m" W3 }: a0 Z
                }
1 T% j. }8 e7 L6 ^/ X                else7 s6 S$ d/ A  h' W7 G$ i
                {+ L8 D+ n/ r( C3 x  {+ H
                    if (numw[i] != 0)+ ^; ]( S! d+ x, ~! ?( w6 ?1 e6 D
                    {+ w2 y( l+ c3 o0 Z- f+ u
                        i++;0 P8 k- n7 G7 f" T6 ^6 g
                        k++;
1 T9 k& k& f, L; C1 E                        if (k == n); `& W- {# e  F' i# }
                        {
2 b: e/ Q/ u1 D, K5 K                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
2 u8 V- N5 L2 [: W3 l; l, x5 ]                            k = 0;
6 R9 I+ Y- |0 A% X! S; Y              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1+ @0 b$ W( `. Q9 m# B6 _7 T
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
8 ^9 q8 \. N  w7 I7 b% r7 X                        }
/ e. I4 }$ `6 l4 a3 J: C                        else//输出暂时还没有改变数组元素的值3 E; @, w  k/ J; o! n# }, o
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);( Q9 s- d! u2 d& \. p' L/ c
                    }1 [# R# J' O9 A8 k3 `
                    else
% [5 y# ^& A( b' Q. Z0 t0 [; I                        i++;//数组元素为0,直接跳过,不计数。。。7 b; W3 x% K- W0 L5 K
                }- }9 M1 q7 ]2 ]+ z+ Z  l- K

- ~( L9 r. f$ p
' l/ F" w6 E* X9 y; \" F5 T* E            }//结束while循环
( F! g% w$ v' u8 \% p3 ^            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
0 k4 i7 \0 Q  J& O& D           3 y6 B( [# N6 C9 i3 f8 z& P
                if (numw[i] != 0)1 x- M5 y: k# N/ S& q4 _. N
                    Console.WriteLine(numw[i]);
: h# l/ y9 D" P5 G, X( s, p( p           
% Y. q; N+ k" y8 W4 T8 H            Console.ReadLine();
' i4 s3 p. A' W& e        }& x1 @+ \( {4 O0 ]3 [! {
    }. \4 D3 B: F; @- m4 y% p2 A5 s
}; I( ?- V* N8 v/ X
小甲鱼最新课程 -> 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-4-2 13:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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