鱼C论坛

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

猴子问题

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

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

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

x
大家好!
: l- h% c) l% e5 T) o* g  k+ w这几天我在忙着编一个问题,我用了一种方法编出来!7 t: b$ a: f/ j% c& `6 p
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!+ y, d% u/ q! F1 E! I. M$ Y
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
# @3 b3 X  q5 S  |0 E7 G( k6 w9 W+ Y  ^
& q: E4 v" W* {+ {! q$ @
                            题目+ a& d  v5 S+ i5 j, K" @
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
5 z0 d" r( _; S) A# _6 |" O, f第一种方法:利用循环链表, E3 w2 {: ^, E& Y: \. c& V$ e
#include<stdio.h>
6 d8 E) e7 Q" K; i/ x5 T; [7 h#include<malloc.h>
/ n# A# Z& j# u1 z, G#define M 8            //共有8只猴子
& p4 \4 S( u+ |$ L6 b- |; H6 S: M#define N 3            //数到3只时退出第三只
* Z" d% ~2 S- r" g. W) {' Htypedef struct monkey
8 K' o1 K  [6 Z) d* p{int number;
, j: e' O1 \5 h! Hint flag;
" T6 t2 C5 a& S* Z& t' t( Wstruct monkey* next;1 [4 c% @/ b0 T" y
}MONKEY;3 Y/ N+ T" y8 d2 f+ G1 g# D- H
main()6 L" m* S; k7 z( r9 h  m8 z7 l& W4 |
{ MONKEY *head=NULL,*p,*s;6 i7 [0 e0 L+ L! k6 [
  int i,sum=0,count=0;% c, `- E$ z$ C5 v' A: T
  clrscr();              //清屏
