鱼C论坛

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

猴子问题

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

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

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

x
大家好!: Y, R& z1 E. y4 P" b  ^* X; ]
这几天我在忙着编一个问题,我用了一种方法编出来!
6 D) p0 ?. J  X7 r% X) F但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!7 c( z) _" w: k# s8 J: J3 t
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 1 c" J3 L) N! r) y' o

- v9 p2 s' }: }0 D
3 G7 L" g/ c* @: e3 ?8 d- d9 S
                            题目
9 T! B9 X2 L; o; l5 F山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
+ _% t  V; z! t! l6 O$ e0 z6 H% c第一种方法:利用循环链表
. [* u0 x% y# |- O; r& V/ f4 C1 {#include<stdio.h>3 r9 k& X! T& B- R6 z
#include<malloc.h>
0 D0 d$ B5 `; Y1 V' \4 y5 S  n#define M 8            //共有8只猴子) ?7 @' U) b4 J7 o6 E% x9 K) d
#define N 3            //数到3只时退出第三只
6 F0 o. \( _- [) s! ?typedef struct monkey/ k2 \3 w$ k8 c* M$ N9 I9 Q! ^# m
{int number;
+ o6 Z* B" N+ \# P2 S1 |int flag;9 P& O. Z' F' m% M5 G3 K; f
struct monkey* next;
1 \2 M0 k  x2 ?}MONKEY;7 ?/ T( O5 z+ j8 N- y; z2 q
main()
. t5 ]5 J$ |: x5 ~{ MONKEY *head=NULL,*p,*s;
  e' J5 t% V; P+ U# D" [  int i,sum=0,count=0;
5 j0 [) D5 O+ P  clrscr();              //清屏8 A2 M; u8 G3 U; R
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
6 _. K% v  d3 y* i( O1 _( _  p->number=1;p->flag=1;
9 t# r! g5 l7 f! ?  y* ?  p->next=head;
3 _9 `. U; w7 w2 M  head=p;
0 b- e- Y4 ]( g$ x5 H  for(i=2;i<=M;i++)
% X; l* U* J; k, m7 A- L, A; h! [    { s=(MONKEY *)malloc(sizeof(MONKEY));
; c$ j4 U2 \: B     s->number=i;s->flag=1;
' s9 U  |0 |  @3 S     s->next=head;: ]6 r$ [. \9 i- e- s
     p->next=s;p=p->next;8 t- b& e+ B) w7 ]3 C$ ^/ Y0 k- i
    }4 n( a* W2 ?) e2 V0 s' h3 u
    p=head;" e, b, i1 q/ i* G+ h
   for(;;); e1 x* ^: n+ W: l5 [
    {if(p->flag==1)
  g4 y: y" ?+ s5 n9 @# Z/ a       count++;/ e! n2 w+ {' {2 A$ a1 k0 K
     if(count==N)
2 p5 ?. |" M1 Q7 x        {p->flag=0;( @$ `1 P( p9 q. q
         count=0;
/ r+ N) E1 C  g4 @         sum++;}
" \6 N7 S8 W9 e; c$ f2 c     if(sum==M-1)
2 O; M0 D; I) ^4 z- c; Q2 Q        break;
" I' w0 U* R: f2 w1 D     p=p->next;
) E1 Z0 U, |9 L6 f5 ?+ K* w4 g    }
% J$ `: {. V0 e4 t1 C% X: [) G7 _6 f    p=5 S- H% L/ Y3 h6 M. l5 N5 C
    head;
% ~) l4 u, F. [7 q3 s    for(i=1;i<=M;i++): e! q; u( h) ?# l+ a& G
    { if(p->flag==1)6 e- o% D# S9 J7 [0 E
        printf("\t%d",p->number);- i! j2 p0 X  {
      p=p->next;/ `+ @7 J" G2 I6 D, V; ^
    }
