鱼C论坛

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

猴子问题

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

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

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

x
大家好!
; f3 |& F0 a$ m) |, r% G( F' ^这几天我在忙着编一个问题,我用了一种方法编出来!
9 F1 q5 h5 C" b" N# [, ?) p+ |/ G$ J' T但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
* L: Q) C7 U! Y3 `  H; l3 m0 L注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ) V& i1 h6 b1 [# B8 V

3 g& s2 E, m/ w) K! y' e: z* |/ Z' g0 z8 A  R) K: y5 d
                            题目9 s8 c9 g5 H9 c* X, l
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
. R. z/ b& @1 S- h/ m9 K! K第一种方法:利用循环链表- N0 P1 V0 F  u, X+ f
#include<stdio.h>
% [, I- M# M& u) S#include<malloc.h>
3 O$ o* U# J  r0 u6 }& x#define M 8            //共有8只猴子, c5 h) X+ y- S& A% c9 q$ D) A
#define N 3            //数到3只时退出第三只$ v0 [+ e2 y" ]
typedef struct monkey
) z) Q2 X, U, _% l- q+ a7 w8 Z5 z{int number;' X4 H* [3 l4 ^- z) G
int flag;7 y1 b3 D3 [5 }8 c
struct monkey* next;
0 O; R7 ?. r5 P: g}MONKEY;
; e2 l0 p2 \) ]5 c; f1 ^main()
5 l' y8 a- {& z( v{ MONKEY *head=NULL,*p,*s;
" I- N& a) V+ }! e' t+ F* k  int i,sum=0,count=0;$ }1 ]/ t7 X1 r
  clrscr();              //清屏! r( R$ k; e+ Z4 z
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存0 O& f3 n) `" r) d3 U5 R* g! A/ p
  p->number=1;p->flag=1;
