鱼C论坛

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

猴子问题

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

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

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

x
大家好!
. K! k# O* R# P4 C3 P这几天我在忙着编一个问题,我用了一种方法编出来!
0 a( o; X3 A4 L) u( X. a( i但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
7 X" h1 @: J9 B# J, U, [/ M注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
+ g! D& c4 n9 P5 a( d  X
5 }2 a$ `: n6 m% `, G
/ h2 R8 ~/ v5 d
                            题目
. W" y: V& f5 t* T( r& k山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。4 {6 t6 B, R* E' E' f- b# i
第一种方法:利用循环链表
2 Y1 B( @/ t; |#include<stdio.h>
% Q3 P9 y% L- a5 t. I6 h0 i: h#include<malloc.h>
/ V. f+ C# k5 y& r: C' j4 n#define M 8            //共有8只猴子& G, q$ H3 r# ]+ E; Y$ u" g
#define N 3            //数到3只时退出第三只
& E! V# R, U/ P$ z: t) ntypedef struct monkey
9 c7 {8 y2 A( W$ L% S{int number;- G, F, z# a  Z, n  @2 m
int flag;5 g9 d" ]" v2 y. D
struct monkey* next;  a  l2 Z: t0 i% v! \
}MONKEY;
! Z" ~" D+ C# U/ `1 g: Qmain()
3 F; f+ S; z% x6 h& J3 l/ d; u{ MONKEY *head=NULL,*p,*s;; [5 C; N% @7 B8 a0 Q' B
  int i,sum=0,count=0;
/ w, X- C4 v# R  clrscr();              //清屏8 K" H6 y, c/ d) U9 x5 s$ {
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
; y" g) n3 H& Y* Y& _/ i, X$ w  p->number=1;p->flag=1;& }% K7 U) I. [; z& N) F3 O4 u! a: O
  p->next=head;
4 G+ `0 i! y5 r  head=p;
! J% d, W$ K& X( C$ o  for(i=2;i<=M;i++)
9 ?! u0 x3 |- l$ H    { s=(MONKEY *)malloc(sizeof(MONKEY));3 k8 q9 X/ V4 t! c
     s->number=i;s->flag=1;
% {' u7 T0 Y4 U# n! y7 U$ @" @, k     s->next=head;. S' H; M4 O. L- \
     p->next=s;p=p->next;
* }- C3 O: S1 x' E( @2 H7 a9 k1 V    }" J6 u' w+ l% l8 A5 Z8 t+ D( p
    p=head;: m( _3 g0 Q* T3 y; f" @! C
   for(;;)
2 P4 Z9 b1 W) P+ {    {if(p->flag==1)
3 Y0 R$ r, O; m- ~+ E; U3 V; E       count++;
! i, r. p2 Z, g     if(count==N)8 Y& e! a3 \" k1 E
        {p->flag=0;$ p/ q# z! A3 g1 r; ^$ \) N2 I
         count=0;
4 e9 i+ u; ?+ O         sum++;}& a7 \& _! h: H1 K- p1 \
     if(sum==M-1)0 a5 |$ x; y6 T* p7 ^% t( ^
        break;6 N/ |, m8 Z5 v( O
     p=p->next;; q) X: v7 V, C1 E+ A$ j
    }
; }5 B, O+ D4 G4 X. @8 ]9 b; o0 S    p=$ H7 @) [, ~% L; H/ e8 h
    head;
3 L) E: H" W) b0 p; z    for(i=1;i<=M;i++)" G: y% a8 [! S& Q4 U6 o9 f
    { if(p->flag==1)4 N% P; ]2 ]4 o; Z. s' q
        printf("\t%d",p->number);
- N" u, H( E- y& L9 u1 X      p=p->next;8 L5 n% S& s& }' b
    }* b4 f0 r# n: N$ V% Y

; h& E% b) ]4 j3 p6 A
8 O8 Z) t/ l6 E  r1 O- J' b
4 J; g- K) J, w/ j}
- h# w9 W* Y% D0 p7 A
第二种方法:数组( Z2 V0 o: \9 _- B7 o: ~1 m$ P
#include<stdio.h>5 r( d% g' X( R! @) V' A
#define M 8
- w6 S3 M- V1 _* estruct monkey
9 l  T6 `9 L  j7 y{int number;
6 d4 X& A( i, j: i" v$ [/ yint nextp;3 C* z4 W/ d' Q9 k
}link[M+1];5 o# M+ `# U+ q

. B* m/ `, ]& M3 x3 |void main()6 y" O. f! y; }7 _0 B8 o) R, g
{int i,count,h;
: N; D$ v) m! F/ R3 t$ ffor(i=1;i<=M;i++)
( \! w& T. T, r- h+ }{  if(i==M)1 r; g! o( C/ s" V9 w
   link[i].nextp=1;
( i6 Q* g8 H* I, E' K9 E/ _& C   else
1 L+ h" O0 ~8 z  R* k   link[i].nextp=i+1;# a9 Q4 |3 V; b, ]* M3 U% C' e& q- V
  link[i].number=i;
8 g6 `" @( \. G}7 d) T# K) d3 o
printf("\n");8 P/ p! g2 B0 x
count=0;
8 G/ a  S( h: C7 l6 d3 w& [* ]h=M;
+ h+ T6 L% m) m, a; {/ a% aprintf("依次退出的猴子: \n");
0 B, k/ C) r. `8 Lwhile(count<M-1)! b) V( z. ~; h* v3 \2 {
{i=0;
# s7 J" l0 G; ]! E; ]1 Ywhile(i!=3)5 x8 Z3 C) ~# U! d, T
{ h=link[h].nextp;, f0 Q4 N+ s8 B2 |! o
   if(link[h].number)
- i# N3 W2 |/ M$ x5 A( J  D2 o     i++;}
! R5 k; @  Q3 Y$ @: h/ C
  u8 f. r. L0 X+ n6 C$ }printf("%4d",link[h].number);
' t$ e. Z0 `3 D2 O8 \2 Ylink[h].number=0;4 M3 Y0 u, P- x
count++;* Q- b2 @6 ?5 J2 W6 h' ]( i9 G
}
; F( U/ |7 c# X- _) S# k/ ]% F! ]/ J0 f( ^8 L
printf("\n大王是:");
+ A8 U5 f0 ]$ d) S  |8 p  for(i=1;i<=M;i++)
5 o/ B" W. \3 r# _) i  if(link[i].number)
* M  W7 x$ t1 ~% Z4 {' z% h    printf("%3d\n",link[i].number);* g) T* W% i$ l: v. o5 E9 \

9 X& L$ E( ^8 K  C1 v3 J+ B) f# C/ f7 E6 J
}

7 z, ^3 Y/ }8 G* }第三种是普通方法for循环
9 a% K+ |, N9 O# u  m
#include<stdio.h>" U0 }; o! o( l3 S  u' X
void main()
0 Q: N: @8 f1 C9 ^{ int i,k,m,n,num[50],q,*p;, D5 x7 n3 Y* H4 y. U7 x$ ~
    clrscr();
9 J" o% o9 }- R: b5 v6 g   printf("input number of person: n=");; f* ~2 h0 _5 i  _
    scanf("%d",&n);
, H& i: k7 w9 d! r5 t1 ~6 a* K- nprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只- }# O# `* E' d, b+ p; s
    scanf("%d",&q);
0 @, K/ n# \& k$ b3 w$ a   p=num;2 L# [# Z3 p9 _9 }/ a4 K$ `8 q/ S- G
  for(i=0;i<n;i++)5 {0 Z5 a: [0 y
    *(p+i)=i+1;
. e0 q5 w3 {0 Z& J3 E3 |& ]1 G   i=0;
  @+ {- n5 i1 c6 a; p2 N   k=0;
* c% {- J: E0 q8 _   m=0;3 c- ^# h3 ^+ S% ^8 R' Y3 d1 t
  while(m<n-1)# v8 i  ?- V( k
   {if(*(p+i)!=0) k++;1 v( E2 X$ C' L. x7 L- S
     if(k==q)
9 P6 f/ n7 z& W2 {* f+ ^: `; J      { *(p+i)=0;6 u. f/ p: }6 ^# r, e
        k=0;
" p- Z) {& P( W- p) M1 K( J        m++;4 `$ ^/ y: c& b
      }
. m5 z! {! m+ [    i++;
" E; j0 \8 I4 U* n0 I1 v    if(i==n)i=0;) f) u8 ?+ q  ?) a( l' K- G
   }
: b, b$ D2 [# r  S4 n  while(*p==0)p++;
0 x& P+ y2 H8 ]6 f    printf("The last one is NO:%d\n",*p);
5 B2 L6 U: Q; m) p9 [' z% D* T: ]- l     getch();1 P5 z, s% w' _0 L+ h
4 A1 [& X% `! p
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;" S( V; h- k3 Y( P4 A# N
namespace 又费马达又费电6 Y5 E* N7 S3 y  X
{% G; S$ w# O% W# z0 I
    class Program
5 K( n/ g2 C: W( b6 z$ k    {7 H( v8 z( ~7 K$ i9 D# q
        static void Main(string[] args)
4 e% H4 U# Q& {6 J& i+ a% L4 {        {. x# [) p+ x  s( w, g
            int m, n;3 P& s4 W9 D" I+ R* }
            Console.WriteLine("请输入数组长度");
4 @8 s) _. ^, H+ Y% A! R            m = int.Parse(Console.ReadLine());//m为数组的大小# W4 Z) A: ^' d8 j% n9 D" W( `
            Console.WriteLine("请输入要截取数字的大小");, t$ d5 M- a" {& J0 {) }7 G7 s
            n = int.Parse(Console.ReadLine());
7 N# h1 ?3 ~  @! v: @/ j) s4 a            int [] numw=new int
0 A! d7 m' _: q  y& A2 z4 I
( X% t3 l7 p8 R0 h' V. J&shy;&shy;&shy;;
$ i" Z. B" T1 i0 O! f, H& x3 l            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
2 I8 k& ^6 l% H            {
; l& Z) |. r( `; s9 K6 U6 f                numw[j - 1] = j;, g0 S1 `$ x7 a' t$ T
            }
4 d- y7 i5 F: x: }3 C2 O            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
* F0 Z, \) H. N+ @- q- R) N            while (d != m - 1)# g4 q4 n% W' \  n7 x/ g
            {, }* y: F6 R8 U
                if (i == m && d != m - 1)
+ w3 r/ b; G" j4 e2 I% o                {
7 F5 B  B8 R% h                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!- Z) G3 O5 t% O. w% P* X* m: b8 c! M
                    continue;# l0 x$ H6 n! `& `5 o
                }7 V& p# n: M" ]# ^+ o6 d9 x
                else, Z) L/ o+ F& X  q" B. \
                {* |  R! r3 l6 |4 x' c5 q6 e
                    if (numw[i] != 0)9 p& N; {  ^  W4 @+ F5 T
                    {) _$ R, i3 d% w4 i2 b. m# A
                        i++;$ z& e' n3 @# g/ i. U- f2 E
                        k++;' ]; t+ `" y; l7 E
                        if (k == n)1 P# }1 N$ N& A% p9 T
                        {
* j$ A8 R' E7 T+ {4 S                            numw[i - 1] = 0;//把在n位置数组元素的值改变了6 J3 j# O7 E% {, `: v; {  n
                            k = 0;) v5 \% C; G& ^9 w
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
  ?: R7 O5 i5 C                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);: f7 L* v8 \' B- v& C7 q
                        }) s2 |5 @; h/ T: f5 l# e3 s
                        else//输出暂时还没有改变数组元素的值1 b6 W7 ~/ V( v1 h7 y
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);1 R2 G! w  ^1 J  }# X+ ]
                    }
' X  _! t& R0 _" J7 D/ _4 p0 a                    else# w! {* Z& _3 S; H1 P1 l$ l
                        i++;//数组元素为0,直接跳过,不计数。。。
8 t" C1 r9 @& P) C$ d. N+ ~                }
: s4 X" F6 \" b% W& e% c2 W , g5 Z+ E* @8 |

. ?* Y+ w* ]% B1 ]( q% b            }//结束while循环
* k. |) F; D6 b$ P7 a            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦6 v6 h; P( @5 _% n+ z  f  x
           4 F$ y* Z# ?/ Y& l3 [! o3 R
                if (numw[i] != 0)
) d) k$ I9 q) q3 S. F  M2 U                    Console.WriteLine(numw[i]);( `, j0 h# K3 j$ [, q) C; \
           
7 z5 x2 m" k6 o% }& W            Console.ReadLine();
$ i* [2 A. F% W        }1 U) C( Z* J- _5 r0 J
    }
0 _) i2 v2 K: T; g" d1 v& u/ ^, v}9 r# b( @+ H0 Z: h
小甲鱼最新课程 -> 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-7-29 17:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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