/ k+ B1 ~$ I( h3 A3 ^* i4 ?3 o
8 [. f4 J/ J6 L& W# [# x3 W9 y9 ]/ [/ q' F  I
( c" k' X3 \2 U: u
}
2 g2 C: p- |: z5 Z% V% }3 f- x) Q
第二种方法:数组8 Y/ K6 W, g, f) `* u
#include<stdio.h>
+ \4 W( v1 n# H7 l- h#define M 8; e( {2 ^  I' j# t5 y# W8 M  Z/ O
struct monkey! }1 H: E9 s3 H0 j/ `6 Q$ k& S
{int number;
( x  @7 t) L- aint nextp;
# X. l) D  a* S}link[M+1];
# o  I; _* Y4 g! E7 h8 e: l# i  g9 w& [2 J. `
void main()
/ c) Q. X7 t6 |9 L+ v; p  j6 d{int i,count,h;* P  t4 E7 ^+ X
for(i=1;i<=M;i++)
6 H6 Z  a6 ?- y( p7 R* E5 E6 U{  if(i==M)
. @: b: f1 j8 ?- o/ z% u   link[i].nextp=1;! g! S4 G; r# t: B0 P/ x' B, i5 e
   else7 I! w7 _# a. x$ n
   link[i].nextp=i+1;
) @& u1 m& _- U1 r3 k  link[i].number=i;
+ c/ N, o# o" J/ V2 v/ u6 s+ I}6 q# A& m/ h+ u3 a" \3 ?  E6 [# F" |
printf("\n");
8 i% a- q2 o+ m  Z4 B9 jcount=0;
0 i; Z- \% |1 t" C) B, u+ lh=M;
4 v3 v; J, E% m- m" r' R- Wprintf("依次退出的猴子: \n");
5 ^! ~( W$ h5 Z; L: d( Q1 Vwhile(count<M-1)) j! G/ e& {2 O
{i=0;
, o+ k7 \! k) P/ N; O; {! Swhile(i!=3)
) d3 |' i7 L# B: @# \$ C{ h=link[h].nextp;, o, `# }' Q: }4 ?/ [, r
   if(link[h].number)
8 q9 i* ~: K& {. B2 M     i++;}9 B0 o4 Y7 I- u4 v6 w+ i

* d0 p! ~- g+ R# {printf("%4d",link[h].number);% w$ a- y# h+ u, y! y
link[h].number=0;
' b' ^4 P/ r& _9 b% ucount++;( @- v" T9 e0 d6 d5 ^# _
}
% c  k4 ^) |/ @- S" A$ G0 l* w" k; |1 T# ~* C3 ?, _/ K1 a
printf("\n大王是:");9 m* I( m3 c4 O1 L+ K5 T7 N/ b
  for(i=1;i<=M;i++)
+ ^9 _  F4 o$ T- u1 o5 }8 n' P! I% I  if(link[i].number)
, y0 I2 s2 I+ d* }! t/ I& z' s    printf("%3d\n",link[i].number);" Z" G8 G* k/ y; X1 G2 s/ C

/ _4 ]8 l7 l( V' c& s  A) Z; W5 O  ^- I+ W9 M) S
}
4 h7 q7 R5 g: I* C# Z
第三种是普通方法for循环
6 q: B. x% Q, K7 d
#include<stdio.h>6 x9 Q6 z' G5 E" f4 s6 g* v
void main()
5 b2 V6 ^/ V( z. `7 O3 c0 U{ int i,k,m,n,num[50],q,*p;
; k$ Z6 X/ p& L) b    clrscr();( z! `4 i. c% s  U! p0 }
   printf("input number of person: n=");
+ F8 o0 t, J* c    scanf("%d",&n);
  w& d* D; R2 q: s+ k$ R7 zprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只$ f6 x$ f' @  B
    scanf("%d",&q);& B1 Z) b/ h2 ^. W, o0 v
   p=num;
