鱼C论坛

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

猴子问题

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

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

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

x
大家好!5 B& \0 ^; y  H+ |4 \
这几天我在忙着编一个问题,我用了一种方法编出来!2 A, i4 W. m+ g( d* m! V
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!2 X) {, z% l; ~6 U# k& s9 T
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 6 H4 p, {8 n- u9 X
2 ?6 q- u: u7 c) l" w

1 K" u# y5 h4 z, z9 l
                            题目6 B( k# q# H4 W0 z
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。8 q. O' k2 M1 g3 q. n3 y* |4 v4 L/ ?
第一种方法:利用循环链表
& ?! _0 v9 I' N/ ^#include<stdio.h>
  U* F: B" q8 U/ J# i' H#include<malloc.h>) g( s$ w! a- @/ F& A
#define M 8            //共有8只猴子
) _/ O5 M9 W* J0 J$ p#define N 3            //数到3只时退出第三只* K4 A2 ?8 w" T5 I3 i
typedef struct monkey
5 d- |' {/ }# V" e  ?{int number;
0 F: m7 G1 f" ?: L- _, aint flag;0 J1 y* W/ |/ ^* k
struct monkey* next;
' }2 y6 s7 A2 V; L+ x}MONKEY;- }; U8 c: N2 w" B! P! w+ M! @( [
main()
! W+ a! m6 X, L/ }{ MONKEY *head=NULL,*p,*s;
% A4 L& b6 Y. E$ O. F6 _8 j  int i,sum=0,count=0;
" R4 v8 m, W1 q1 \5 B# _' M  clrscr();              //清屏
; R# Y1 ~" g$ P3 e  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存4 B6 x5 t) k5 o
  p->number=1;p->flag=1;! T, C$ b5 x2 X, t7 z
  p->next=head;
8 q+ c3 _7 ~" z5 N  head=p;
5 u! A$ r+ D; W, W  for(i=2;i<=M;i++)
: \' s  J3 D, }0 e0 p3 v    { s=(MONKEY *)malloc(sizeof(MONKEY));0 @: o: [: A: R7 L  K: \, v1 F
     s->number=i;s->flag=1;
- Q& ?# E- F. a/ C5 z( N/ ~( D' h     s->next=head;
. L0 P2 x) k" G: u! `     p->next=s;p=p->next;
' m$ K: O# F  ^0 I    }8 I4 Z4 E# m7 ?+ _8 n# s$ _
    p=head;, t: y  x8 S6 x3 R
   for(;;)
