鱼C论坛

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

猴子问题

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

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

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

x
大家好!& Z5 {  V) k+ {* F, U
这几天我在忙着编一个问题,我用了一种方法编出来!
) Q" T% X- m3 A# }但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
8 }! D6 J, ]" m- }( p: O* |注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 2 c# V/ K6 D; w5 Q" _/ Y- J

- B. i( F/ W+ c
( z, L9 F2 j8 g1 L% c
                            题目5 t) j2 e: n5 H6 @- f
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。! |  A' f6 f, c% @, L" n
第一种方法:利用循环链表. T# g5 U  B" e) Q
#include<stdio.h>
; c5 _+ B2 G% _+ ~2 Y#include<malloc.h>
/ y+ |; u2 K: v3 I6 t% e( `#define M 8            //共有8只猴子& ^0 z% Q- Z. ~1 A9 a6 v
#define N 3            //数到3只时退出第三只
4 @1 e2 Z$ c/ u+ R" ytypedef struct monkey; F+ Q4 f( ]" @' P
{int number;
4 F7 h( Y8 E0 M. ?  o& Xint flag;  ^2 H. R+ o) y6 o
struct monkey* next;$ ^0 \  z9 l" p. R: }0 K, X
}MONKEY;
  Z2 O4 y9 P0 B7 C6 |) r5 omain()
- z" Y$ }; [- H5 a& J7 a: V{ MONKEY *head=NULL,*p,*s;9 p* c- \7 `- b
  int i,sum=0,count=0;
! r6 C( g7 u! N% d' }9 Y6 Y  clrscr();              //清屏
- E+ u4 k+ Z, m, k6 G  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
; R. U& W( I4 @  p->number=1;p->flag=1;
  D7 ?( s# N5 @6 j6 M  p->next=head;
6 A$ [) a  M% b3 J# ?  head=p;8 F4 W7 ^& @( V' R9 p" U
  for(i=2;i<=M;i++)
+ t$ k- o0 P0 B* p; b( ^' G    { s=(MONKEY *)malloc(sizeof(MONKEY));
+ T! K4 ?! V" A7 X     s->number=i;s->flag=1;
( [" C: H( F! f     s->next=head;
+ V9 Q: r3 A0 |- k% h     p->next=s;p=p->next;
& k! G3 d, m4 Z2 B6 A* [    }
% L" X+ _2 r$ b# j. A    p=head;
: ^/ F# P0 [, N1 ]( s6 g& c   for(;;)- r  r7 k+ s8 s5 A& K
    {if(p->flag==1)
5 s: Z$ z+ o! y' u6 a+ q* W       count++;
# P8 g' T2 z7 M8 w; `# Y9 Q     if(count==N)
1 O3 w) _) [2 ^, y3 X1 A$ g        {p->flag=0;
* B; L( ]5 }0 D$ Q! [  k/ S1 a         count=0;
1 z+ {+ q2 R, X; i& ^7 [, ]         sum++;}* M3 |+ y9 y$ ^! o# K0 M
     if(sum==M-1): J, J+ I: j- \2 v* P
        break;; o' m4 I$ K: h( {+ h8 @' K6 Y( C
     p=p->next;: X' e; j* I3 X$ F  @1 s" F- p
    }) _' b% Q  x! g' N
    p=
+ _% N( O; v6 D    head;/ I/ H/ a& K8 z
    for(i=1;i<=M;i++), h& w1 W: f0 g
    { if(p->flag==1)
6 `! X% H% h! [2 e  m        printf("\t%d",p->number);0 o% i* \! u6 A! g  N
      p=p->next;1 M; K- G& |, [% Q4 K6 r
    }
+ `! S6 Q. l: x$ {' {  Y0 l% k* F( c0 D3 M4 V  c8 `8 z. T

8 [6 e& ^8 S4 u) V* u2 y7 {: j3 o2 [
}

2 L3 x  R/ T& \& ?# P4 o第二种方法:数组
, E) X7 z3 a3 Y- c( I#include<stdio.h>0 l+ ^* W) |5 F/ s, |/ g- H( F0 ?
#define M 8
  w. i& r& E  H+ J/ Q. w* _' \; r* Istruct monkey8 Z+ ^7 ?1 L/ A+ f2 W1 h7 H
{int number;% }& [1 _. _% J2 Q8 p/ u; H$ D& p, L5 C
int nextp;
; z7 A' R! B: q0 ?+ B& m}link[M+1];
7 [5 @  e  V* ^' M" ]! C) _) `8 W4 n( [( m  M2 M
void main()$ K( x# s* v3 [7 F, U
{int i,count,h;  C; z3 V3 x2 C& u
for(i=1;i<=M;i++)
& C, D( d6 O9 Q1 c/ _{  if(i==M)
) n, b" i2 k$ |   link[i].nextp=1;  _7 R7 U1 h1 Y- c. i
   else
% J: L8 B* f. J$ v  k7 r   link[i].nextp=i+1;7 W7 \/ I5 q: `% @4 `* d6 a
  link[i].number=i;
% r# }7 `5 Q# r3 v- F  u}5 Q6 \1 ~/ t& _% ~, q0 m( e! t' F* m
printf("\n");
; R+ m; G9 ], y  q' Q8 Q5 ]# `count=0;
- m! C( b2 r+ T7 ~  H6 B1 bh=M;
- f- _/ v$ C* R" `printf("依次退出的猴子: \n");/ M' j7 [0 _# T* g
while(count<M-1)
+ c$ i7 `. H0 q* Q3 Z, I{i=0;
! P: I8 Z" e$ k0 lwhile(i!=3)
) J  h- p% x* v6 {! I{ h=link[h].nextp;
4 F; B+ X: K* D* z   if(link[h].number)
" W1 i4 L4 ^8 C! _6 p: f0 ]     i++;}! k3 {' G5 V; L) k# u4 y- V  ]& n% X
: ^* c& Y+ r' D: M! h# p, n& A% J# V0 J
printf("%4d",link[h].number);
0 _) v+ p. }  g0 B7 ~  clink[h].number=0;, \3 W/ w" J/ I' r
count++;
# O& M  l5 y; L. X. Z}; B  C1 x4 A! z" _% l. i

7 H6 R6 U  l+ w: ^! N: oprintf("\n大王是:");
& f2 j9 p& K0 h/ C" I  X  for(i=1;i<=M;i++)' @& u& U3 U$ U3 C
  if(link[i].number)
5 j& t  ]; Y& ^* z' S! w    printf("%3d\n",link[i].number);
; W4 l7 V$ T* {
% Z7 D& b. Q1 m% i
# @) w+ X8 d% a; v) }2 k% D}
  M1 \# ~. l# A. ]) W
第三种是普通方法for循环

+ s) g2 G. j1 G3 T* D/ P$ k#include<stdio.h>. X  C& E" y1 Q
void main()
) O0 Y& U% R, K. o  o- Y1 {{ int i,k,m,n,num[50],q,*p;0 D! F/ z8 P2 ], C& a5 q* }* V
    clrscr();; W- X/ M( q& S2 ^( F
   printf("input number of person: n=");
& G4 C2 C# T6 M% _( ]$ G. g) @) w    scanf("%d",&n);* C8 o+ M# H" ~; q" ?- }) d
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只9 G. F+ M# S, ]
    scanf("%d",&q);, r$ T. W7 z' ~
   p=num;7 I" k/ c# \4 ~  A, k
  for(i=0;i<n;i++)
' s1 l: S+ r  T; H4 J    *(p+i)=i+1;1 u3 E& O0 k) b' }/ k
   i=0;6 Y; a! C! G) T+ s7 |
   k=0;8 b4 f0 {) f. `7 P+ }
   m=0;" f8 O3 W& G' N- }# k% x; V5 ^
  while(m<n-1)# I4 \6 [& K  u# h6 F0 [# ?
   {if(*(p+i)!=0) k++;
: v/ M+ e+ @8 E4 ^+ F. D     if(k==q)
7 G# v8 ?% ~8 {( b; K3 H% N. }" z9 j      { *(p+i)=0;2 E1 t2 a6 a) V" w3 h  f
        k=0;& \1 V  B- u+ H# E
        m++;; d# b2 J* X1 f8 M
      }
, m3 P2 i& V) B# ^    i++;
5 n6 O: d- K6 K( Q" P    if(i==n)i=0;
2 p! ?0 {0 L8 e) w9 `  z   }8 ^/ W$ R2 r5 ~1 j  z- u- y3 `( U: F1 o
  while(*p==0)p++;/ d9 f6 ?1 G' q/ C2 w2 C/ s1 B; Q
    printf("The last one is NO:%d\n",*p);
6 ?* Y& p8 d7 r- M- s" [7 A3 @     getch();
9 w; x# U0 z/ z! N: z
6 [$ `4 z6 r0 C}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
9 g& i1 t: }; a8 f& {9 Vnamespace 又费马达又费电: T. \) J% t- r- a: q" D2 Z5 Z; @
{) ~# ^+ J; p; N/ E
    class Program
9 ]1 b" D- A; ~    {
: b" i( S  Q3 y( W3 [        static void Main(string[] args)
, G& w: J8 U9 [( y1 l        {
7 N3 ^$ O9 P" D3 ?. V6 l            int m, n;6 r5 t7 Y- i# Y3 X! Q8 r6 F
            Console.WriteLine("请输入数组长度");
6 Y$ ?9 }/ ~$ w3 e9 b5 r            m = int.Parse(Console.ReadLine());//m为数组的大小
: F0 x) ]7 K( B( E3 G0 C6 Q            Console.WriteLine("请输入要截取数字的大小");6 b$ S1 C; n- w5 r1 K
            n = int.Parse(Console.ReadLine());
9 H8 T6 a: E: I( y5 i& t            int [] numw=new int/ c# }$ i6 Q* p$ P5 w& R  J

( x1 t# i# s+ x8 H; X  ~! t# w9 p&shy;&shy;&shy;;
$ e8 d8 M  M* F! p7 `# X            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
8 q! k+ e; x) a% f; ~: ^            {- a* \3 a7 C# K! @" k6 |
                numw[j - 1] = j;
  p' e$ m5 |4 ]9 }# R            }4 Y& c8 ]* }( n$ s: A
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
/ n( J2 j) b' T2 {! }7 s  A            while (d != m - 1)8 D! b$ `  V9 J
            {
* _- s1 I3 q5 T' n) ]                if (i == m && d != m - 1)
2 V/ X' j3 p) p: G8 a3 \1 }* k                {, A& ^/ V. `  j) \
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!: U) p: k) W" T4 q' N! S
                    continue;' h5 x3 S5 ~$ b
                }
6 @" g' h8 T  h) b                else# Y) ?1 ~+ Q5 o) q) t
                {4 |8 ^5 f; s# w0 X7 b) S4 u# `
                    if (numw[i] != 0)% ^* ~4 v2 I4 V& \* N1 O4 B
                    {
* O6 w- D* x# k, x# V/ \                        i++;
/ v4 M9 A- e; T' w- C3 G' p                        k++;( @) E+ A' ?  c( |* N/ X5 y
                        if (k == n)
  g# K: T6 W+ v4 D7 e8 I                        {
" O' ^8 x5 v4 u1 M  M/ [                            numw[i - 1] = 0;//把在n位置数组元素的值改变了! r- S0 G& N$ Y( W% w1 A6 ~% B
                            k = 0;
' K& @' G2 K! C' D$ B( y              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
& z, @+ _' N: j3 K                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);7 j* q6 B) t4 W, e; t; W* C9 t0 u) b
                        }+ i- Q( O3 C7 X
                        else//输出暂时还没有改变数组元素的值4 U$ U# T& @' L' v' f( t) X% m
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
" e3 k5 x! D5 f2 {3 z% T  i                    }
. U! U& G" ]4 R4 [                    else7 G; M6 P, }, ^/ v( X2 ]) S# j9 T
                        i++;//数组元素为0,直接跳过,不计数。。。
; N  Z1 g& k; t( {9 M3 I9 C& |/ U                }$ I8 J5 d9 R! S. F; G

7 d4 }( [  [, O7 v  _4 ]
! s1 X3 n& |' p0 l% l            }//结束while循环& T2 `. |3 \7 v9 Q7 I3 L
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦; T# q! t! R' O' X; d$ w. j' d
           4 {! p3 Q! s" F4 G
                if (numw[i] != 0)
# x* s% P: G" V. N) o                    Console.WriteLine(numw[i]);6 q' J  e4 p% }" G( p# M
           - y0 P5 y$ X- |7 |
            Console.ReadLine();
  X# e- Z6 b0 s) G0 N        }
/ Z  X& n$ ?' E$ z0 G, `! o$ ?    }& e7 O6 O  {, T: _7 K+ p0 t
}
8 z( B; x% v$ }% B3 F9 k6 Z& P
小甲鱼最新课程 -> 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-8-21 15:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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