鱼C论坛

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

猴子问题

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

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

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

x
大家好!
; g% S7 U# V0 W) U+ s这几天我在忙着编一个问题,我用了一种方法编出来!% l" }& M, u" K5 W  N2 M8 j
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
2 N# u. X$ n$ Q# U, L! P, [注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
# D# u. |8 ?( L. m6 p1 s/ P0 ]& j8 R; u: e- m

% c' c) N: V! [" e, f0 \
                            题目
, v; C  z6 ^0 R  q- o$ _山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
# [& f$ P% L/ A2 Q第一种方法:利用循环链表
. u* M. h- Q( B( ~1 K/ M8 N#include<stdio.h>) I7 v- `# ~* D' ^8 ]! g( g
#include<malloc.h>
6 m& ]; c7 t8 {+ T6 U3 q, p#define M 8            //共有8只猴子% f' s* d/ }& W4 g+ n$ P
#define N 3            //数到3只时退出第三只3 O9 m' ~# Q' V5 j, S5 _
typedef struct monkey
! k& ]+ I( H7 e  X0 ?$ e7 V3 b  t/ `{int number;9 v) s' M% C3 e: ?  c3 p' [
int flag;
. {' @5 C" Z5 X3 v8 x! n- Jstruct monkey* next;  ^# X3 k$ l2 h
}MONKEY;
7 c- t, x$ H9 c# l3 U8 f; qmain()
# U8 l) T7 X& N3 B) O8 B4 {' s{ MONKEY *head=NULL,*p,*s;
6 i9 g: d! l" m: r& o1 B' {  int i,sum=0,count=0;+ G4 m3 P: X* ?
  clrscr();              //清屏
3 a) ]' P0 L7 T9 |  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
& t4 g, `+ h/ M- }3 z% ~  p->number=1;p->flag=1;
/ E& X7 B& d2 H6 Q* I0 n3 b2 v& ~  p->next=head;0 y* d) a4 J" E. s- Y
  head=p;' s5 o8 k5 x6 O; Q, g
  for(i=2;i<=M;i++)
