鱼C论坛

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

猴子问题

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

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

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

x
大家好!5 v% [5 i7 o2 q9 O
这几天我在忙着编一个问题,我用了一种方法编出来!
6 j* B6 G0 R! t% k, R5 ^' X  w但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!2 j% S3 M# @/ _7 Q2 H) ?! p
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
9 f) `2 k. v8 |+ H% T
9 f4 y: j0 Y% z0 X. y8 J. ?( R, E, l4 o% k8 c8 T2 O
                            题目9 z: L" ]1 b, R' X/ }; O
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。' [, k0 U) a' |! t; C( p
第一种方法:利用循环链表
( O$ i8 }+ f* M) [$ B3 G#include<stdio.h>
; `% l! m" R( L2 b; v#include<malloc.h>
# ~  M8 `* ^1 J: G' O2 d$ F. G#define M 8            //共有8只猴子$ M: j& P1 T- @$ V
#define N 3            //数到3只时退出第三只: c: x- X8 Q# d1 B3 m
typedef struct monkey
; ~0 U+ r- z! _3 N+ `* U) s' f{int number;% |; `6 v# L. a4 @  z% z
int flag;5 h6 w  c0 o# R* i0 t4 _  m% [$ o, g
struct monkey* next;9 p8 f3 }, W; w; E8 A
}MONKEY;
" T: Y2 B0 Z; |" O+ G& a2 E+ n" vmain()
$ m; W/ F2 L" t5 V- \6 x{ MONKEY *head=NULL,*p,*s;
  a6 Z4 u  T0 ?# x1 H7 H  int i,sum=0,count=0;
  T8 D/ R) ]: C0 s: a8 t, m! r  clrscr();              //清屏8 }2 l/ n, @1 h- K5 Q# }
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
0 D3 L4 `9 J7 S& X# l% X# Y  J  p->number=1;p->flag=1;. u  {0 C; z5 @
  p->next=head;6 O( i1 ?( J8 T* F
  head=p;
9 h3 H! v8 H" C' k  for(i=2;i<=M;i++)
0 m" o3 t* b2 A. Q: o( f, W' N    { s=(MONKEY *)malloc(sizeof(MONKEY));
3 Q& H  M, n& }6 [' j" _5 v     s->number=i;s->flag=1;( V! S7 ]3 u. x5 O' ^0 k/ ~1 H
     s->next=head;, m$ ~) i/ K+ b2 g
     p->next=s;p=p->next;
& Y, w7 e2 k6 k9 P    }& R# E) w; X9 s  i4 f6 K) Z
    p=head;: v0 l9 k( e1 m* v9 }! B4 i7 |
   for(;;)* V7 o5 [9 D3 E* Z7 S
    {if(p->flag==1)
- e- n0 v1 V1 s       count++;" K* ^- U$ j( z) N' q
     if(count==N)4 i4 ^5 A( B1 K- u1 w" D) [
        {p->flag=0;
% Z0 i% L: Q7 V, [         count=0;
0 R0 e9 n# ^2 }* ~1 O& E5 D  ], m         sum++;}6 Y/ Y0 k  v) \. M& K9 R
     if(sum==M-1)1 t' A5 X# g4 R
        break;
2 d- I3 _, A4 e  l( [% w& S, L     p=p->next;
1 a" I6 y: a7 K$ _7 M' r    }
# \* {4 X* Y! S+ c- f1 i7 Y    p=
. }7 T8 I' [8 a- `    head;" Z6 L  M& W/ y5 b8 O
    for(i=1;i<=M;i++)( J" }/ d: R( G, y# _1 Z
    { if(p->flag==1)
' T- {3 @* t+ d& X1 l3 |        printf("\t%d",p->number);! V6 X7 H) C, w3 x" y" ?6 P6 s! P
      p=p->next;8 ~  X% D, Q9 T2 R( c
    }( @; j7 V9 ^2 p0 i  a
+ a4 L( e3 E/ B& _

- u  X6 N# h/ b6 ~9 r+ }" C1 {- \
7 |4 D" @  ~5 d7 |1 s9 g* E2 A}
* B4 g* p- n" r% ]: J8 M: B$ v1 k3 @
第二种方法:数组
' O) A& U! P: E. J  `#include<stdio.h>
1 V6 u8 V- E; j& q) w5 i( N- O1 e' y" \#define M 8
9 h' }" F8 w* astruct monkey
9 X: S% c: H: z' [# K{int number;* d3 `! i, k: g( Z1 t& j* h
int nextp;# j: Z2 M. J7 |& j' a" ^6 l
}link[M+1];
5 |6 @/ ^1 M. C2 K* ^0 c' ^' B5 j2 O" ]0 F
void main()
9 W7 J& r% {$ l5 Q$ X2 m" j{int i,count,h;
  q5 S/ G5 Q5 B9 k# @/ K! ?for(i=1;i<=M;i++)
' m2 e1 @8 `6 M' F* W5 p' R! [{  if(i==M)! M# \% @& F- |+ B. ]
   link[i].nextp=1;9 _( Y* u; a3 p% s# I
   else
& [! j1 B7 ^/ y0 i   link[i].nextp=i+1;! j' e& I& F$ o* A$ Y' T0 ~
  link[i].number=i;  H" t/ }8 `) b1 G: z
}
" M# H# h9 w. c) xprintf("\n");
# ]: w- R, X) Ccount=0;1 Y. Q" Z) E7 S3 V  }' h" d3 B
h=M;  X) O# P. _; R3 R4 y5 J6 s
printf("依次退出的猴子: \n");( I" |. K* ~! u0 r# K/ c9 E/ W4 p
while(count<M-1)  m% B$ _2 X" H' `; ~' o& P
{i=0;
, j1 ^) N7 M1 x$ D4 ~while(i!=3)
- L1 b* c8 J  V- e{ h=link[h].nextp;
4 v# D9 [1 w' f7 R7 l! R6 L+ Z3 x   if(link[h].number)
( Y9 R/ c/ O6 [$ b3 {5 j     i++;}6 \) s9 K0 h! Q3 j7 g* F
: ^% L5 I* f4 G. \
printf("%4d",link[h].number);
, D  h: q$ Y7 Q3 y2 zlink[h].number=0;1 C8 E8 H' W: X# ]2 y. y
count++;5 m& O3 G. _$ U' K7 k
}
/ o% e4 X0 P+ h* a8 \6 m- N, S" ?( @. u4 b9 s
printf("\n大王是:");2 n+ p5 e- K' R7 ^
  for(i=1;i<=M;i++)
. N# ]% s' J8 O% e  j  if(link[i].number): c2 _  E% L- ?8 [: ^. K: V5 i
    printf("%3d\n",link[i].number);. N. @# u) l# Y! H
) ^# x2 a" {! ?1 X" _- L
4 e" B( e' Q/ t  P$ y( a
}

) r% ~  N3 {3 q" V& T& p$ g, r第三种是普通方法for循环

3 h8 q, l/ v1 F5 M#include<stdio.h>% j9 a: G" F, z1 c/ z
void main()
4 O: D  j  t$ C9 g8 y  u: b{ int i,k,m,n,num[50],q,*p;
6 S" G4 x# r% M    clrscr();
& L- ~1 {: _( J1 c5 a- f$ \   printf("input number of person: n=");
% }/ _  m9 z3 E6 h/ z    scanf("%d",&n);
2 L# \7 @7 ~" a" n' Y' Lprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
+ K" h. `9 O) M$ _    scanf("%d",&q);; \  @" }& L' |# @1 h. a& j
   p=num;
2 C- r0 ?& O) `6 @$ @; Z  Q  for(i=0;i<n;i++)4 C7 B4 H' m# e
    *(p+i)=i+1;5 d+ ?7 j! n, R7 t
   i=0;
0 J# \7 Y* l- J6 q8 A6 h3 A   k=0;
! o" O- G& J$ @: ?. R3 I* G   m=0;
. B" A8 j! R2 r8 W2 |$ P, z  h  while(m<n-1)
% L+ h7 T8 c3 O% Z* C: f   {if(*(p+i)!=0) k++;
7 y$ @; F# R9 X+ `, m, c9 j+ C     if(k==q)
8 `8 o! c, R' @1 J  A      { *(p+i)=0;* a  M  y0 e: ~9 @8 U9 C3 u
        k=0;$ C7 a: g* _9 F) M$ m: X2 Z' Y
        m++;+ s6 C9 b! S0 H# D1 B
      }( U+ T$ F# K7 [4 e0 D; P8 ^
    i++;' \4 g+ [+ Q  s0 p* i. m; H
    if(i==n)i=0;
7 p# Y% i) [9 G, |   }! P* g6 P. @4 e& o" B9 W3 F
  while(*p==0)p++;
  P  t% F! s  d3 J, ^& J    printf("The last one is NO:%d\n",*p);3 S* \* U7 |! |) C1 [
     getch();
6 g- W3 V- c9 I1 V: _# M9 Z+ g" T+ A! N. @9 @
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;  F' k! [* g1 }: d* p
namespace 又费马达又费电
9 @; O7 i# h7 Z0 M1 Z; Z- g. _1 }' r{. {# C6 @  Q: m3 Q
    class Program' A0 Y& e' O' E) K3 Y
    {' [9 f7 n. X1 U
        static void Main(string[] args)
) z$ ?  G& }" Y        {- F9 g, \4 ]& i
            int m, n;( t7 k* s; }: Y9 ~& [) R
            Console.WriteLine("请输入数组长度");
: f2 a& @+ S1 `. {! Z0 n- G            m = int.Parse(Console.ReadLine());//m为数组的大小
) G9 A* y5 x8 H5 r: l% s% g2 o            Console.WriteLine("请输入要截取数字的大小");( w( q8 B* C; l3 r* d. w
            n = int.Parse(Console.ReadLine());% L; W6 r  [6 h1 i4 n/ m, A
            int [] numw=new int
: n# J" X6 f/ L9 A! x2 d8 m
: Z0 o- e. |  n' p! m&shy;&shy;&shy;;
. c* L6 I, R4 Q9 i0 ]  e            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
& i0 \+ |- W2 `# g' S            {
  ^3 z9 i' R' u! p& s1 l. X                numw[j - 1] = j;0 s& V! ?9 B" a/ @
            }
( H- u- K! V4 J) j+ \0 R* K            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
; E/ @+ d8 L" R% d* u$ ~7 j" W  ?            while (d != m - 1)
) E+ Y/ R* f9 W) e            {
: d* W* I; A+ Q, [$ i. j7 @                if (i == m && d != m - 1)
0 R- ?. g* }% V                {7 T" c7 A; F- s: o9 S) x
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!3 `% k7 G4 |2 E* C7 S
                    continue;
# u) M: U+ l' }                }
" |+ n- r- \4 {: T7 c( _+ }8 V                else! z$ X1 f* r4 b
                {
( [* b5 Z) Y  Q9 {/ h! a, J  e                    if (numw[i] != 0)
& d+ Q% L2 ?4 ^% q! c                    {
9 i: [  y/ v  R; s7 l, f& `                        i++;# D: k5 u) G! f7 T3 y2 L& I% _
                        k++;! P# f9 C6 }" P! E! ?& W- l3 U
                        if (k == n)
. R9 [- }/ H* q3 @- b1 X$ ]% j- T. Q                        {
6 e7 K; Y1 U: q                            numw[i - 1] = 0;//把在n位置数组元素的值改变了7 R3 v( i6 x, Y; |
                            k = 0;' D: U  ^4 U! Y' [2 }, `* y
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小14 T7 O6 H# H& T
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
2 k, |* c8 _' u# M" _/ S) w% I                        }
7 E2 O; f/ H- t: b5 @                        else//输出暂时还没有改变数组元素的值
1 w( D/ j) O7 X1 R8 l/ l6 N                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
, p, B  o; X" y, S- u+ B                    }& S/ q: z! y8 V5 D; g% `& z5 P: o
                    else- y1 S) T  x: S1 B, `
                        i++;//数组元素为0,直接跳过,不计数。。。" i4 b3 F4 a2 H3 m- R, Y, p
                }
# ?  n1 h1 }. W" x
1 y) R! S$ F- B9 k/ v, v
; j/ u' f$ L3 c5 B4 ^. l            }//结束while循环
& P2 q1 R: u( M% A( b* U            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
9 ?3 `: O1 u6 g# @2 ]& R           " z" q! f9 f7 [  S
                if (numw[i] != 0)6 u# G3 e/ {5 {7 a
                    Console.WriteLine(numw[i]);
2 R! [) H$ x, R           / o$ G; V) E# D2 J3 q2 \
            Console.ReadLine();; A) w0 G  E+ u* A1 }- N* T0 r# L
        }
0 \0 |6 J; c( A, B4 V    }
. a0 i/ w* `: N- [; i* j}$ e2 A; T4 r, W3 d8 C
小甲鱼最新课程 -> 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-1-16 00:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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