鱼C论坛

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

猴子问题

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

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

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

x
大家好!- o, \0 K4 ^( q& ^6 H
这几天我在忙着编一个问题,我用了一种方法编出来!
' W5 P' {1 v% V8 N但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!4 f4 R1 I6 |9 z$ K7 }" c
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
( H1 @0 ~2 K( Y; \& y4 N& K
. c! J5 |" v6 \0 E  |" Y; s! _7 L3 }0 v6 i2 U. u( m* T- o( i8 a
                            题目: G9 v- B6 i  c, H' @
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
% \& H0 O. O6 Y第一种方法:利用循环链表  r- c% h. `7 P0 Y! P  B
#include<stdio.h>
# i- M% Y/ @% m( V#include<malloc.h>
6 `' C) }" L! j5 m2 H4 ]#define M 8            //共有8只猴子9 ~2 _" w# }" y
#define N 3            //数到3只时退出第三只
& n( {4 G) {* _2 Ftypedef struct monkey0 c2 K8 J" e$ v* E6 a! j( p
{int number;1 K7 {, w$ e1 m/ z
int flag;
( K. i4 S8 _% r4 N( u- P% h8 Ustruct monkey* next;
: W& l, K/ h( [% z3 g}MONKEY;
8 m" ~" e: V1 d7 k! ?main()
( U% L- g6 I3 a5 O7 o{ MONKEY *head=NULL,*p,*s;( U- _/ D: }( u
  int i,sum=0,count=0;
; g" R: H+ m5 F3 t& ~9 y5 L# y" q  clrscr();              //清屏8 ?( T* R7 N- \5 b) L/ Q6 W! y
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存$ U+ M( q$ l* t# E5 o4 q1 g
  p->number=1;p->flag=1;! ?2 O9 X9 X4 L. M$ P! m  `
  p->next=head;- k8 w$ k& i0 \
  head=p;
5 J+ f# C" X6 n8 Q1 e  for(i=2;i<=M;i++). c5 @* L4 ]' n* ?6 O2 H$ n
    { s=(MONKEY *)malloc(sizeof(MONKEY));
- T, J2 ]7 o2 v; J/ J2 q, d     s->number=i;s->flag=1;
* J2 |  p3 k% V1 ]; G- J& l* V     s->next=head;
" S" _$ c$ B- w" K0 F     p->next=s;p=p->next;
6 v* L" A0 b( ]; W1 U9 @    }
8 W# m4 S/ z( J+ S9 ]: O, D    p=head;
; ^7 v1 g$ H3 t' e9 y' v   for(;;)
; P( L1 {* Y  v2 l& n* d    {if(p->flag==1)/ L/ ~" n$ {1 A  S& C
       count++;
8 a1 S( M% \! j     if(count==N)
! @! F/ i( b( x7 u. O: w        {p->flag=0;
/ D: H0 I) s2 z. {+ h; m         count=0;& W  i& \" K) t( O  B: w9 t0 R. S
         sum++;}
" {( j1 Y; v( ?     if(sum==M-1). d- d1 a/ B5 @/ G1 g$ z
        break;/ E" z; F: n/ B1 O& n: h
     p=p->next;4 a$ q1 e" j% J, {* J+ v$ z
    }# T4 [: v2 C6 d8 s: c
    p=
/ K3 N& H* U, u. K9 _. f  s    head;
: T3 V: E7 R& H/ y1 O    for(i=1;i<=M;i++), A: e& w: U3 ]8 [! m
    { if(p->flag==1)
7 v; T, L1 M% q4 t8 R7 m0 j6 I* R        printf("\t%d",p->number);8 l5 b2 I5 p& n2 |
      p=p->next;
/ A( P' N* w( x+ P  I, [    }6 E" l/ H& I3 T5 D! d

& P7 F' t0 g5 z7 y0 h) _
' W6 Y% N: a' Y2 H. J; O6 J, q9 ?9 [5 r  y4 H/ `/ p1 P
}

, O+ G' w# Z* ^, ^2 D; R' D2 T第二种方法:数组) B" u4 P) [2 Q$ g6 G: @
#include<stdio.h># L' }0 ]# W* y" P8 Q( H
#define M 89 E( \- S2 {& a
struct monkey
, j3 c1 J( }6 }" k; g+ U{int number;
7 M. `# z, T/ E# G* P2 W  x9 o" Eint nextp;
* F# w) w7 R7 w- J( G}link[M+1];
* B5 W5 l  Y) X( P& h1 A4 O" _0 M2 H. w
void main()& q/ l( N+ e# l( b6 `
{int i,count,h;
+ G$ Q8 }6 U3 o- E7 Vfor(i=1;i<=M;i++)0 D# A: \; S2 t; S* |1 }0 j8 c
{  if(i==M)
  i6 B- f& ]5 a* s/ k) S' \, k2 ?2 J   link[i].nextp=1;; s5 j3 \; Z+ O
   else
- M7 ]# {7 O  s7 N" U8 _' j. R: w* _   link[i].nextp=i+1;
- V* X% J: `# g# O1 ~  link[i].number=i;# J, o3 e3 V! F+ U8 j' |
}
, x* I! A# N! ]/ l% `; O% c- w4 Aprintf("\n");
& ?, r! u. d0 C4 t; Ocount=0;  m. g; |* G# \4 c5 y
h=M;2 t# _, ~& b, Q8 w1 G8 J/ @, R" N% {5 D
printf("依次退出的猴子: \n");
% ?$ o) M( b6 p' rwhile(count<M-1), C. c$ E. A* w; t  v
{i=0;0 A5 q/ U  u, g, P$ I
while(i!=3)
2 X5 X! O7 t1 v" j, p& n/ l- A( |{ h=link[h].nextp;
9 k0 p6 {' @, E6 b/ v' P5 j& u1 K/ z   if(link[h].number)
' u: Q: @4 ?: g, e' t     i++;}
7 b; C, w$ [& N5 f" l+ {1 Q8 w' _  r/ \9 A* D: _
printf("%4d",link[h].number);# L5 a0 o3 }; \# {$ S
link[h].number=0;
% V+ @. m4 P; A* tcount++;
. Q# T6 K5 j4 `5 Y  @6 g9 p- G}
- J% ]# X) |) D1 U- v5 t
% ~6 G# k( I2 V1 _printf("\n大王是:");+ R1 M" d/ D- ?/ O. x; S
  for(i=1;i<=M;i++)5 m' F6 k5 d3 L6 g
  if(link[i].number). i9 c, q* T+ t6 \- J5 W# t; p
    printf("%3d\n",link[i].number);* u/ x5 N! _) U) R& ]/ ]( O

2 E' q0 U$ U4 b) [9 W! O; @8 O& q3 c1 ?
}

+ }# z5 C) n; U/ y第三种是普通方法for循环

8 L, j$ j5 ^5 H8 |' C. L9 f. Z#include<stdio.h>
' ]5 u# P8 S- c* n$ {/ K- yvoid main()7 S" Z! I, V: @: W* p( ~
{ int i,k,m,n,num[50],q,*p;
1 H0 u3 l3 R) Y4 L% ], f* D    clrscr();8 Y- _' J( G, }
   printf("input number of person: n=");7 ^& j: K& N, I" p2 t
    scanf("%d",&n);- _" U* C9 `& z3 e
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
9 Z- z! ^" k# |: I) j    scanf("%d",&q);
. f, x$ `/ c* j: N/ V5 X   p=num;
& A& q( T' h/ L; U* Z( V6 `  for(i=0;i<n;i++)! y4 Y2 W* r% y- m+ y
    *(p+i)=i+1;3 p  M" |  g2 i# h) s; T+ i# }
   i=0;' z) R+ y8 H7 V/ S" N
   k=0;' U; k: _' a% @
   m=0;
' j9 D9 y" y( I4 R' q1 B1 u% S: i  while(m<n-1)
2 p$ G$ J2 M) B" }   {if(*(p+i)!=0) k++;" Y. ]& Z# A" {. `1 D  i. I6 {
     if(k==q)- P/ K$ B1 n: C/ U+ |
      { *(p+i)=0;: S- R8 r3 Z2 @1 i. d
        k=0;
/ k3 }( T3 R8 c; q: V        m++;
! c7 K8 s; X+ j; H9 s# r+ G1 ?$ _      }
% V! ^! G; ~& m& |, v0 |; ?    i++;
+ y  k* y! f/ ?2 \  m! ~    if(i==n)i=0;! M) S0 g' {' r+ b" E
   }& @0 x' x, V- H6 \7 R" J0 {
  while(*p==0)p++;
# o& m0 U: `' Q% g  k    printf("The last one is NO:%d\n",*p);
% {# t2 g) M' P8 j4 l8 {     getch();
0 _+ P( j( }: k" q1 E5 j4 G% X" w  B9 Q3 G8 @+ H  N
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
+ n0 w4 Z: k9 ?: H1 Onamespace 又费马达又费电
9 v0 V' K6 }+ b1 r/ e{0 C( Z) Z+ G* M, @  H# a3 c$ l# O2 H
    class Program+ U5 h0 z  S2 |9 }, K, ~8 H3 e
    {$ O$ _/ ^/ C1 W; G' o5 D4 h
        static void Main(string[] args)
! a- y( ^% |, A8 E        {
% y5 H: h' T7 l  \. j$ O, i            int m, n;! S3 |, p# P& H' G/ r, w$ J6 v
            Console.WriteLine("请输入数组长度");
! m  x& b6 t3 D( W6 E$ M, i9 j) z# M+ O            m = int.Parse(Console.ReadLine());//m为数组的大小
; ]8 o2 d( `8 X- L, ?. g7 O: N            Console.WriteLine("请输入要截取数字的大小");
& D5 @7 H- a$ x9 L            n = int.Parse(Console.ReadLine());5 v5 D( g- }2 K' U) l
            int [] numw=new int6 A+ a& U: A, r( X5 I# o
% }1 g1 j4 }6 L# A* E
&shy;&shy;&shy;;/ \: `4 m& y. W! ?) G
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
4 o8 K8 }( K- ^. C$ s            {' e, ]3 q" X1 d+ y1 z( J) D
                numw[j - 1] = j;" |6 ~) i7 A  D. ^
            }# ~( V- A" E5 r! X) Q$ S3 W
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!( ?) Q/ z1 B: V: m3 r0 ]
            while (d != m - 1)
3 S) M0 ?2 ~9 c- Y% y! D! U  l) Y            {* i8 M( `! K" L$ R1 G
                if (i == m && d != m - 1)
* V# Y9 _" y4 [) u! H/ n. j2 s                {
7 y% a1 _2 @4 p7 c( ^9 X; N- ]                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
" Y7 Q" @9 E4 ?( |/ _+ \  Y                    continue;9 L' F0 O! n' Y, E% V
                }. j" y* F0 G4 b; Q
                else2 f! v% T5 |8 Q2 C
                {' g6 T: A- l: c
                    if (numw[i] != 0)
) l+ [! d( N5 f& E. T                    {
, ^4 f4 ]5 z! h9 a                        i++;( m7 {+ M% D7 l; K) J2 L
                        k++;9 ]& s3 _  }1 u7 Y; A0 Y
                        if (k == n)0 o& K" n6 n9 c( M+ n
                        {
( m0 b" ]* z2 @! M! v# c                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
6 d  D: ?; b' y$ ^: Q; ?                            k = 0;
- E) M' {  f9 A' k              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
/ \7 g  t1 _8 J* M! F                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
/ _+ h: I8 K, a                        }
! v3 n, |- K# N7 D  S                        else//输出暂时还没有改变数组元素的值
* C  S4 ~3 X6 ]$ Z                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);8 c5 |# I9 G7 {% `4 I3 k6 j
                    }2 r; q/ Q6 |- }. P. Z
                    else/ _4 A2 _: d! D; ^
                        i++;//数组元素为0,直接跳过,不计数。。。: o) S% _( p# E7 i+ a
                }+ z0 E9 J0 f9 O: c

: ]/ O) g: q$ G; S* f, U" ?
/ I6 s, N6 K- }  T            }//结束while循环5 y* x8 s# a5 C' c3 G/ X: `# q
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
- l( t. p8 V; [0 L: l0 r0 d             m, Q9 @* t( G- D0 i/ j1 O
                if (numw[i] != 0)9 r3 q3 A+ I$ O
                    Console.WriteLine(numw[i]);
* f9 i& g" Q' D, F4 o           
2 M+ u8 u% a  ?* {% ?) C            Console.ReadLine();/ G! p& P: N% W; r2 F# a# ]  p8 j
        }' a3 P2 w: [5 e4 R9 O  m& Y# g
    }
0 k: `1 P% p# u( p  e}
% C: M. m* N* ]  ~) E  r
小甲鱼最新课程 -> 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-4-23 11:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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