* D5 n' R: R' E3 V- \    { s=(MONKEY *)malloc(sizeof(MONKEY));
( w4 ]5 A" n. j/ L0 F     s->number=i;s->flag=1;1 U9 g7 G/ J0 o3 [1 p3 W* r: `
     s->next=head;/ a9 z, i* \- [% W
     p->next=s;p=p->next;5 y$ C# V0 k8 i1 ~7 d7 c% T2 X0 Q
    }
9 `& ^, K! B/ [$ ^: }! {    p=head;3 i, D8 a( `$ S/ b' p
   for(;;)
* f3 Y$ O1 C$ G9 e0 ?$ K* H5 w    {if(p->flag==1)
' t, ?- B3 A7 I' [' R       count++;
5 P% m# \) T8 D. f! c: q+ p+ D0 U     if(count==N)
, [6 y  d5 s- Q; M        {p->flag=0;
$ u- @# e: V4 H- x" z( }0 Y% L) b         count=0;* H! m9 I/ V/ h
         sum++;}4 S7 k# g8 @' ?# X4 {( ~, w1 Q
     if(sum==M-1)/ B+ i* }4 m* Z, B$ ?
        break;
# u4 G/ n" Q  e8 `; `0 m     p=p->next;. i$ ~0 M( {9 d" x( ]' W* x
    }( e6 C9 i; z; p
    p=, ]: o5 t! U) m; t
    head;5 h4 g" C: Q3 {1 W$ G$ _
    for(i=1;i<=M;i++)' T9 q+ p+ K/ z% V& l4 f
    { if(p->flag==1)
4 c& Z, a7 G! Q8 w        printf("\t%d",p->number);' O: R8 \: ?& |& {* ~
      p=p->next;8 w/ M+ r0 ~1 w
    }
6 u& j! G, J& W+ q; y  ~" `
* a/ `" x) F" m( B  O
) j2 _% P- s- q* X7 l) g2 V
% V3 U5 E1 T) r! L' {) X' w}

. |: y0 j9 N, Z2 L7 |$ `8 G第二种方法:数组
9 O8 L' C# s) R( o1 W#include<stdio.h>
7 `; _3 M: e1 u#define M 8
& ^- o3 n& h* g5 I; qstruct monkey
4 i- V& `  o4 {* X4 a9 q{int number;; X2 n/ F, r3 b# L4 O9 t# z
int nextp;
- d( K, p. x+ y7 j) _/ X}link[M+1];
" E; Y6 s) f9 A7 y  `8 q
- Z* g# M. G8 _void main()* a3 T' x; m0 x4 i! X, u; J2 U- \
{int i,count,h;4 {$ u' G, U# x$ G
for(i=1;i<=M;i++), X3 Z4 t$ J$ f" d1 J
{  if(i==M)- {9 A% y; G; m
   link[i].nextp=1;' x  t) v% [! J# V4 O" g* n* D
   else
2 |- X# q! J+ S$ g2 k2 \   link[i].nextp=i+1;
9 K# L& W6 m% G) w! q4 m3 f$ T  link[i].number=i;5 f  j* u$ o8 x& f! E2 K- D, X; h
}1 o8 X% e0 V- x' B8 P& I4 B
printf("\n");
! S+ a% N# Z; C2 b/ Pcount=0;: G/ w7 @  t$ B1 t; `" ^3 A
h=M;0 Y' ?' g- x2 \9 f
printf("依次退出的猴子: \n");
- M( W( }6 s9 b6 L2 C4 hwhile(count<M-1)
. e; U3 I9 d' {# H% d6 V+ o{i=0;
6 u9 r' Q0 p8 h% p. `, S4 `# z( Hwhile(i!=3)# S* ], q! b# L) W$ Y
{ h=link[h].nextp;: J- F- T4 w- q' G
   if(link[h].number)
1 N* [" V/ Y, @5 V& o8 p     i++;}3 @* `  h4 b$ C7 o5 v5 N9 p/ Z7 ]
1 k8 b4 j( J& \" _, ~
printf("%4d",link[h].number);1 r6 @- k5 j) o$ D
link[h].number=0;
8 q, |, B6 E' ^6 m# @5 Ecount++;% l8 h. A: R  ?( Q* [9 N8 Z8 Z$ S
}  E0 f& a; T+ q$ u
/ q6 g  S2 C3 u: B, n2 o! k
printf("\n大王是:");+ v* ?/ w4 [6 C: d
  for(i=1;i<=M;i++)
! ^4 f4 y3 X& Q3 z  if(link[i].number)
2 ?* x0 E/ u. {* X. J' q    printf("%3d\n",link[i].number);
: Q# A8 R/ n5 T5 @8 m0 _% o% M3 g& f, x6 Q; H% d

* b6 K! E2 u% e/ e# p* Y: f- z$ ]}
+ ]! N& z, R' a$ A0 s
第三种是普通方法for循环
! X5 g% S, A5 _  L
#include<stdio.h>3 J0 X" b8 J# c7 e+ @3 d% x
void main()" b. c& G; F1 w
{ int i,k,m,n,num[50],q,*p;
9 g" J. ]0 H2 r3 Y    clrscr();
4 M& q4 }" O4 r2 k  b. J- S   printf("input number of person: n=");4 k/ t; z) l9 |& G9 ~# Q  _# d0 S
    scanf("%d",&n);! a, p: r+ X1 k$ b* P
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只4 m# \# a# Q; c: q
    scanf("%d",&q);/ e3 `7 C0 k; t& K* y
   p=num;
/ Z! j3 H$ K0 G" t  for(i=0;i<n;i++)! g: ~: w: Y5 [
    *(p+i)=i+1;7 p& ?# \) O5 }% |: @; G
   i=0;3 q9 y' h8 E6 u- [
   k=0;
5 j. v; X6 X8 L6 f5 y; ?+ Z4 R1 a   m=0;
2 }6 [0 M, e% z+ @  while(m<n-1)
' ?8 {7 U, K" O* f% d* \   {if(*(p+i)!=0) k++;/ O. ~7 ~/ \; Q9 [! o; y
     if(k==q)( A! Q  d5 f1 l8 T1 ^
      { *(p+i)=0;
# X9 U+ O/ y/ j9 x        k=0;# D7 E+ B, A; v$ ]' _0 ]/ {
        m++;$ V9 y( N9 E. B- O9 W' y
      }
3 L1 P; N; P. ~9 }) W- \9 X    i++;. z  c1 n- u$ b5 N
    if(i==n)i=0;$ u* ?% r0 O5 t9 u; i
   }; O: i% R: @5 i- Q" X; S
  while(*p==0)p++;( b& M# e: y; X
    printf("The last one is NO:%d\n",*p);4 l+ E" `- e. Q& \
     getch();. W1 \; I# ~3 `8 D8 a3 j1 S7 U6 J
8 t( X& m( L' g( |; y
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;7 i2 r0 _4 H8 M$ `. W
namespace 又费马达又费电  V/ E  i; a; ^4 q. ^' _/ a; a
{
0 F: u+ e/ T" _0 O/ S9 c5 h    class Program
5 _1 n9 p0 O! T2 G" E4 h' d  r    {3 n5 C) f5 W* Q& \0 B
        static void Main(string[] args)& z0 Y0 `+ U* k$ s+ ^
        {: g7 e2 |4 L8 D( ?& p
            int m, n;$ |& k3 W! V" R9 @
            Console.WriteLine("请输入数组长度");
. f; l: z  f' t* c5 T            m = int.Parse(Console.ReadLine());//m为数组的大小
1 f* D& V" P5 V" `, M7 X' H* f            Console.WriteLine("请输入要截取数字的大小");; [$ ]2 q: y. o
            n = int.Parse(Console.ReadLine());
0 ^" w* V/ ]  n  E! B) Z, {            int [] numw=new int
* h: v" p. B+ \1 z; ?# v8 S) o& U! m, K( t6 |
&shy;&shy;&shy;;
5 n# T! E- \& `  R2 P, O            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数2 U9 T" I% i0 k' X+ L& {/ E/ _
            {0 \/ f% t& I( k, B9 q# e2 g
                numw[j - 1] = j;
) N6 p' c2 |% m+ E            }
  p  @2 {. V; g" @2 L            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
" \6 l" b; @7 }& R            while (d != m - 1)
+ [4 o5 ~" P2 \: v            {
; ^2 D# D: U+ E  p' v0 r7 E                if (i == m && d != m - 1)( u  a) p9 D7 e8 i- L$ _- N+ T
                {; I5 `3 i" g' |# y+ i0 L; D, H- _9 b
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!/ P9 o* o" s. s, Y8 o* R
                    continue;0 ~: K- _  D% c; n! a' N! y; u% ]
                }
8 B! _+ _2 I+ u. T9 @& F* b                else
( ^- l, ~4 U; G$ \0 u- v                {
2 g5 l9 D9 S0 V9 ?* ^                    if (numw[i] != 0)( P3 r; s+ _* S; }" P) }" W
                    {
% @' s: ^" U5 y7 N' m( w                        i++;& D3 Y/ Y  t) s" ^6 ?& m  h# g: K
                        k++;7 }$ ]$ _' M4 [9 P8 X: e
                        if (k == n)
* b& Q' I+ U7 ?# J, {. c                        {
  @# F3 i3 e  C, H( n+ r+ e                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
3 v* l' Z, q7 A$ J2 g! H* K                            k = 0;2 v; l2 m( o- [& e. r
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1% e3 s/ k. M; |* o/ s( N" N
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);5 f( i' L2 V& U
                        }; i/ W+ p5 K0 g. ~" h. `6 ?
                        else//输出暂时还没有改变数组元素的值
7 u, |5 y9 [" U; q                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);5 a* Q! H1 V- c
                    }
* n  P* ?: b( B$ [                    else
5 I4 D& f9 X0 h  P( q                        i++;//数组元素为0,直接跳过,不计数。。。
" Q/ _3 d& [5 g                }( Z0 R& l, t' T- b. _8 H; i
& {0 T: n) L( B: n

* P: G! _* G* j4 M! B            }//结束while循环& \, U8 [! ~4 E* I) t( x
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
7 K5 {+ V* o: z6 y+ A  z, K: H* q           5 M: @0 I' G, t+ {  j2 l
                if (numw[i] != 0)' M: j8 K5 b5 S  M, @0 Q! @' @9 n' p# }
                    Console.WriteLine(numw[i]);
2 l$ p% d* a" w/ l. O3 H0 R           
% x6 c3 d. {* e6 q- }2 z            Console.ReadLine();
0 F/ @( ], D$ ]1 K! w: W, i        }
1 P1 s/ U; ~- B8 y( E6 r) u% T  v7 G    }! Q* ?/ Y. M$ i
}# E2 E0 a# e4 K! v1 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-3-9 13:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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