1 H  ^' w( [2 K  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
/ g5 d5 N* h' U7 u+ @, R+ b  p->number=1;p->flag=1;
( G# D! q9 i  c, V  p->next=head;: A' z* M% z8 C* S3 F
  head=p;
8 ~* u: w# ?# ?" O6 p  for(i=2;i<=M;i++)& F' Q6 k( K& h1 R1 _0 \* p9 B- ?
    { s=(MONKEY *)malloc(sizeof(MONKEY));! }/ C- P2 z1 m( U
     s->number=i;s->flag=1;( d$ [* c! W  p: H# N
     s->next=head;2 L3 F  a- f! }  Z, R# N, d
     p->next=s;p=p->next;
0 T/ e% J0 t: {  {" w+ f    }
/ e( ^8 B: E, S4 o2 P+ X! z    p=head;" G1 t" v- y/ W% }3 n
   for(;;); N* o2 R5 t8 _# O: \, x0 ^. l
    {if(p->flag==1)/ T1 F: S3 _# _- @( v( n
       count++;' j* {9 D6 X1 a
     if(count==N)
- `( E- _% j6 X7 C# Y7 k* ^, {        {p->flag=0;" ?, J& L% g& g
         count=0;, M" t  \2 D: @  b
         sum++;}
  H" F% z" u- ?     if(sum==M-1)9 N. @& p0 l" ^9 P# L
        break;
) i* h8 F1 q% c' l: s; N     p=p->next;
( k7 t1 z5 B& i% U: V    }6 r$ E6 U0 v" m( U  D5 t- I3 s( t2 n
    p=( K7 z7 Z" h$ N, K# I
    head;
, l6 f8 q) Y: k/ V$ t    for(i=1;i<=M;i++)) @. ~  c: G6 w2 t; C4 ~0 {
    { if(p->flag==1)7 g* D: a- ~1 J4 z0 s) }
        printf("\t%d",p->number);
  H) C: K; N4 }6 j& Y& ^/ j, ]4 |      p=p->next;
' @( P! I) [) ^    }
' F5 i! ~4 V2 O+ T: h1 P
2 y( g  j' l1 ^( ]4 b
& s$ x5 ~; g# w  |3 D
+ }* x- N1 A+ M- n1 w, ~}

6 y+ {; ]0 d2 D7 l第二种方法:数组
5 q2 G" F( L( X' D#include<stdio.h>
" g; z. {. U% Q& D8 I/ s! |#define M 8
8 ]( T& p/ H. I2 _: dstruct monkey" U1 G' c2 j; `  A/ }
{int number;
9 u' z" o4 V8 x# ^int nextp;
  P/ Z3 U- j( o* G" C}link[M+1];, F& D4 x& M) l, d
3 q, T0 V/ C& D$ ~6 R9 h. `
void main()1 K3 _: W! L3 q# O4 `6 d
{int i,count,h;
( Z# V) Q7 {/ J: U. y. i# cfor(i=1;i<=M;i++)" e) K- W' ?8 g* i! v: J
{  if(i==M)
( f. W3 m$ T# F* E  o   link[i].nextp=1;
: @2 _6 o. D" ]) y5 o: p4 R& [   else
  L5 V3 l: A- R4 U5 w: S4 K   link[i].nextp=i+1;4 F, K% c* k- ^8 ^5 j% Z
  link[i].number=i;
8 S8 }' E6 V# K}. u, A& n: u6 Z: v
printf("\n");
* l7 I' }2 |: ~; ~count=0;; f' S; ?- }, J: P* v6 \
h=M;0 t: d1 o3 b- x! Y
printf("依次退出的猴子: \n");+ Y* {3 |$ H8 g8 D
while(count<M-1)
( c/ v8 @* [, P, |- K: e{i=0;: B2 i6 L  L8 U; K" I
while(i!=3); W) T) \5 B$ `
{ h=link[h].nextp;' u: ~5 y2 d. x& Z
   if(link[h].number)* C8 E7 G3 I2 K, Y+ A
     i++;}
2 e, [5 j! }6 O! t$ P7 y! c
+ M5 j) o: Y/ c4 Z. p" ^# D7 vprintf("%4d",link[h].number);& V5 {; N0 ~# r7 }
link[h].number=0;# I) d* Z+ A6 q) R
count++;3 I" a, d+ _/ u2 {
}% |, Z* J' i6 m7 W1 P+ y  L

8 N5 `: B* X- q6 Q9 |8 K1 rprintf("\n大王是:");
0 `9 x* U+ k, U6 `9 [5 ?  f  for(i=1;i<=M;i++), Z) r- `" f; ^, z; P! C
  if(link[i].number)
# }9 ~% g( e8 j) C0 C+ {6 Y    printf("%3d\n",link[i].number);& O5 h7 H- D0 X8 C) }* @; z

0 v0 P8 |  z" R+ j1 T& Y  X1 U3 a+ V! q9 w  n& b8 k
}
) S$ N! d2 \% D# _- m+ e
第三种是普通方法for循环

+ k; v* k4 l% Y! ^  S0 v#include<stdio.h>
5 Z( U# V, e8 y0 ~0 s. N  t. m' ?0 n, dvoid main()5 H5 h) s2 G: A
{ int i,k,m,n,num[50],q,*p;: {0 V) F0 m& P, ]7 _, w+ g" F* Y
    clrscr();
) j, {0 Y4 U% E   printf("input number of person: n=");
3 y7 k. x% }) D  g# {% B2 y6 w$ B    scanf("%d",&n);
# M6 w4 P' W# x% _! y$ w7 Rprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
* H1 h, [* U# w6 M    scanf("%d",&q);
0 f/ m: e: s5 S, C% H. R2 t7 c" s6 s   p=num;
4 p$ e8 x  |( p: `0 {  for(i=0;i<n;i++)
4 F7 B* }" A* K    *(p+i)=i+1;
4 u! J& R! m- o5 p) n   i=0;
& ]2 h$ [* o( p, b; W- J" A1 l0 A0 g   k=0;5 R7 D, l# }9 O) M
   m=0;
' S. j/ e0 |; ]9 \- v  while(m<n-1)# A# r: Q/ T+ V  L; \+ s
   {if(*(p+i)!=0) k++;
5 K/ x" q) U- i* E     if(k==q)3 A7 w" I  w( R; K' B, C) q
      { *(p+i)=0;
) E4 a0 d+ }* X        k=0;0 ^+ B+ `0 {$ k% Q
        m++;& y0 E& }+ L0 f% c" Q/ I+ z
      }
+ q7 g# ~: h' T! r( A2 N    i++;9 m9 \3 g$ v8 l2 J- D
    if(i==n)i=0;! L0 I' R1 h9 I8 K% G
   }
% k( O& L0 V" B1 ~4 R  while(*p==0)p++;
+ Q9 I; Z, H/ \$ T    printf("The last one is NO:%d\n",*p);! w# ^, h0 \5 d& _( w) U
     getch();  ?4 K$ c' }7 ]; u# x) F2 a+ p$ C
. S3 u: [' K' r
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
) D2 Z! O6 y" E# t, F/ L8 Ynamespace 又费马达又费电/ Y/ b8 \0 ]( S3 o4 z
{- _, N, T. Z- ~9 H2 }
    class Program
4 z* N: o( e. m% y% U% H0 j    {( H. j8 q! {# S1 x5 ~5 T
        static void Main(string[] args). a' `* e' d7 a$ T
        {' Z. f8 j9 b  l7 e9 g6 t
            int m, n;
7 ^# p- C4 |$ j' L9 F! b            Console.WriteLine("请输入数组长度");2 z3 d* t( i6 D) M# s
            m = int.Parse(Console.ReadLine());//m为数组的大小" F' h0 J/ k5 k& b$ i! S6 b
            Console.WriteLine("请输入要截取数字的大小");
6 y2 r. g3 n7 l            n = int.Parse(Console.ReadLine());/ g- U% r- {( F) G8 U
            int [] numw=new int
# d2 |4 X. ]( R; o% D) o
% n; F6 k# T2 g; p& ?&shy;&shy;&shy;;
& r" k: @2 {# x; H" i  |: V            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数- S# I- i, ]% \2 f. ?; J& M
            {1 Z/ Q1 g4 u3 F+ T& T+ t
                numw[j - 1] = j;: W/ u- E. a% E6 V$ Y+ I
            }! ?, q8 p# I' {1 F  ]$ {6 K
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
& {1 }: @  j9 V, {            while (d != m - 1)
2 o: j: {, V0 U1 O+ `            {0 q. r+ b6 ?6 {! _/ [; N; a
                if (i == m && d != m - 1)# Q- l  ?- ]- m1 b& C1 _+ z0 G
                {" L* M1 X( Z) @4 N, p8 Y
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
) s; s1 A# y+ G; w                    continue;
/ H$ H) l8 n! h+ s1 A                }* @7 |1 B* |7 O& E9 d" U
                else
( k5 ]8 ~- h  G                {# {5 x- W+ c" ?& |& p6 {. E7 `
                    if (numw[i] != 0)" K, j! x5 Q. l& d
                    {' s3 q9 _$ u$ o; q
                        i++;
0 z) I0 E8 q0 U2 ]' d, a- x4 _                        k++;* g/ O9 d. v/ I+ p+ O
                        if (k == n)
# J- N3 I# D$ x1 S                        {6 d* q! U# Q# p) S# N, |4 _- G( c
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
9 d. s& a' T% r, K! I) s$ W) P                            k = 0;
( |6 D( u; H7 ]0 C) R9 a: K; F- _              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1% T! k) A# B3 I# x# x* ]6 {
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
4 ?6 I$ z+ b1 d6 I6 g* _                        }( b) k+ K6 N) p
                        else//输出暂时还没有改变数组元素的值
0 A3 J( `  u( o  c0 s) s9 G& r4 a                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
0 J& J; k* m9 G% A  F: }9 w$ s+ r                    }, I- g, S( U) L
                    else
; I# w* @- l* J! C6 J7 {1 V& A                        i++;//数组元素为0,直接跳过,不计数。。。
, B9 b) ?+ l- b0 ]+ U, c( `6 M                }0 b+ B+ C" d8 w  y4 u$ K
4 S/ v% B  c# U  m/ J# f7 a
# b, U3 \2 F, p. S8 C; |5 g$ R
            }//结束while循环
  W, U, P0 k# U5 \6 H" X6 S            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦$ q6 W% L$ w* v, M1 y
           - a3 M* ?  U4 t% h
                if (numw[i] != 0)4 |5 E% @7 O6 M
                    Console.WriteLine(numw[i]);2 ~( X6 U% e, a/ h
           
" u0 w7 j; [+ C0 B            Console.ReadLine();
  \* D" g7 ~% Z- R% C) }        }; a; X& R5 M7 K* P
    }% K7 W( ]! Y6 Q, ^+ |' J
}( f* P# |' r, F
小甲鱼最新课程 -> 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-26 13:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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