鱼C论坛

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

猴子问题

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

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

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

x
大家好!/ l0 m) m& S. u
这几天我在忙着编一个问题,我用了一种方法编出来!
; A! d0 m. }# l6 h6 ?  G但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!( K1 o: _6 D' Z/ a9 w2 q1 X. v
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
( J7 q6 k7 `+ }2 ^  T4 @, e
4 \5 Q- C1 e- L" d, @) e% X3 m, J2 t7 z* Z  o/ o+ v
                            题目
& J, O" u  D. b- i, }( s2 M4 K/ ~山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
2 J% F- n% s, A第一种方法:利用循环链表2 h* J! Z. y# T
#include<stdio.h>3 A* P& d8 }) W4 y, y
#include<malloc.h>9 d/ J0 _) c. F2 T
#define M 8            //共有8只猴子2 K- C. S( ~# E" H- _; s
#define N 3            //数到3只时退出第三只! }. `9 }( \5 x4 K
typedef struct monkey( t4 G6 n& q$ O4 s9 Q1 v
{int number;% n# ]( Y; h& c: ?( A& t1 u
int flag;
: _, r4 ~; M1 q  Dstruct monkey* next;. o  \: R! X  ]1 P; H( I5 I
}MONKEY;
9 ?; K" s: e, D8 `main()8 {  v: g8 L: r, E
{ MONKEY *head=NULL,*p,*s;# W! O- a( s% o1 D7 W
  int i,sum=0,count=0;
' i4 o9 C& y& |: _( R  clrscr();              //清屏: F( q. y! m1 s  E, R5 r0 s5 ^$ x
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
7 |+ O. j7 _/ M: U  p->number=1;p->flag=1;: C( i5 Q9 R, j! i4 b! c! M
  p->next=head;6 k2 z* D1 x$ H( T$ F
  head=p;- L/ W/ R! K; w5 ]& t5 i4 C6 h% F
  for(i=2;i<=M;i++)$ u. q* R1 C+ \5 L6 B& m+ g0 Y
    { s=(MONKEY *)malloc(sizeof(MONKEY));
. W) ^& R* ^# z, U9 d/ E     s->number=i;s->flag=1;
9 `1 d( A; M3 T  X+ q( W     s->next=head;1 O  v! _8 q( n; @6 c! v% x
     p->next=s;p=p->next;: u# G% o3 N; f% s% p
    }
2 h+ ?' `* \+ k  l' M    p=head;
$ n" Y! V8 A$ \" `, r   for(;;)
& ?& a# _" Y4 g8 z/ w9 f" i% y- H- l    {if(p->flag==1)" R& {# U8 p  s( n9 i- l
       count++;" E; n2 y8 G/ v2 C, \/ Y9 D: X
     if(count==N)
1 _0 t* @/ y, V4 r3 k, B        {p->flag=0;
: X" S$ l# }' F/ J: C' O: ]         count=0;6 _# B, j# {1 j* T7 ?/ ~: Y3 E& U
         sum++;}
3 N# b% ], _; T$ N9 C8 K- |  {     if(sum==M-1)
* V( ?$ j5 \" v( V: m* r& }8 c: E& W& w        break;
: ~0 k( g' y! p  ^7 @! _     p=p->next;
- O* A; d6 C: e3 W- V. E3 s+ m    }
& j% L4 j4 x5 }    p=
, {. W$ L  @# T' v) W/ m  V1 w    head;! Q- L* p8 X1 g0 ~2 P
    for(i=1;i<=M;i++)
6 u$ V* [; w1 K; c    { if(p->flag==1)
( N$ G) h3 \8 J! n9 t- I- t        printf("\t%d",p->number);
: N* E  L. [& Q/ |4 F) @      p=p->next;) `* S. O; d& T% H; D/ L
    }1 h. P# x' y7 _, _) c  {; K

% f6 e6 i8 d) W& [9 ~) ~  u# @3 L: {9 p& l: Y8 K
+ b$ B+ T/ d7 C7 X0 A
}

/ ?, K: O& k0 k9 b  n6 T. F第二种方法:数组5 ^! z& q* }. {5 }9 N: v; `
#include<stdio.h>
+ y# T& s' V* T+ q. S/ ~9 d/ i2 y: ~#define M 84 @( Z; T3 {1 R6 G* @
struct monkey9 O& k! o8 x$ G, f
{int number;' l& ^8 p, j5 i, h! Q. ~
int nextp;' W, s- C( \' x9 q3 \5 K$ q3 l, E
}link[M+1];
: `# D( V, v3 F! x7 S# s
4 T1 K; j- }3 ~5 @void main()6 t, }1 Z) @5 S6 |# L: J# J# B
{int i,count,h;
7 e7 Z1 l( F$ q7 w0 }0 u2 Yfor(i=1;i<=M;i++)
" k' w- ~+ I/ \& E{  if(i==M); k" J5 D9 }0 }, v* \0 `- J1 z5 T( ?
   link[i].nextp=1;9 n1 A; O% Q, m' @5 Q9 b
   else2 {+ n5 G8 ^; H) O' D9 {" W
   link[i].nextp=i+1;; I% T$ ?( s+ Z8 w7 U1 |
  link[i].number=i;
$ d6 t9 h; |0 w  m+ S}
7 P6 A* w% A1 I2 m( l9 {& @* hprintf("\n");5 g! Q% t9 W1 W% s
count=0;% Y8 E6 J* b$ r# {9 L
h=M;
7 c: L% f; T% z$ @printf("依次退出的猴子: \n");
: j6 |/ Y  [' T1 d+ Kwhile(count<M-1)3 ~0 C3 G. h7 S8 X* C! c0 I: z( P: P
{i=0;
6 q* W' R4 \( xwhile(i!=3)
+ B5 ~& Y6 n" o, v) U& Y5 Q. D: e{ h=link[h].nextp;6 g6 r: ~0 ~! @$ p; l. M6 ^
   if(link[h].number)
2 `1 V  J4 m2 x     i++;}
0 w# I% S: @, e8 T8 [9 i5 K! d* l% s1 L$ h7 D# L
printf("%4d",link[h].number);
# d, N0 g( T# G9 _2 klink[h].number=0;
' L0 ^: b2 b$ D8 `0 T) q3 Z# Ncount++;
3 o! q: F3 I' f# G0 l4 `& `}
; l* o- o; M: k4 P! }; b3 F# i3 k' Y/ t
printf("\n大王是:");2 `4 _, p2 G3 ]
  for(i=1;i<=M;i++)1 k+ ?! f. d/ {8 a
  if(link[i].number)
) B0 n( \2 r: j: t& H- z. ~    printf("%3d\n",link[i].number);* O* t! x0 S2 D$ k7 G# h# h

" w' q  v. i. Y* i" G5 S5 a7 j* u4 `' u+ h* {9 X  a6 d( p, m
}
7 Z* n$ U+ {& p9 r1 J
第三种是普通方法for循环

1 H5 P7 f! S; ?4 S, d+ P#include<stdio.h>
9 m8 v& P, G( f- U- p) K9 _# Ovoid main()
* B  P* l3 z1 Z, A6 U$ [1 i{ int i,k,m,n,num[50],q,*p;
& T. ?& q' \4 R4 q& h    clrscr();
5 O" r! e! Y& B/ a7 i   printf("input number of person: n=");
! R, H5 \# L4 i: X/ B0 v    scanf("%d",&n);2 u" r- j$ G# C6 D, t6 t
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
) z5 }6 B" N! {# R4 U8 V) L9 K5 }    scanf("%d",&q);
( I. X! Z  t: v- x9 e; n   p=num;
8 g/ ?1 S1 f) h  for(i=0;i<n;i++)
, j3 J% ^* W% [8 w    *(p+i)=i+1;
: {$ x9 h6 E) }7 P* r7 ^( W: _9 h' I   i=0;
* f& u; R9 }$ h   k=0;% [. |& q; _$ n- @
   m=0;
* i) o$ r! o' l$ g; {  while(m<n-1)
/ P$ U* n3 n. y" \- b4 j   {if(*(p+i)!=0) k++;
" |/ h/ Z: Z+ @1 E/ Y9 C     if(k==q)' L  s/ R4 a2 E0 S8 ?
      { *(p+i)=0;
4 |  O  `, g6 \! U& P; H        k=0;# b. A* C' k  y$ ^# N' d1 ~
        m++;& _8 ?/ l( ?  {& p- l; f' h
      }, s9 p. C& y$ p6 ^: F/ c
    i++;
& T. l- E% \9 w3 `7 U    if(i==n)i=0;) |, h4 c6 Y" x9 d  P1 x
   }
1 g4 I/ m5 K. y; u- a  while(*p==0)p++;
8 O) U7 j% @' F7 B, H( g0 |/ Z    printf("The last one is NO:%d\n",*p);
' r# |6 w2 H6 l% r     getch();
& d. l  k! c- h) y4 `/ B% _& q- J$ |* W, r7 [- u
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
8 k) C" p& _, d# ^$ z6 E  B8 Anamespace 又费马达又费电6 z7 {; b0 \, b
{3 J: T! e( n; Z
    class Program+ k/ y1 Z  u" ]8 L  C
    {+ c  s/ B( W' ]9 m7 C9 A
        static void Main(string[] args)& H& f7 ~. t) `/ f& s+ p
        {
3 ^, O  K8 A+ {1 Q4 q7 _% e+ R4 \            int m, n;
3 h+ I" c2 I7 o6 L5 E: [            Console.WriteLine("请输入数组长度");3 j( N. d* J$ l
            m = int.Parse(Console.ReadLine());//m为数组的大小; X: r/ f9 e% W% m5 ?' D
            Console.WriteLine("请输入要截取数字的大小");, G7 b% D, z0 S& e3 ]4 M
            n = int.Parse(Console.ReadLine());
' Z6 Y+ M& v; [# h0 @2 R& y            int [] numw=new int
$ ~) d7 M  a) }2 P1 t6 J6 k) O0 Y
* a3 K( x, \0 ^; r+ }&shy;&shy;&shy;;0 ^/ k) q$ _- l( Z. H' d+ A% c  W: k( O
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数+ r$ l' p# ?% ^# N$ O! U
            {
$ \; T6 U3 m2 o                numw[j - 1] = j;
$ ?* c! H, x( L            }' ]4 S# Z3 H7 z  }$ q' `. A: [
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
. u; ?( a$ D& f# s0 G% i" I0 e) N) r+ A            while (d != m - 1)5 D& r% ?" o" _* v9 v9 |) H7 w) ]
            {0 s' t/ G" n1 }) Q) O) J9 a/ a
                if (i == m && d != m - 1)( K; `2 m. J- r0 ^" ]! E/ ?
                {& Z& q0 }/ M9 m% Z& [
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!, C! d  e, ^0 p% p: G
                    continue;
) K$ K8 U/ s* q8 f$ D                }; t, r  z! N- f4 b9 }% B
                else# H( B+ S: L% ~6 Y7 Y3 y1 A2 ]$ p
                {5 l% W' o9 g% A' o) |
                    if (numw[i] != 0)/ ~/ \/ r' d1 T  _# m8 ~" H8 h7 H
                    {& w. X& g2 m! @3 L
                        i++;7 C% q6 T6 a# |$ g: a3 P" S
                        k++;. v+ S8 J6 y* i9 D7 u$ q
                        if (k == n)5 j- }# s& y& z" y4 @6 x
                        {0 B9 B3 O1 u, o* K  E0 B
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
: h! C2 ?- v8 `# Z+ T                            k = 0;; x- _+ A9 T4 ]5 B/ m/ D, o
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1% {8 A( Y2 {0 O3 R
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);& S4 ^: H% b3 V* j+ f# _9 `
                        }, p6 p2 w9 }' {
                        else//输出暂时还没有改变数组元素的值
, M- ~5 e( ~3 I                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);$ E, M1 o( z$ R5 Q8 B- l4 a. k. k
                    }
: r7 y; v. H; q( L                    else! b4 s4 x  ^9 K8 p$ o7 V
                        i++;//数组元素为0,直接跳过,不计数。。。
" u6 U7 b  f% t+ _- S                }
8 _0 O3 {# b- E& {  `+ ? 6 y) \1 q! h/ h! N3 v+ w

. U) {; L% l6 h; H            }//结束while循环
( m$ U5 `1 F) @            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦' l- Y! z; \# r- T- Q9 s
           
) z+ ]" B( K9 i  Z* h, a                if (numw[i] != 0)
: a# v' A0 y8 g) W                    Console.WriteLine(numw[i]);
% |8 h  `( R4 r5 r  d3 Y           
6 P% J' x- h; J  C2 j            Console.ReadLine();
  s6 d' @* f0 n, T3 _! m4 L        }& y" n( j/ p4 I5 |! \9 b  I
    }1 H  S5 w9 O- U4 T. ~1 t
}
" |3 z' v$ k' U/ i* z+ F: S7 s
小甲鱼最新课程 -> 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-5-31 03:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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