鱼C论坛

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

猴子问题

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

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

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

x
大家好!
$ Y0 r/ G7 r, c  o这几天我在忙着编一个问题,我用了一种方法编出来!
4 v* `8 a5 s3 c2 e! d  K但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!% V' U2 i/ V1 _5 H1 w8 c2 o
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
2 O  ?; n+ A& K( j7 Z- C5 ^/ M$ c0 |9 X6 x1 v, _' ?

1 e/ a/ \7 U5 J. e3 _
                            题目* A8 _( f; i0 N5 ]4 N0 r  h7 d
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。9 c; o2 @  _& P1 W$ I$ Q4 p0 Q
第一种方法:利用循环链表
2 c0 o+ n  n" _$ Y% K% @& P#include<stdio.h>
0 |3 p$ N" G9 ?1 F6 C) j$ n, V" X% I#include<malloc.h>
* r9 F8 E3 ~0 \8 u6 \6 O#define M 8            //共有8只猴子
/ I, _4 S! A: j" @, k- o" `. Y  o#define N 3            //数到3只时退出第三只
2 {% d' n% ]1 Ttypedef struct monkey& v% @3 F1 w7 C" u- |% Z6 A2 t
{int number;
( n6 W6 n9 L. e# U1 H8 i  t$ oint flag;
- y( r  T2 r; L, `: istruct monkey* next;, f) j% b, `' w0 b& z, F
}MONKEY;3 ~7 {; {& P/ S8 e# k
main()( ?, `: X/ N8 S  j
{ MONKEY *head=NULL,*p,*s;9 B6 Y$ d3 Q/ y
  int i,sum=0,count=0;
7 d3 ?- Q" E5 ?  clrscr();              //清屏" ?  N" `% w- `1 n6 X5 U; E
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
. @" L$ l2 k1 S3 n" }2 `/ q  p->number=1;p->flag=1;
7 ]/ Z" S- c8 ^0 L: M5 t  p->next=head;
! k+ N0 y. h# `# C  head=p;# Z! K1 M! S% _/ d; l/ y+ @) x( c- h
  for(i=2;i<=M;i++)0 a- R( S9 N5 e$ j% Q) s/ \
    { s=(MONKEY *)malloc(sizeof(MONKEY));1 ]4 v( e6 W& b4 Y% e$ T5 y7 U# U
     s->number=i;s->flag=1;5 G5 L3 P. Y9 ^/ i
     s->next=head;; L$ W3 c. @& i
     p->next=s;p=p->next;. e: C. S: X" k2 D2 o/ w/ X
    }5 H6 l: g# X' l& e
    p=head;1 \  ]5 U- Q, i6 \; x- B  s
   for(;;)
5 s, Z, v. B1 B* e    {if(p->flag==1)' i4 S; Y: G, p+ H) b
       count++;' O. ]9 D  ^- W( E' L5 Q
     if(count==N)
1 n: x; K) E7 x8 w8 b6 G  G; m) Z) Q        {p->flag=0;
4 V$ i! {- N0 t& W  O- m* d         count=0;# A: a* F/ |7 W4 e
         sum++;}
3 G, K; b8 @2 ?: k. K; R     if(sum==M-1)3 P4 U, V8 d5 G/ V' B
        break;
# g! c3 A, j" K1 X     p=p->next;
1 J! `; c5 A" y6 ~. o% K4 k0 W    }8 p' U) W" x+ |( V, W+ A
    p=7 t# ~5 M5 y4 z4 @: K1 Q
    head;
& |+ J6 x7 M: k    for(i=1;i<=M;i++)& d: y  l3 l. \- H1 A
    { if(p->flag==1)) {" k0 o6 ^/ L
        printf("\t%d",p->number);
# t- @3 c) m5 u4 m% q1 o      p=p->next;
8 H6 ]7 ~7 M( s# k    }
: C3 ]$ x# `3 H4 a; }/ @% N9 i
6 e: E; N4 t  S9 p: K$ b& Y5 o, Y& A# {: I) E) d7 T1 n1 L

+ X" {; F5 @2 V- k8 g}

3 E3 A4 \/ l7 k$ {3 t+ r0 E- a第二种方法:数组0 M: ]  l8 q( G  T
#include<stdio.h>" ?% @) I, e3 X7 F
#define M 80 M: F4 e0 I$ A
struct monkey. S% R2 ~( X" H) o
{int number;
! r& e; J- A. R! N3 K1 d8 Kint nextp;
* P9 M1 i3 {: E: N5 m}link[M+1];! K1 \5 Z, Q4 o
- a3 G5 K. Y+ r" l: G" w4 ^: y
void main()
( z% Z* |' O( n8 I& S{int i,count,h;6 m" d7 r: Q- T& E, y* \  P' T
for(i=1;i<=M;i++)! z5 O6 S, u! l
{  if(i==M)+ R' f' j" c' A4 K& p' Q
   link[i].nextp=1;8 n* L; C# H) `8 i1 E7 n7 W& }
   else, w  f5 m+ u) K! ?. n( S
   link[i].nextp=i+1;
( \! y5 ~& ?- f' Z  link[i].number=i;0 |( k% {4 f* G) A. c
}6 s  e5 K; V( z$ C$ c# s
printf("\n");1 D( _+ x* v% B
count=0;
( J1 U- R% q9 f9 }0 th=M;% b* z0 T# a; r% D7 ]( T. z( r) G
printf("依次退出的猴子: \n");2 S; L. G& H6 Z' o3 f
while(count<M-1), n6 l8 c  B. o
{i=0;
7 b" J1 c3 Z# O; o1 O4 B+ _% Q# Z$ c! fwhile(i!=3)& f% q% a) d- i! D" |! p4 _
{ h=link[h].nextp;! N! ~1 O5 L3 K) c0 ?
   if(link[h].number), g  W6 G9 S; i  @. C& r( g
     i++;}1 l$ q5 A$ B* J: {$ {. M/ T2 z

$ ?( ^( a. l/ F1 yprintf("%4d",link[h].number);
* G! s3 O8 u) }7 tlink[h].number=0;
; X. g) e- F, y2 K+ icount++;
: \  C# U3 H. n0 v0 I}- V2 Q3 L8 v" b4 W' J/ R
5 o2 z' T! i& D$ O  q
printf("\n大王是:");6 r* u% E/ n/ F! u; X! |
  for(i=1;i<=M;i++)
) F6 E; c+ c4 |; O9 t  if(link[i].number)
6 l- Q- ?# U2 e6 n    printf("%3d\n",link[i].number);
6 \1 Y% o: s. S9 Q( \& N* M  Q4 b
; k. B9 r0 @3 x1 K  u
: p7 x# J$ C, {  ^) m8 O}
1 h. `- J5 @, D" E3 h+ Z  H
第三种是普通方法for循环
* }8 O. ]% e$ s4 q; x7 |
#include<stdio.h>+ v; H( P8 g; a/ O3 W
void main()4 k! h0 i8 N+ d( x  h/ E8 W
{ int i,k,m,n,num[50],q,*p;
( ]4 G, @5 \) _- W    clrscr();
( o4 K3 U$ U$ l" ^1 ~; Y4 t   printf("input number of person: n=");
2 {3 ?& n* V/ l( ~: F+ Q* b/ B% u    scanf("%d",&n);" q) R: j, G' @
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只. Q, h+ o9 \) h# Y( l/ m8 v- s
    scanf("%d",&q);
' g% Q; \2 b/ U" q3 `2 |5 \" T   p=num;1 X' u. T  N1 Z! k1 M
  for(i=0;i<n;i++)
2 b0 f. `8 u8 W3 {: Y) A    *(p+i)=i+1;
9 k- n3 o3 t* p9 [- H5 ^' p& P- ?   i=0;
+ |# r7 C6 K: ?; T$ z; v   k=0;
7 c' L9 r9 ^6 e: \   m=0;+ t& J+ W# T) ~- A
  while(m<n-1)
% |2 b1 |% z8 Y' i7 Z6 V7 t   {if(*(p+i)!=0) k++;
7 C! M# t' O$ C     if(k==q)- ?) ^/ U" M' \( Q/ j3 b. K$ H* _
      { *(p+i)=0;
' C% ?* m! [$ n1 b  q        k=0;4 S1 ]7 l) W9 }' e
        m++;2 x$ p; I( K" g; C( T( t
      }3 u& @+ P' T5 S: B, C
    i++;6 E$ A6 ^4 d/ @. o! x; Q
    if(i==n)i=0;, s1 f  G$ K7 T
   }) H3 O6 \, m  n' I
  while(*p==0)p++;* ?! x5 C1 A+ |
    printf("The last one is NO:%d\n",*p);% o3 e  ^& ^/ A5 F% \
     getch();
' R) v: \5 W" [3 L5 c1 ]( v# n9 y- U1 D( T
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;: }- M' k( x* ^8 |
namespace 又费马达又费电
" P' |2 q8 d' v3 r{
; y. G" Q5 {' F( h# v    class Program: p6 m  G% C3 R' X3 p
    {# _; k( j8 z3 O4 p" s
        static void Main(string[] args)
$ R8 e: X2 k5 _- F        {8 g) K3 {( @( G+ F
            int m, n;5 s, a& \, [( M1 z9 V$ n" M
            Console.WriteLine("请输入数组长度");! c% X9 a) n2 _
            m = int.Parse(Console.ReadLine());//m为数组的大小
) g# g, p) W- {" n- [            Console.WriteLine("请输入要截取数字的大小");
' l2 Z: ]  T- K! @- i7 U, b            n = int.Parse(Console.ReadLine());# w8 |5 R* |" v  @
            int [] numw=new int
( h  i% Y4 O% A$ h+ z1 ~6 @; a6 w
% J; T  D& G+ \&shy;&shy;&shy;;
* o# N8 u* J7 q# `1 y" ^  [9 ~% O            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
9 S. [3 L! G- o- H: t9 a4 F7 b1 d            {
! G7 J7 H, Q7 H                numw[j - 1] = j;
; G/ `1 v2 j9 @1 p            }
7 {* Y. t6 ~$ O- g+ o            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!+ U0 @* T% S3 F; C
            while (d != m - 1)
4 D% C! M1 ?  ~. m/ X/ N" x" K            {4 t$ ~1 \' c& e2 P: C! D  n: X  f
                if (i == m && d != m - 1)6 ~- ]; V4 f7 v- K! Y# _! D% ~
                {
9 R  x% |# u+ s, H3 m/ n" H                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
5 P* a0 m: k4 b; d$ h                    continue;
2 t1 W" S' |7 y7 v3 c# ~( K( @8 ^$ p                }
7 ~% T) ~1 C; \' s- K: C% I                else; N  `% h# D+ S
                {
5 a( r8 P0 O, ^& I9 ~                    if (numw[i] != 0)$ D+ k7 E4 m) i8 y' m
                    {5 y: t. ~1 e% [* ?: l# e! @5 C
                        i++;
6 F9 `1 N3 u* Q: t" h+ h                        k++;. L$ _. V3 V9 W+ R( Y% g
                        if (k == n)8 E* b4 }7 \3 o! M% e% d/ m/ M
                        {2 y( j8 T% `' |8 p3 k
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了: ^2 c+ W2 B  u" A, V  ~
                            k = 0;3 p/ m0 @7 S3 ~( v6 E  L2 v
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
# s3 _8 D9 u, w1 x. [0 k5 z! E                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);8 w) b' u" l6 S5 B
                        }3 E$ K# n0 d4 x6 p
                        else//输出暂时还没有改变数组元素的值
/ ~! S; S% \3 q: w) ~4 {* m. X                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);/ [; }7 x* x4 ^, `4 g, H! D4 K5 H
                    }
+ v, e; g, f+ D+ i                    else/ p" P) M0 a4 C3 ~6 e8 T7 y( C/ O5 z) j
                        i++;//数组元素为0,直接跳过,不计数。。。
3 R5 w4 |' H4 ?8 _: v5 l5 O                }
) v! {9 H6 e3 @  `/ Y0 v3 I 7 k: f" z7 l1 @# I

" c/ K7 I! O( u5 x. a7 T            }//结束while循环
" u0 V" Y* x5 E, b, K- _            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
) N& W1 e- p8 S2 L2 l7 U4 l             |& W2 |' c! w' ^. X
                if (numw[i] != 0)
, p! _2 _2 }5 D0 w2 F                    Console.WriteLine(numw[i]);
  b0 j5 o0 R) _& C1 K. W           / k. d' \+ w  P% n- G( F; j, N
            Console.ReadLine();
* x  r$ d! K6 m, P' j4 c        }7 l- m. ]3 p3 S9 Y/ C9 N* E* a# Z
    }5 t1 q5 R! B3 X6 l+ P: g% E
}* v" v: ^9 ~9 D7 m% ^
小甲鱼最新课程 -> 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, 2025-7-12 22:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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