4 T! e7 o4 j0 h% l& G# s  p->next=head;
' }8 y6 W, l7 ^9 B% _) T  head=p;
' z7 v( t' y) U' C# O1 N  for(i=2;i<=M;i++)
' y2 I8 S( E/ {- n* {    { s=(MONKEY *)malloc(sizeof(MONKEY));: o2 F  Q( `5 A: p7 g# u$ v3 @; j
     s->number=i;s->flag=1;4 ]: ~  l) {' h6 `
     s->next=head;/ _  F8 t& ?) O& `4 ~0 r: Y
     p->next=s;p=p->next;
! C, {  H' W1 v% W+ W    }  B& {2 Q( t' x+ f
    p=head;
/ \4 i6 K7 q' O4 b6 Y" {   for(;;)
: W2 h' }6 `. c0 h    {if(p->flag==1)
# [2 }( n# B& j- h0 A% x       count++;
$ y1 c8 O% l! h5 ^3 X7 s' D     if(count==N)
) J/ S$ T' f8 Y" _3 a! b( i        {p->flag=0;
. {" K5 B  c, q3 W) H7 n         count=0;
% j0 T  U* z, [         sum++;}4 r* y1 B+ P0 d% D
     if(sum==M-1), s  Q. a7 W# @# T& }
        break;! ?. ~6 r) N! A# y
     p=p->next;7 Q9 f! s4 \" J
    }# O0 z  y6 x* i2 u7 d$ g+ ?7 t
    p=
) [9 n! L! S( ?; X. F9 y    head;
# k1 r- o5 Z6 R7 L6 O6 ?    for(i=1;i<=M;i++)
+ A1 a9 j( {% ~    { if(p->flag==1)
! Z+ o5 A& `4 G, e' ]        printf("\t%d",p->number);6 K* ~6 {  G! h! D* `* C4 K
      p=p->next;
/ l: L+ q3 j% q+ b    }
( t. H# F- L* U/ V/ H% u7 t: B  j+ K. {! H* ], t+ y

4 p# C; f0 Y9 x1 w( Z5 a) o8 `' o7 W. b) G! F: T
}
+ L" Z9 N: m$ D
第二种方法:数组4 D* q' |1 F# m; C, d. c( F" a$ H
#include<stdio.h>
/ z0 z% H0 L6 E1 R3 m  r#define M 8& U5 x' u6 w2 R5 O" r" j
struct monkey/ c- M6 J* v7 S  C! ]
{int number;
' S$ B( ?8 v& z% x& k0 o& lint nextp;$ a4 K3 V8 M, {4 i' r" F) z/ L
}link[M+1];
! W- X/ y, V. G8 y3 a: [
+ {1 j- L' z; D* p0 k  r% wvoid main()3 W+ H# X+ Z$ u
{int i,count,h;
0 v  F0 S! y+ q1 E: b, q% zfor(i=1;i<=M;i++)
5 j5 R: _( N4 b) h4 \{  if(i==M)
( A5 E3 m/ ?4 S+ [6 F/ e) ]$ u   link[i].nextp=1;
3 W' k, t/ E: T5 n# r   else
/ y& e2 ~* e3 D6 n   link[i].nextp=i+1;3 J8 \+ X( \& \1 e
  link[i].number=i;. y; V% x+ m3 t1 f9 E
}- G% _' J1 X7 Q/ c" u# f- p
printf("\n");
# T& K6 ]3 c) }0 z4 j& s2 k$ ]count=0;
. H1 T4 c$ u/ m/ ~2 i, b/ Qh=M;; ^" J( T. }7 y* v; f( C* @
printf("依次退出的猴子: \n");
" c1 `% F! J. m" P0 ^* D1 i' rwhile(count<M-1)& O4 [) b7 I2 F# K! w8 Y- h' l- ]) a
{i=0;( r/ y3 h& Z( A" n
while(i!=3)
% ~; A& m+ t* y# n{ h=link[h].nextp;  R) ?8 T  l2 X& r& `+ T
   if(link[h].number). }8 \; G* j. E1 r
     i++;}5 p3 G! E. q) Y' X( V: I/ z2 b2 Y
6 T# g3 Z. `3 k" y* d( g7 {3 K
printf("%4d",link[h].number);3 S" \  Z3 a* ?# _, r8 _
link[h].number=0;
- I2 f. p% h" d7 ~: p8 gcount++;
/ V, s# [+ A4 R}
, m' {( y2 L5 t! n9 D2 a
6 l4 d. S% V; b; \% Bprintf("\n大王是:");$ f5 @4 B" e. O& _, h2 Y; Y3 P
  for(i=1;i<=M;i++)' I( N/ `7 Q& P0 ^* _# q
  if(link[i].number)* `' @: E0 {4 M1 ?2 c) u* L
    printf("%3d\n",link[i].number);% ~3 ~  \% u: K$ o9 L

1 ~" L3 E* u$ F2 T5 s! N. {$ O5 w! t% V$ R( e1 T/ @5 Y
}
( z3 C7 L3 f% d
第三种是普通方法for循环

0 ?9 B: M8 r4 U9 h# b; D  H: u#include<stdio.h>
5 P- B, w3 m; zvoid main()
$ V$ G2 L  d% y6 W/ a{ int i,k,m,n,num[50],q,*p;
) c5 I$ F$ {; N    clrscr();
2 W- u" C$ F9 Z& j; i" C   printf("input number of person: n=");+ C* ?- v8 f- [  [# m/ g$ O
    scanf("%d",&n);
* D5 B5 q- D0 [. j" Z% qprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只: H0 Y! `2 ~& f% u
    scanf("%d",&q);& |/ _0 u! b: e2 Y! h  `
   p=num;
. X+ A4 m' \9 z+ @* m+ ]8 N+ t  for(i=0;i<n;i++)+ u( Y4 K9 K0 c1 m# f$ H; X
    *(p+i)=i+1;' p: T* j( _! {4 U1 U, U3 s
   i=0;
3 w: O9 ^- k2 W( g3 w   k=0;
* V, j& N& ^! j1 c0 L; q   m=0;
7 }# }9 q* _$ L/ g7 z# v4 q  while(m<n-1)0 ?3 q2 N+ @& ~* ^+ J
   {if(*(p+i)!=0) k++;3 }$ p, \$ u) w) w- ]! |6 L
     if(k==q)+ J; a1 B  K& P4 a2 x
      { *(p+i)=0;$ L' y; F1 E) X; E# I
        k=0;5 K( k; Y" s/ G2 y8 T5 F3 x
        m++;
5 K& Q! i7 R! F6 e5 M      }) k% }% G4 e  f6 A2 m
    i++;
* X  E3 F: J6 v" U' g    if(i==n)i=0;! B* c: w; f8 ?- \. H
   }
8 A1 P2 Z* l* Z1 T2 ]  O3 c$ d- B  while(*p==0)p++;
  x' V1 J) `; d0 d# [) p    printf("The last one is NO:%d\n",*p);
7 Y$ U, [" ]: Z8 N; i5 u     getch();
" Z; C! _9 {4 f1 @7 p4 X7 H4 X+ Q: S0 f$ p! \  I
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;0 O) E) ?, [8 V  g0 n1 u! E6 z: H
namespace 又费马达又费电
$ p5 n- W) ~: C{
% u" |# D4 Y4 l9 `/ }# _    class Program/ Y# ~4 E& V( v
    {0 B( v2 s8 R) T& S! T' X8 E
        static void Main(string[] args)6 J8 g/ y* ^5 R
        {
  `8 c% L7 _' \, N5 H            int m, n;8 H$ X/ k& A. S2 ^, O$ P
            Console.WriteLine("请输入数组长度");
+ `1 i9 I: Z8 J( \6 k. N& E            m = int.Parse(Console.ReadLine());//m为数组的大小
$ l. o: M- L- V4 {5 k            Console.WriteLine("请输入要截取数字的大小");; p/ x# v! K0 c! F
            n = int.Parse(Console.ReadLine());# F& _( N' h3 H0 N3 I" U9 H7 q/ Y
            int [] numw=new int$ O/ ^; U  _+ V
, {% F; f9 \* R6 B9 ~5 @: V# e% u; q/ z
&shy;&shy;&shy;;& e; Z6 I: g9 s( _% h9 m
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数$ N$ N9 f9 y7 M( Z- R7 b
            {
8 N* K+ L- n- i7 O1 P( \$ x                numw[j - 1] = j;5 X6 C# |7 o* I* B1 O( B8 Z
            }( J0 _, W1 j: D( H# U
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!9 R0 ^% u, _7 W: o1 h* a0 A
            while (d != m - 1)
" A% A" a' d3 [) G            {' I* g; p. A, F6 U& O: P
                if (i == m && d != m - 1)
4 c0 t* \: s6 ]3 g/ e                {) q: |# Q; L1 t+ e7 W1 z
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!# L- V5 l/ |6 i' ]
                    continue;
! S3 N1 M$ q2 T# {                }+ b( u6 x& I+ \+ f
                else
1 |5 A* k5 |! z/ ^4 o                {* [, r( \- k0 x* Z; \
                    if (numw[i] != 0)
, w4 k' _7 G# i  X                    {
0 p, m  \) a7 ~7 \* o1 y                        i++;. V3 H  m4 b- A
                        k++;2 _7 e: }0 O. M  e* p' a
                        if (k == n), X6 A0 E8 Q& N6 F  I
                        {2 Y% {. I! Y+ B
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了# o7 E5 _' y( H0 `& d
                            k = 0;, @# F. V' j/ F) {7 `+ u
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
, W5 l: I( G! v6 f                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);6 n9 r$ c6 @. t, J, p5 k
                        }9 H1 Y$ _7 h& [5 X) q
                        else//输出暂时还没有改变数组元素的值
. Y# l" l9 G7 U* I1 F, L+ l$ l5 O: o                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
- O' L1 G0 S' K                    }
0 K8 h! @) ?% j  K' r$ B                    else  h+ v8 y  p! x5 _
                        i++;//数组元素为0,直接跳过,不计数。。。! G+ x: I% t) V, R8 b% Y
                }
1 }% \' f% e3 d ' N! u. a9 `# Y- [6 u
  V: q% x' o! \/ S9 x/ x
            }//结束while循环- u6 J5 F; ^4 t: B( T
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
% z" `8 t. D  R: x0 ~, o           1 U+ }$ j  g& l0 `' K% ?
                if (numw[i] != 0)* {2 L8 h; f+ t# l& s" R
                    Console.WriteLine(numw[i]);) q8 i) ?; [4 ]7 k/ f$ i5 y
           1 K9 S4 p1 }+ \6 E6 P* x; q
            Console.ReadLine();8 w8 d) D; Y* {. Q
        }, b5 v2 T; ^+ v5 _  v1 K# m+ H% F4 K
    }- a( n/ Q) p7 z! b6 t+ g
}
5 M& j$ x! d- \. `: |
小甲鱼最新课程 -> 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-1-9 08:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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