- e" i8 x5 ?4 p  for(i=0;i<n;i++)
# y- }% K  ^' g! h; z- q7 g    *(p+i)=i+1;
4 w0 y6 i. M7 b* N- d   i=0;
2 ^; x. o0 {- Z  A0 G8 N6 p1 O! H" h   k=0;/ F/ X, C) v3 q) J7 K
   m=0;
5 J! ^: V2 B# t! j; g* Y2 g+ Y  while(m<n-1)0 R. u0 J! c7 j4 N# _
   {if(*(p+i)!=0) k++;
* }5 U/ Z" o; @' @7 s; P     if(k==q): j( F, T5 m' N" U( o8 {/ w; l
      { *(p+i)=0;8 O& M$ W$ t/ u; ]2 Z$ r7 H4 U8 i  ~
        k=0;+ T( }4 \2 i( [# ^5 U% {4 M
        m++;9 J1 F6 ?5 K* l- q" F& w  O0 Z
      }
+ s8 [2 h5 ]: h  n% R4 ~    i++;
8 q& c9 V* ?2 m, d& k. K" C    if(i==n)i=0;7 x/ O; v+ H1 a$ a& Y
   }# V) Y- C2 w0 X9 H! e3 }' \% }# Q8 L
  while(*p==0)p++;0 P2 a5 f% |4 Y. @
    printf("The last one is NO:%d\n",*p);( T5 b% g" a- c/ D6 o% ?0 B
     getch();' X( f9 A( F% y1 b& B

& n0 M$ e, J' a6 f8 A, S}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
1 F/ p( H& j" }1 f: `2 J- _7 `( mnamespace 又费马达又费电% Q5 r) Y5 l2 C; c8 C( r
{
3 G$ Z. [2 t" c& [$ _8 C) L) h% E3 K    class Program
7 p# ^3 {" A% d; b% |    {
9 F# c2 V5 X* }. q; `/ ?# b        static void Main(string[] args)7 M# G5 ^5 q& O3 H9 Q
        {- s5 i- w* ?* P" J
            int m, n;
5 Y4 m1 c# D7 H5 l: |- D$ G            Console.WriteLine("请输入数组长度");, G& C; j( D$ a- r4 P
            m = int.Parse(Console.ReadLine());//m为数组的大小
: K1 u6 d9 k8 c* ^: ]: u1 @5 U            Console.WriteLine("请输入要截取数字的大小");
' x" {% [! v2 N            n = int.Parse(Console.ReadLine());3 V+ x6 U  w. }* K
            int [] numw=new int
& O6 b1 p8 D# o* j0 S& J% E& k
. n. ?3 x! Z, @8 k+ Y' D&shy;&shy;&shy;;9 T, u) r) N% \1 r
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数2 z1 z* e" d1 P! H& q' C1 v' q4 Q+ i
            {
3 T: h8 `1 L6 y! ?; R                numw[j - 1] = j;8 ?2 |& |8 S, O" ^; h
            }8 F8 L# m0 G- h' W0 Z) z
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!* Y7 t9 I' F0 y9 v* a/ s% N7 V6 C
            while (d != m - 1)
: }# }8 A. y( F+ Z            {
: [. z/ x% p' U3 J& y* ]                if (i == m && d != m - 1)
4 E$ }& X6 s. k8 B! q                {0 P+ \6 ^) ?  t
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
4 O- r* S- Y0 a% g                    continue;' W! S- W) C) h/ m- Y3 x
                }
: B$ G, O2 u* B                else1 R. o; o% }, P% W, I1 |. f
                {
+ g( S2 A1 x. ]0 S                    if (numw[i] != 0)3 U' d# K& T7 k+ g7 C, z# p* {( E* X
                    {/ r* I* z6 S  K$ \2 h# P
                        i++;
# ~+ Z7 I) K) V5 K  a7 K5 g                        k++;
5 y0 E) H- g; q! K                        if (k == n)
: r7 O/ _8 ~8 N- g. C                        {
/ A1 q  G  |, R. r% S. A  N                            numw[i - 1] = 0;//把在n位置数组元素的值改变了+ k7 H  `" s7 @# Z' e; t/ V7 B
                            k = 0;" p  }4 a9 Z( I- N
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
+ p( F# `/ l0 x" z# n                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
" M: k; v3 a: V9 Q, ~, `, I                        }
( h4 I% r. q# z' X' A& Z, f4 e                        else//输出暂时还没有改变数组元素的值
! n9 H, g$ H  B                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
" R9 d& V. t& W7 ~5 E                    }
& X, S$ Q1 _) O2 c  F! ^7 p9 e                    else+ l" D. k3 n/ v/ w$ \1 o
                        i++;//数组元素为0,直接跳过,不计数。。。
. h6 ^# b% Y5 c1 T                }7 v% z- F/ y+ I3 g) {1 _7 s5 e
- z& H* j1 u3 p+ u& y# `: X

: t% R$ }+ w- O" n/ H: _' q            }//结束while循环6 M* F9 H& D* h' [
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
. Y9 P6 x2 y( M5 h/ T           
+ [8 g& L2 j0 I/ A8 Z" a, W                if (numw[i] != 0)& t7 [9 k0 w  y# P, g
                    Console.WriteLine(numw[i]);' ?0 d3 j' H+ i
           
& _% P% D) ~! c$ K" O$ ^) X5 v0 Y            Console.ReadLine();
3 u$ U$ }0 A- Z( ], P1 G! r. B        }' y3 L6 |8 A( H4 e) l( w
    }" }1 A8 }& {# J" y$ d* }
}
- X3 _( n' d& {+ v
小甲鱼最新课程 -> 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-6-7 08:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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