鱼C论坛

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

猴子问题

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

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

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

x
大家好!( y$ o2 R+ x* m2 A; t$ W' t) U! G
这几天我在忙着编一个问题,我用了一种方法编出来!, j7 O. M0 @* t+ G8 t" o  B* E# k5 P% [
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!' B6 L( j$ o- B. d8 x2 G
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
2 Q5 b( {2 T2 g% O1 `1 a/ P8 O" ?$ L1 ~7 v4 S. O

) V( J7 @, t7 \  Y: H
                            题目+ [! T. g, z5 I) ~4 o
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。7 |. Y6 d# M% k. B$ H3 n
第一种方法:利用循环链表
& r' F: r& u9 u* V3 Q#include<stdio.h>5 l& O  k9 C4 J+ D
#include<malloc.h>! w6 M% P( ?' U% x' t
#define M 8            //共有8只猴子* T' i, z8 G, V3 n+ N( r  o
#define N 3            //数到3只时退出第三只6 r4 r  a. E, |+ R; W# B5 K
typedef struct monkey" h7 r! o4 Z7 H4 R0 K% ^
{int number;
: p# w& K  Q0 c+ p. A$ \int flag;) Q! i0 q$ k' D: }  x
struct monkey* next;' |: v8 Q& |  i* ~1 p( A
}MONKEY;$ F+ j) w$ f( o( U
main()% e( c4 J- l, I
{ MONKEY *head=NULL,*p,*s;( y, D. `! r4 `" @. y
  int i,sum=0,count=0;
% l; I" F/ x" N9 \$ g$ p! [. [  clrscr();              //清屏
5 d9 A# G% Y; G+ j2 g5 V/ F) i; K& K  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
* w& O' Z3 y) O& u! U) r6 Q. B2 D$ E  p->number=1;p->flag=1;. d; i3 Y& ]4 J, o" W
  p->next=head;+ m/ C1 ^- k  N/ x# t( b, q
  head=p;
" h1 C, n5 x/ r+ u3 a  for(i=2;i<=M;i++)5 T% u$ ]  _  d2 L* t6 D% ?3 R
    { s=(MONKEY *)malloc(sizeof(MONKEY));" A' V( L; r- ^' ^7 ]
     s->number=i;s->flag=1;
) r- a$ P+ t1 r6 o     s->next=head;- @  F$ g9 y& P# Q# h6 g) n
     p->next=s;p=p->next;/ G& ]+ O. c3 K
    }  y0 k6 r& T  ]& u
    p=head;
9 X4 J1 C, U# H( T3 E& f   for(;;)( o4 j% v- A) g) L3 T+ H% i$ q
    {if(p->flag==1), \1 h5 @& B: p
       count++;
7 S  P, k! V" L     if(count==N)" ~2 E0 V4 c' A* J
        {p->flag=0;9 U+ ?/ u% c8 U
         count=0;
. I# `. T/ M  e8 Q2 O         sum++;}, [# h4 l2 h) Z3 n8 F. p2 G$ S- U
     if(sum==M-1)8 K4 k7 v4 p9 H
        break;
0 i( m/ y) u. C1 r; R3 Z& q     p=p->next;
3 J, H& }7 `, D( t; X    }
  w& E, {! s7 m+ x    p=; n, s' R* z0 f: W/ E  G! y' j
    head;
4 |( u4 \. T8 e    for(i=1;i<=M;i++)
2 X8 B5 p2 _6 W  J# ?9 f    { if(p->flag==1)' J3 d; Z/ v$ a4 Z# ]
        printf("\t%d",p->number);
7 s0 [1 `. h  g- `% ?      p=p->next;
* G5 D! B0 ?: l" A2 M& j    }9 A5 c' H8 Y) [$ B

9 T3 U7 ?3 r, G4 h) E* V
- i( ]3 u. n, b2 |5 D& k( g# x2 Z9 a" ?1 Y6 s1 m+ U
}

; k8 H  |0 R9 S第二种方法:数组: B' f# s- j3 ^6 x" J6 E7 M
#include<stdio.h>0 D8 X8 h0 y# P4 F, @! @  o2 c- O; m
#define M 8
" U! b8 f' `2 O' c6 v( B$ Xstruct monkey0 z+ g' Z4 {& ]) _& ~5 b" `
{int number;6 {$ l% P6 P5 U$ w& g" `" b
int nextp;
3 a0 Y# w  `. x( x1 a/ U6 y}link[M+1];
: D( M: K) |7 ^3 g9 U. [7 I& W8 _( d  y6 d# ]
void main()
4 U- A$ W; L! n; x8 R; Q{int i,count,h;
# J' S4 x) R) V: _2 Kfor(i=1;i<=M;i++)
, L* q  O& Y$ G( T3 E{  if(i==M)
! w, `! t5 u% o$ K/ F3 D/ |' M6 F0 B   link[i].nextp=1;* g. A# F+ ~- P
   else
* B2 x. L- H& X& C9 @) K- i% O   link[i].nextp=i+1;
- F2 {$ W" d+ l7 L& {% l' M  link[i].number=i;& x0 K. t# |! c. S" Z
}* c* d, _* t; W& j, S
printf("\n");. }  @# ?7 Z8 N
count=0;) ^! I! l3 n, Y; {2 y' v* _
h=M;
4 k# I  g0 Y" E- P9 E1 O$ }printf("依次退出的猴子: \n");# o6 U8 B2 s5 Y% t/ Q2 ^9 T! ~
while(count<M-1)
( A5 E1 c; g/ @{i=0;% a! [2 c7 D' [" z/ w& a% A' Z
while(i!=3), ?  V% X; R, [' k  h
{ h=link[h].nextp;
: }4 J! D3 @" w- z  T   if(link[h].number)
6 j9 O2 b  T1 R4 j) ]& p     i++;}2 J: l$ i2 g; s1 E0 v6 a9 [

- [3 `& J$ B! Z5 S6 b* e' e) ]1 }printf("%4d",link[h].number);$ Z# [1 n  x  l0 V% F" ~5 g
link[h].number=0;
- T7 f' p) e: z+ Mcount++;0 Y1 }% L; ]# W) a
}8 J5 n$ R& W" S. W/ Q( _$ ~) D% y
0 Z3 I, k6 k$ A
printf("\n大王是:");9 [% q5 g, z( |
  for(i=1;i<=M;i++)& N/ F- K3 o' ~; |+ M( |9 A
  if(link[i].number)2 m, m$ G' u2 k
    printf("%3d\n",link[i].number);' _: I" t7 j2 ~
, x* I. x% R: S

4 t& v! c1 G, _& X+ G5 y1 J}
8 U) e9 C" E( D
第三种是普通方法for循环
- r1 W$ ]4 P% ~/ r  I
#include<stdio.h>) j; p, b  F% [5 L# a
void main()
9 l0 f, x0 E+ `' j; b- z" t$ M' l{ int i,k,m,n,num[50],q,*p;
1 H% P  Z. f) p+ `1 R$ l3 m    clrscr();
0 j2 W4 S! x) l8 G  \5 `" [   printf("input number of person: n=");
. [4 D' y; B- r( Q) w" R" e" k& X    scanf("%d",&n);$ E, u/ ?3 b7 G7 p
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
9 d" l+ O& l' u* A3 d    scanf("%d",&q);
$ g! \% P2 M7 N3 v2 K) ^   p=num;
5 y; L# x( Z- S- d/ Y  for(i=0;i<n;i++)" K% P& h9 x4 h/ k3 }7 K2 I9 K
    *(p+i)=i+1;
' C# p* l( Q' p5 L: y8 e" p5 x* t   i=0;
" t. g2 a1 k6 ]- F) P4 D1 k   k=0;
8 n2 ^: H- x& h' K8 J   m=0;
+ J* q2 W- v$ Z* m  while(m<n-1)6 G1 K! W3 f2 R' }2 s$ b' g$ e7 \
   {if(*(p+i)!=0) k++;
1 h1 T: `8 S$ [4 E$ v0 S     if(k==q)* C/ M$ e; ^& Z( z7 X) L
      { *(p+i)=0;4 t" J7 M  H* k. m: z* @1 i" c; ?  g
        k=0;% k3 a" s, z# f% ~
        m++;& l& E4 O& P! B7 I, ~' r* g
      }
/ t/ Q: E) ~# @1 I4 }$ P    i++;
9 F8 O7 ]3 k$ [* o2 `    if(i==n)i=0;
2 f, c( v5 h  G   }
' j/ }9 {; l$ g$ }1 ^$ h$ l- S  N  while(*p==0)p++;  F# P( m6 I4 }8 B' \' p! \
    printf("The last one is NO:%d\n",*p);7 [& k& t- }2 S6 F$ c4 L- b
     getch();
' \4 M* x2 ~! O5 k4 r. {4 {, |- m* ^$ S; _  V- u
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
9 i& y% l0 E( O3 ^3 B; @: Y$ |7 Unamespace 又费马达又费电
* |' `3 e/ }- p3 E* r' |, v{4 i9 y9 p6 D/ v) @9 F) K. f
    class Program/ F5 j! q! }# c" I% I: K
    {
( C( v3 \. q# e. s        static void Main(string[] args)
7 L- @+ L2 p. P3 }2 ^5 p. D: I        {
: z7 f. h8 j  N. c  X: R8 P            int m, n;1 m1 s  t* D: c. u9 M6 Z; I9 f7 [$ h
            Console.WriteLine("请输入数组长度");
4 Q8 ?/ U( m- u6 j            m = int.Parse(Console.ReadLine());//m为数组的大小8 g0 K" u9 ^- |2 o9 }" n
            Console.WriteLine("请输入要截取数字的大小");0 I% m2 ^, X& _" K& A) x* \, S
            n = int.Parse(Console.ReadLine());" x! k. i" u1 i* D9 @+ N
            int [] numw=new int8 N5 P' d3 B+ H% n$ b
& o! c  {. A7 ~; x3 j& D
&shy;&shy;&shy;;, E- I; T7 Y  H% {( v- H
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
1 j3 z9 U+ Y5 M+ B            {+ J! Z; j9 @& U4 q  ^
                numw[j - 1] = j;' T3 T) v! u% s9 J- r- @& A
            }2 ^6 t% K- ?* B7 O$ w
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!# o4 @  b& G+ r' C& ]
            while (d != m - 1)
0 |' ?3 z; Q: [0 Z            {
9 {9 w# L* I# g- Z- Z- E  C                if (i == m && d != m - 1)& E' Q9 h1 h. j7 i
                {
' E3 W! [! F6 R/ l  d1 k                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
  u1 o: x% [9 n! o* O                    continue;0 j1 t' j* V/ P- I
                }
6 D; n3 H* ^6 Q0 ~: I9 c4 O  y  k                else, @7 U7 z, T/ M( p7 a5 {! _( O( X5 y
                {
/ j! q* F( g/ k. o  a# S% K                    if (numw[i] != 0)
! E& I* ?2 o; j( `                    {& y3 n) x% p, p
                        i++;, l. Z% u5 x$ o# h
                        k++;
1 b% K* G& Z3 W; `4 e                        if (k == n)4 j; C  Q2 B: K7 b& I1 j
                        {
6 D6 m* \, b. @, ]                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
1 q# A' n1 b6 y9 [4 ?( e                            k = 0;
8 i0 E4 N8 ~. \) E0 A% W              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
  z' K2 a- O- b- I" q                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
/ |! ?/ L. H" p8 a, ]                        }, F) h- k% A0 n
                        else//输出暂时还没有改变数组元素的值
5 q( Y, u8 P, D' P% G                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);, p2 h$ p/ s) ]: b7 D/ X5 J
                    }
6 `0 q: z( H# T1 R                    else
' x1 b! C! e( I) {" V. F% x( G                        i++;//数组元素为0,直接跳过,不计数。。。1 o. C) _, y7 M9 F/ o- B
                }' g* J$ Q; M. Z

& y: _+ a- g; B9 f7 j4 I
2 z% |6 [, W. h; j5 g+ y            }//结束while循环/ A4 l, W# O: W! G+ N3 [$ R/ ~
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦) }8 s2 |  v' i9 `4 @$ D
           % ]" K" v0 o7 Z
                if (numw[i] != 0)
) A5 l9 a9 U, J. |4 t) u( H: @                    Console.WriteLine(numw[i]);$ a9 x0 k' t# J; Z7 h' I
           
$ O+ h. }) h2 }! B% L            Console.ReadLine();
6 _4 P" w, W. g. T/ g# g* q  o        }4 F; X" z( u: H# B& O
    }# M1 g, J5 P* k0 {/ c% [" h
}7 Q0 |" Q4 O: ~9 V3 B! u0 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-8 01:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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