/ L/ H& _9 \6 {+ l7 U    {if(p->flag==1)& i) y- Q9 d# r3 w4 C4 \8 A
       count++;
' U* N. O1 f; [0 O/ L4 K     if(count==N)
; w8 D, ^3 Q- E        {p->flag=0;6 e1 {+ Y; I2 @8 H# j
         count=0;6 {" L* Q! @/ K; s+ p$ B# P
         sum++;}
( h8 U5 R# S/ g8 Y: I9 F& ^! z     if(sum==M-1)6 z4 R% U$ U7 P% [
        break;' D9 v# t7 z0 {* M/ A
     p=p->next;) \( [. E2 ^5 N" i
    }5 m  s% l: b/ [: ~2 s: u
    p=( w0 ^7 w, O3 @, w+ z! N3 O
    head;
6 U2 o' D4 c- u! G6 p5 c. b+ Y    for(i=1;i<=M;i++)
' ]: I2 R9 \2 N" u    { if(p->flag==1)5 I2 ]7 b& c/ d& s
        printf("\t%d",p->number);9 v. L8 o$ S: {! \- Z- B; q8 A( t
      p=p->next;/ F  w' O; C1 K; L! H5 _. _& j2 o
    }; S6 \: u- P1 i7 W
& [9 W. d. b5 y2 B; M5 ~& }

  B" _$ i1 B0 _* G# @3 y( `! s# |: F0 l3 ]( b
}

) O6 @4 ~# F% z5 ^6 P- V$ ~第二种方法:数组& H, ]$ I* X2 P
#include<stdio.h>% |" S/ _+ U7 K5 t- e6 X
#define M 8
1 x/ J; ]$ V* Ostruct monkey, n% w0 A& a$ N
{int number;
. s+ R. d! P& w1 \! nint nextp;( d9 Q$ Q- {. A5 [- z& A% b; }
}link[M+1];
- i4 E! ]2 e$ p6 E. Z4 t- c
7 K) O) ?" K# gvoid main()
4 t# r* Z' ]; u+ q6 r' A3 ?{int i,count,h;) X) _. ^* i; B' X6 _& T
for(i=1;i<=M;i++)& G# B* o% l5 q! G4 U
{  if(i==M)
. L1 ]- \% q, C7 F6 t   link[i].nextp=1;
+ }% X+ w+ F7 g( Q, M( [( r) {   else
+ a8 L; c2 G! m8 @" x% a# ]   link[i].nextp=i+1;
4 z5 ]& B* a; v: z7 F. \  link[i].number=i;
. ^, a9 \/ [* c9 D; G}# [; g- k% O, x$ y" D( _6 A. ^
printf("\n");9 a* C( Q. @5 I+ g0 H$ Q5 S; D6 U
count=0;& R$ n7 \! D2 ~* ]' O% @
h=M;6 t* Z3 b9 T7 E5 R; ^. d
printf("依次退出的猴子: \n");
" Q  y6 ~: U- \5 vwhile(count<M-1)
" d/ v0 I: ^* _' b. N. S  W{i=0;
. [0 Y& w: _5 U& d- o# ~while(i!=3)3 }# D* y* c; S. `4 N+ \
{ h=link[h].nextp;
" n& d$ G9 u/ z   if(link[h].number)/ x- h  @4 f5 S7 U  k
     i++;}
/ x& J0 c- |. Q( s/ z7 [6 e4 A0 d( j1 g9 @2 l5 m. E1 R
printf("%4d",link[h].number);2 ?% F7 B- c" o. _  l, c  A
link[h].number=0;2 v! k% ^2 z) T: P/ X+ U
count++;/ }8 }, u" J' B5 e" W& K
}
, ^( I: F2 ~  @8 r5 f6 B0 J' q# j* Q# C2 O. n
printf("\n大王是:");# K9 B0 c  y/ ~4 b
  for(i=1;i<=M;i++)
! r$ x( b5 e9 f& T/ w6 {  if(link[i].number)
& {! J2 ^% u3 z8 M5 p2 a    printf("%3d\n",link[i].number);
0 {" ?; g" J/ U
4 d9 E! M1 _+ J' ~' p" E: U
3 c. ?- b3 O2 b/ ~* x8 T! [2 o}
& @8 n9 p( a, _) e
第三种是普通方法for循环

# }7 S3 e+ \+ \! M7 j6 x' _#include<stdio.h>5 m" k$ p1 N* _4 c# t2 X- X
void main()% C& p2 h  s; ~) d  [1 \
{ int i,k,m,n,num[50],q,*p;. s; q4 `. Q* J# i+ `. `1 D
    clrscr();
: b% r1 z- ^$ t9 a; b- h   printf("input number of person: n=");& @9 F* _8 k1 `- t! `1 L2 w8 Y
    scanf("%d",&n);
0 P1 ?# J  k( r! O. b8 @printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
' f" k9 ?. T3 g) x8 f    scanf("%d",&q);' U  z- @! \' q6 r+ r/ E
   p=num;
  m4 A/ j2 n2 C" b  k( X" X3 g  for(i=0;i<n;i++)
+ ^" e: n: ?0 i7 e    *(p+i)=i+1;
4 B! e4 v* @& c$ ?! i) n' |   i=0;
8 W8 u: F* Z! V! I" i( H   k=0;- t1 u' C2 y5 a( v7 {* L( [7 }9 _
   m=0;
3 _; S, ]2 i6 ?  while(m<n-1)+ y5 {* I8 t% J
   {if(*(p+i)!=0) k++;
( F: ^! W: A3 O2 C0 T% _: T     if(k==q)
4 P9 X, y# Z% f2 O1 ]      { *(p+i)=0;# r* _; d6 E& l5 r8 d* S6 T6 y; Y6 j
        k=0;
: s5 h, i" U4 D) w+ h3 t        m++;
$ j8 p0 `% J4 K& L4 a      }) f' y2 C& h0 |
    i++;
$ Q9 {5 L8 P* B( y# b& u* a    if(i==n)i=0;0 G9 W- {9 [7 I! u1 F. M$ B
   }* J8 c% r+ Z7 |) d- `* _
  while(*p==0)p++;
, y5 E( j: a# x/ d  f6 S# R$ r    printf("The last one is NO:%d\n",*p);
+ N) o+ a: V% g" ?0 k. u  _) e3 D9 O     getch();- f" P# G* B* F: w% L4 ]
' r5 b# Q& `4 V( g
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
0 h0 `2 G- |  I9 I/ D' O  Vnamespace 又费马达又费电& d" i4 I+ b" \) U/ ]$ |2 ]
{* W" s; p( V# z& ]
    class Program5 J' \# g1 T; n7 E" j
    {8 M* `4 a# l# m! j; m" _# I3 p5 _
        static void Main(string[] args)
" ]/ I2 m$ Y, m% S4 {( b, x        {3 @, E5 F; D0 I
            int m, n;
( o# s- r" h5 @            Console.WriteLine("请输入数组长度");
& Q( ]" y- h1 e7 i1 {' M  C  W$ G            m = int.Parse(Console.ReadLine());//m为数组的大小" d. Y. }7 v6 k& p9 M6 F- v+ N
            Console.WriteLine("请输入要截取数字的大小");. e( c- L) D( D: x7 d
            n = int.Parse(Console.ReadLine());4 o% I6 J4 v5 `+ E9 q/ W
            int [] numw=new int) L8 W1 k# j: J

: Z. u) q3 w& q&shy;&shy;&shy;;
, u! d8 P" R+ ^9 u. b8 b            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数2 v4 h  Z( U4 h' z9 K  I4 e
            {
5 x- j4 ]& i( V* p! y5 u                numw[j - 1] = j;
% b- N, j5 {5 L; }0 s* l            }
3 ?; @8 k7 i( l3 f            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!, Y2 F  a3 k2 h7 b' P
            while (d != m - 1)* m; {  N, T8 {' D. T8 I+ @( t
            {
8 f# X& M+ W- P, ^                if (i == m && d != m - 1)1 b" P/ n. c+ ?, ^4 f
                {
5 P$ N! U( F* X0 T8 @; s! J  V                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
" T/ p8 J4 e* Z, k, c3 G+ o/ T+ _                    continue;
% k5 {% ^' ?# z9 q; r# Q8 M                }% f9 s* F7 r, G( g5 J
                else1 A3 F: [7 ?7 a/ M7 G+ d/ g
                {
" J3 ]1 @+ T' ]* o                    if (numw[i] != 0)+ H) n1 Q5 P  c' @  N" V$ J  c
                    {. }$ x* [# c6 X3 J% Q& Q
                        i++;
3 |! x6 G- s3 d6 w' g- Q' a: N                        k++;
  `& S3 ~7 a0 W: {+ B9 z6 f$ R                        if (k == n)
$ }( V, Z! }, r2 D3 k' L                        {8 W. l/ _; M6 l. |9 J+ `. V
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了( J6 H$ F& L% E: h6 p/ ^
                            k = 0;; i$ V7 m- M. p; U" H
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1+ O6 j9 z4 I% D$ G5 l0 Z  @& n
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
6 \4 K$ t# ~: P8 w+ @0 C  z' |2 W                        }
. s4 w/ |9 {2 B; q6 S1 o+ A                        else//输出暂时还没有改变数组元素的值
8 S* }! `" `% m                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
! r8 F: \1 B2 f3 g                    }, C% ?7 m# X! m+ g; `$ ~4 e' n
                    else
: m( F3 u8 v% L8 Z1 b' x! G8 i                        i++;//数组元素为0,直接跳过,不计数。。。8 X- t1 _3 K# Z+ J  s9 u$ ?' A
                }
9 ^; x, m% [+ G- L8 z4 C2 w, v / l4 a8 g; a$ u  W7 H8 s) U
6 J- n7 O5 r7 S! x
            }//结束while循环
. n9 v1 x$ j3 e; r9 c3 u            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
( R7 |$ Q1 Q) b- c; k           ! l7 z7 W- o0 z2 j3 A
                if (numw[i] != 0)0 U. j  r& j$ H
                    Console.WriteLine(numw[i]);/ S/ H- G7 A* o4 s, A7 y! @
           
5 i) \8 v/ ~0 a* {1 N. C' {2 W! m$ l' _            Console.ReadLine();
" p3 M' \: B, \$ r7 ?        }; W; C( ^# N% q4 R
    }1 R% w7 K, f& I' s' L1 j; ~
}* {( P7 K; a# L5 M0 L' G
小甲鱼最新课程 -> 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-3-14 05:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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