鱼C论坛

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

猴子问题

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

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

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

x
大家好!& Z" s# ]6 Z- n4 W. U( N' c3 U
这几天我在忙着编一个问题,我用了一种方法编出来!
! F- I( m/ q" h- M. C' t但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
# E- s2 S5 q: X& a2 @& J# Y0 ]注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
% ~/ f$ M/ q( Y$ `, \, T
+ _4 h, ~) ]8 I$ t
0 i$ e3 W1 z; W* L6 S% `
                            题目
. f, f6 D( j" O; N- w山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
2 \- k6 j7 Y2 d# h  I第一种方法:利用循环链表
; C) x, R; c' Y% Z& K#include<stdio.h>
, I1 _! D7 R# c#include<malloc.h>
5 q' h' N& z* f; C#define M 8            //共有8只猴子& P! P, `0 f. O* A9 R2 ?6 S4 o8 M
#define N 3            //数到3只时退出第三只
- {0 U6 a$ b" }9 Z6 A( Z8 u0 ktypedef struct monkey/ m& R1 o! z1 m& J7 I8 }6 V
{int number;6 [3 y: h& U; `+ N7 t: Y, f
int flag;' {, a, b/ I. ?( N. Q  G+ r: B
struct monkey* next;6 Q5 Y7 Y0 t/ u  a
}MONKEY;
+ `! b8 {4 f( m6 X! x$ [# j' ^main()
; V8 g$ a# q  D8 B+ A{ MONKEY *head=NULL,*p,*s;- P  \- D  q5 \! g) V; D
  int i,sum=0,count=0;
- q2 t. I$ o) \% k  clrscr();              //清屏
/ U2 E+ K2 r8 m  d: ^( a, |$ @8 b" i  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存0 a! Y& A5 _+ r% a5 B; l
  p->number=1;p->flag=1;4 T3 i5 d* z6 v$ `. T2 C2 L6 H# g5 u
  p->next=head;: \  S4 E2 o1 p; T3 R) l3 h
  head=p;
$ N6 s/ }: E) p) n/ p( L/ K  for(i=2;i<=M;i++)+ J' I. H. |1 Z7 k
    { s=(MONKEY *)malloc(sizeof(MONKEY));0 A; d* e4 Y2 a1 q$ E% F
     s->number=i;s->flag=1;
! t6 b9 d, E) j0 i* u     s->next=head;* e  ?9 s1 W# T( \: W. ?
     p->next=s;p=p->next;
5 ~: F7 G( m- d9 z$ B7 g    }
: y: e0 m" j7 X  _  Q! R! |    p=head;
. r. b4 G$ ^/ h7 b- _   for(;;)9 k- ~. o' k& R$ n1 `  ~
    {if(p->flag==1)
7 s4 ^2 Q- e% [# ]* I0 F; v+ W+ d       count++;
( i3 r- e) r6 i) b6 G$ Y     if(count==N)3 g+ L) S4 w% R9 B# L8 s# x  T
        {p->flag=0;4 l" q8 @+ g1 u) T; g
         count=0;2 F8 D  P2 k0 z  Q# U% O& R
         sum++;}
% r. c( ~5 a( J     if(sum==M-1)" e; {8 S' W/ ^% `  h( F0 D1 l
        break;
" b6 _" [) [* q5 j" l. O     p=p->next;
. G: J( ?, d. b* c/ x0 E    }
/ k4 n* B# |- N. D    p=
9 D/ C+ j& [( R' d    head;" v4 @( S  ^1 S: O# a, a4 Y3 d
    for(i=1;i<=M;i++)0 T! P$ ?( V4 O0 f: H) d
    { if(p->flag==1); }, U  I1 v* F; |  I
        printf("\t%d",p->number);
+ `4 k! s/ b, [$ e0 D8 F0 S      p=p->next;
  @: o, n, G% u" l& Z( ]& `& a    }, Z7 T$ E- k3 G

7 E  w2 ?& u, x; G+ Z: B2 B7 c' e- u1 |" O8 V
9 `7 w( m* W+ R  c9 H5 Z+ L
}

% `  c  `' m! P第二种方法:数组& C5 b1 V# H' k7 _5 b; s  {
#include<stdio.h>% u  B3 F* z, s! [
#define M 8
+ L* b' x8 w* B' l( bstruct monkey5 C2 A, V" X3 u* `) L
{int number;
" K3 X( {$ k, d9 r# B+ Y5 K2 }0 ^int nextp;9 n$ M+ ]; c# o( C" |6 ?8 }4 a1 N. e
}link[M+1];+ y+ o% W9 X" b% E8 J9 t, a

! ]( o  m0 }4 e" Qvoid main()
) ]. f$ [, {7 V2 G{int i,count,h;
  l) Z! N# D0 {9 r1 g6 u6 L) Wfor(i=1;i<=M;i++)' E0 [. p" o0 }  p8 l
{  if(i==M)
, I0 v" r  O: W5 _- j   link[i].nextp=1;
$ u! d2 n5 ]* ?3 E3 K) j% Z   else+ g" @6 T( ~9 c, E& a
   link[i].nextp=i+1;
+ B9 J- f9 r- U  link[i].number=i;& ?9 [& Z2 g5 E6 t8 h
}+ ?* q! G4 I% h5 |) j( @
printf("\n");" A2 s4 {; \8 X$ S/ e
count=0;
% a  [" x3 Z/ m* g  H3 y+ Gh=M;
/ S& g$ \2 M4 o- \* uprintf("依次退出的猴子: \n");' u, L5 |, H# n: R2 V' {/ @- q
while(count<M-1)4 X7 f6 J7 A: _0 m/ c- `5 p* G
{i=0;( s2 q2 B0 J: o$ r4 o
while(i!=3)
  S( J' P! e0 o0 j& z{ h=link[h].nextp;
4 c2 o, s$ `1 V. D$ ]   if(link[h].number)
) z6 c, S4 v% k1 p! t/ ?     i++;}1 b/ U  O& c' `6 e! _# u, q: b2 h

0 W" G. S3 c2 \) Y' jprintf("%4d",link[h].number);
4 j7 M5 n8 W# Xlink[h].number=0;; [1 A9 Q, N) C# \( _
count++;
0 Z. v% L1 M) o}0 M1 }& O: A- }! B  v& D2 j
3 H. V5 C2 @3 ~* s3 }) g; `
printf("\n大王是:");. p1 N  ]% P9 ?  Z* |. u
  for(i=1;i<=M;i++)
. V) ^0 c- W2 L) d; F# O  if(link[i].number)
8 \. R0 j. \/ e: j+ m+ }; F) C    printf("%3d\n",link[i].number);
/ Y; w2 t; F5 m8 p' }
% ^/ j' ?* @8 r' A, f8 j# H
6 s/ T+ ?. G9 Z. m  C. D- }% |( x}
1 }7 d1 b7 c7 X' }% y6 c7 _
第三种是普通方法for循环
2 }' c$ f* f* O$ M* E  t
#include<stdio.h>
* Q) r9 Q- v3 K1 K  dvoid main()# A8 x. P' @8 v6 s5 \6 f4 [
{ int i,k,m,n,num[50],q,*p;
/ Z) C0 d( K- Y! d- G2 B. v, B+ a5 O+ v9 t    clrscr();* n* g! k. f, y0 O- c; I% h5 |" J$ ?
   printf("input number of person: n=");% ?" `3 K1 k1 {4 Q
    scanf("%d",&n);
5 B" U. J% y; m# B5 m) Lprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
+ L: o- T" v3 b# H8 @3 |    scanf("%d",&q);4 a6 P( z/ Q1 T' @
   p=num;# L" v# m/ L3 N- B' e/ E/ a
  for(i=0;i<n;i++)
% E8 H  f; H* @; ~    *(p+i)=i+1;- G1 r! a0 C4 U4 Y4 C& p3 v
   i=0;
+ e" X; ~  G4 H, U! b& X   k=0;
& h" c4 n, t  X* X   m=0;
7 ~. A; Q1 l, u9 O+ F' d  while(m<n-1)
& \5 z9 y/ c2 j3 {7 n   {if(*(p+i)!=0) k++;
2 z" W( c, C! o( P# q     if(k==q)' }# S3 C# R. Z% k  [
      { *(p+i)=0;
" W$ O8 R- b, l: a# }+ C5 `. Q        k=0;' `3 R  S' Y% I/ i' K
        m++;8 R2 g6 q- s' A5 u8 x
      }
( C  z2 n8 I0 ?' K- i" O2 W$ J    i++;. y! o; W- q$ w0 _7 k9 O
    if(i==n)i=0;
, S9 F: y. K4 k2 I   }
! S% r( ^# A% v& T9 C9 X0 b* Y  while(*p==0)p++;
& g4 \; v: D, i7 ~& j* S    printf("The last one is NO:%d\n",*p);1 j' J) V) e5 E) b$ o* N  X
     getch();7 {: W$ B5 ^% b
) y7 E* |, H2 S
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
: H3 D' _* p" b1 l; X, Inamespace 又费马达又费电
3 n% Z- w$ A7 R! v! {& ]! p{! t9 R# k! @4 K
    class Program! T8 V  N/ z& g/ f7 d
    {9 C+ x, H% j# p& v; U1 w7 k) b8 {
        static void Main(string[] args)
, \- D; V  m9 G/ K- A        {4 [5 k; ~3 ^0 [1 v0 ^. e' ?" N6 V
            int m, n;
9 R$ K; o5 }! [            Console.WriteLine("请输入数组长度");
: k( ^# D/ n5 L) v7 w            m = int.Parse(Console.ReadLine());//m为数组的大小! `" D; [& S6 Y+ l4 w) i
            Console.WriteLine("请输入要截取数字的大小");% r, Y: ]. A- s' I8 Z3 ?! J* l
            n = int.Parse(Console.ReadLine());
8 I, M$ M& l$ E% V6 a            int [] numw=new int
' C3 R! n. y% k: Y4 R6 F7 V" A2 {0 c: r" q
&shy;&shy;&shy;;
# ~8 u9 m( ~& C7 d6 F            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数7 k/ w/ e  S6 N2 D+ ~2 R2 E1 B
            {! r) I8 a9 v, v$ o1 }
                numw[j - 1] = j;
- J8 W" w( M! z  p! [" v2 d$ x% g            }
6 t/ o- R# z! P5 S2 a            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
8 f0 N" |$ Q, ]4 ^            while (d != m - 1)6 }7 W( B, y3 ^9 M' J8 H5 ]' F' V
            {
1 V8 i, v* O! W/ E& a, I- I7 y' W                if (i == m && d != m - 1)% G$ V- P' O; z+ |& A& P; B
                {3 A& \" A0 Q' ?0 }3 A. j
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!! f7 o3 {! o4 ~4 L/ S1 _8 l
                    continue;$ D7 ^' G3 R1 p5 R0 P  t
                }( W. l' \* a' F, @# f  `
                else
5 ~0 T8 i, B; e8 c                {
; a  @& y2 y2 u& P; E# r                    if (numw[i] != 0)
+ s( @/ f6 f+ T: I0 @& b                    {: z$ T( K& b- V2 c/ i
                        i++;
5 L5 i3 R( |; b: S8 T: N                        k++;: `, m  n0 F+ x- B
                        if (k == n)
% ^$ y# t9 b' i$ l                        {
5 G9 s6 d/ Q% I) L4 L2 q                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
  Y; A0 ]) n# I1 U: L* z$ Z                            k = 0;+ B+ |5 X0 R  ]' c' N
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1# n' V* J3 Y8 h4 v2 E9 Z1 B! K
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
0 ]5 z4 @) u0 v. p% B1 F# Q, I3 V9 A                        }/ [6 }$ L2 k$ I% |# X0 n2 t
                        else//输出暂时还没有改变数组元素的值  M) P* l% @" a( x$ w" c/ I
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);: Y1 V$ C1 T9 i: t
                    }0 |: h9 F4 Q$ W9 p5 O
                    else% B9 I! |$ I  r
                        i++;//数组元素为0,直接跳过,不计数。。。- z0 h% ?* Z7 b& E; i8 p
                }
& O3 y  I4 P& V7 p 8 a( X( |1 c0 {! j
6 i/ ]( R+ c3 p
            }//结束while循环
1 R/ x& W8 w+ J5 {2 R) U            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
9 y( W' }; M& v8 E" ^# b           
2 z8 E  G" Q# ~6 f$ P4 a5 [                if (numw[i] != 0)* _& t4 Y9 w. c% O
                    Console.WriteLine(numw[i]);
0 H1 L' |' s- z+ S: o/ d           7 D1 B: {: V. \: F
            Console.ReadLine();9 ]2 \/ w) p# L0 k6 d
        }5 q3 n' H9 X) P* l2 C
    }! Q0 h- r4 ~$ M1 ?( _
}; m: K0 N! ~; b, z3 W% ?
小甲鱼最新课程 -> 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-6 19:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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