鱼C论坛

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

猴子问题

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

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

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

x
大家好!( U+ E" L! z2 V; K8 P# D+ `" U
这几天我在忙着编一个问题,我用了一种方法编出来!
; u5 I, [$ m. c( Q* K: e但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!( h+ {5 a' f! h' N; n
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
9 ]9 n5 ~& H( X6 Y/ X+ k: ^2 ?$ P6 W: W& g; S! V  A" l

' ?1 W7 |; z% c% N. k  T
                            题目
# T+ l$ f  q7 K$ v$ g山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
# x+ s( s8 _& ~7 z第一种方法:利用循环链表
/ Q+ C, @7 n: d( s# E#include<stdio.h>
4 o; O' N+ E/ g, W* V#include<malloc.h>; j) I6 G+ k5 X) M
#define M 8            //共有8只猴子
& T1 ^- t( W' r4 Q( Q* n; d#define N 3            //数到3只时退出第三只
) I: x5 D' {0 T8 e* dtypedef struct monkey
: E/ d) b- o! O3 ?8 \* E3 U{int number;6 B1 z  }, k5 K7 M. q
int flag;
# E) d& `8 x: w7 ]: fstruct monkey* next;
4 `( g, w( Z5 F2 |' U}MONKEY;  ^+ F# K- z+ o8 d/ ~
main()
6 [* L  [  I: n9 Y{ MONKEY *head=NULL,*p,*s;% r; y6 m6 d! R. m
  int i,sum=0,count=0;
" v, e) c/ q  T0 Y/ s# z  clrscr();              //清屏2 f! b& b1 K+ r7 F3 Y, `4 H1 p& [
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存. y$ N- l% f. |7 J
  p->number=1;p->flag=1;! G) f9 z* a" L! l) c5 `6 m% `
  p->next=head;
* N7 h1 h% {4 f7 u- w) U. A* s) a  X  head=p;
+ C: Y1 r( K9 ~' O4 j  for(i=2;i<=M;i++): n% i! f! t" ^
    { s=(MONKEY *)malloc(sizeof(MONKEY));
+ ?! y* R# N  N: Q1 G# y& }! G9 \     s->number=i;s->flag=1;
( q) k& J# F: T/ p& O0 D     s->next=head;; a' n5 s* y( @" b
     p->next=s;p=p->next;
$ {- j0 S8 q0 M# P5 Y$ u3 K    }
* M5 L9 b- q! d' m' }" c    p=head;. Q# |8 E# Z7 U+ T7 m( H# p& @+ `# f  k
   for(;;)
$ P) i8 m' D' x9 w' l    {if(p->flag==1)! F1 P( V8 E. j' U6 P- j
       count++;9 O) y% B% G2 N8 H  j
     if(count==N)- G3 j0 R2 K9 E5 s% b8 t
        {p->flag=0;" U% H+ J; ~, c, S
         count=0;
3 Z9 |4 X& H& N: u0 Z! k         sum++;}
. q: P- Z/ f" M1 ^     if(sum==M-1)0 y- b5 I4 l. x4 s- Q9 R* ]
        break;
: V& @  _' p  E     p=p->next;
2 Q& }' c6 F9 ^) o! e! b$ ~    }
0 v. U1 e/ _7 _. O, ~0 c, Q6 j    p=
4 }; }3 ~8 ~% i8 J    head;+ ^2 a- g1 s6 F/ t, W
    for(i=1;i<=M;i++)
2 k6 e8 C) K" t, i6 Q    { if(p->flag==1)
# W7 k) Y$ o1 F% T( g        printf("\t%d",p->number);( o6 M- d: g+ m+ T# d, L$ A
      p=p->next;
  i5 o9 K5 J: }    }
7 s9 Q. f8 ]9 Y
* T. _" W: q/ |  F  a2 d. J0 S
8 U- X4 {8 ^% W+ k) w/ K# p7 p  x& P" a/ J9 X9 J
}
* K( C2 d) t! [+ Q6 u
第二种方法:数组4 y, d; m& _+ ~( A8 Y
#include<stdio.h>
4 U! e, U2 M' h1 j- X, a#define M 8
, C$ `+ S6 \' H3 X8 }6 `struct monkey
, ]5 N: c4 G0 B' F{int number;* s9 s* O4 ]- x( u, ~7 @
int nextp;
9 H3 r2 H$ p& V. D}link[M+1];
) c1 y0 V: |. E- c6 O9 E# i" e( b% q( R) `
void main()% o% m, H5 o% n7 Y0 ^" ?
{int i,count,h;* X: F" n! p1 q# n& b
for(i=1;i<=M;i++)
- i( d/ o: v) ]! H% w& I6 s9 \6 I{  if(i==M)8 P0 @) Y' U8 O; j
   link[i].nextp=1;1 o3 `- ]5 _+ x2 r
   else; i- O! s& q& i6 I* Y0 D; J/ t3 B1 Z
   link[i].nextp=i+1;
: k8 y8 R0 K) n2 M3 n5 N  link[i].number=i;; e! `; F3 N0 z  p5 N) R
}; E2 ]7 `8 S6 x# F3 J
printf("\n");
/ S2 `1 _  d9 f9 ]( b- fcount=0;
; O2 _* |4 {7 H7 {0 f/ ?  z8 Vh=M;. t% M3 C, K$ U; d3 O6 _' Z- Q
printf("依次退出的猴子: \n");, [" W" V# |' s, w6 o+ R
while(count<M-1)! H' |: o$ b( _6 K7 g, _
{i=0;3 f8 K1 c5 }. o" s
while(i!=3)( n. h' W, M; E* s. b5 _
{ h=link[h].nextp;
6 q! w9 {% a2 z% d6 p   if(link[h].number)
# O! v- g+ d% c) R. u     i++;}
' B# s8 D2 S4 k0 c, J8 v5 x3 ]! q* M, p- H* H
printf("%4d",link[h].number);
  r" J: O, [, [, C# Elink[h].number=0;
1 n1 t, f: Y; A/ @count++;/ X8 Q+ v4 \6 X7 u
}
+ W0 a7 k! o4 {; W9 s/ m: m# J8 M- u( G* u- R, i
printf("\n大王是:");$ q. t1 g! F0 F' O
  for(i=1;i<=M;i++)
; X5 ]0 T$ `6 g0 f' Q  if(link[i].number)
* I8 z& \# w8 `% `    printf("%3d\n",link[i].number);
" d  x) X. |  R/ c, P5 G7 d' }# U0 b$ O% S

4 I- ?- n$ T, r9 \" h) Z}
5 b  P' b1 G$ h: p% v. y
第三种是普通方法for循环

% ~- z; i: \9 [, g2 g1 a, Z$ _6 Z4 ~#include<stdio.h>
& {5 V& s& P( W+ I' x6 evoid main()
  _: \7 f4 {' K# d& S3 c  j  {{ int i,k,m,n,num[50],q,*p;" `1 O* l( X7 j. T: G- [
    clrscr();
3 Q! G' W3 H1 j6 {* s   printf("input number of person: n=");
1 D# U+ `' f/ ]% d    scanf("%d",&n);% u& i' Z% B( j! x5 `8 M% b
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只4 G) i! D: j+ a: v
    scanf("%d",&q);2 P3 |/ E) H5 {+ L  O
   p=num;
) b* u) H. q! W9 ]0 I  for(i=0;i<n;i++)7 d( X- R+ |: h, E& f& V; F& m
    *(p+i)=i+1;) b9 Q$ v$ H, Q: n) N. w
   i=0;. o) J: ^, N" n: @- U/ W
   k=0;
' d0 \  @+ q- n  L   m=0;/ [6 |3 n* e7 p1 f- L% R, I7 e0 m/ d( B
  while(m<n-1)
* B' F; R8 Y  L/ K   {if(*(p+i)!=0) k++;
" \6 b! n; u8 |) a6 N     if(k==q)
0 |& w2 @) L6 _" O, @* s/ M2 [      { *(p+i)=0;
" C( V, z9 q+ L' q8 h- j        k=0;! I, K+ R1 w" c: s
        m++;6 S1 D& a; @) t$ b  `
      }- K! u# u. M& Q2 ^' k$ |: a& ?7 s
    i++;
- W: W5 M4 e. }, K    if(i==n)i=0;
& |+ P- O& j6 v& G( [0 a5 g1 }   }
" x0 F; x1 }2 P' b+ Y  R- P  while(*p==0)p++;* @/ K. ^4 ^- w& |9 f
    printf("The last one is NO:%d\n",*p);8 ~) g- A5 v& p" Y1 i9 g$ M! @# F
     getch();
% S# O' Y3 O7 c* P( G; \
4 @( w6 s  D) J* y}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;. S* G' f. c& \- U9 N" X, l) W
namespace 又费马达又费电) Y, x2 F/ M) w$ S9 v
{5 P6 h& `; s% W$ m
    class Program
. F* M! q# U, w    {2 n- u* ~. N3 C) h: s
        static void Main(string[] args)
2 n- C! J  ^  b* Q( u/ Q$ a        {
: M( a+ |' C: ~* p- i: a8 V8 f) W2 l; T            int m, n;
4 M# X1 ^$ {" q  z! D7 ^            Console.WriteLine("请输入数组长度");
$ U( f+ \$ d& ?5 W4 L: D5 u& k            m = int.Parse(Console.ReadLine());//m为数组的大小5 L  Y$ G' e2 _7 Y6 m
            Console.WriteLine("请输入要截取数字的大小");
- q2 b+ I) G; m3 S& p& f, p7 X            n = int.Parse(Console.ReadLine());& q4 ?( n3 \9 G1 S
            int [] numw=new int
5 p0 w/ F! t% ^- |. x+ V$ V
0 h+ V  S2 ~7 P( Z0 O&shy;&shy;&shy;;7 C+ n. l0 O# o. t; K' ]
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数1 g. M: z2 Q( Z& e. m
            {
% X9 r8 r7 N$ D$ V5 M9 P& o. Q% W& w                numw[j - 1] = j;8 Q3 ^# ~/ ]) k& i
            }
* E1 C; L' f  V            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
9 e2 C$ j- u6 N- l- s* x            while (d != m - 1)) S! w- T3 g3 A. U
            {2 x" i0 }; i2 ~: h: u- C4 N, a
                if (i == m && d != m - 1)
& R0 B8 d2 U( Q6 I7 i, l2 K                {
1 ~) a3 t: u/ m( y( m                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
7 Y3 e/ t! Y/ w8 l4 t, f* S                    continue;) _6 D! t8 Q  y% d3 G2 T
                }
2 d* }; v: U* i% M8 a                else
* f/ k" T- x+ q- n: P                {
; H4 k! d- l' D" A. ?( K# v5 N                    if (numw[i] != 0)* r3 W5 ~! @9 |
                    {
+ `3 ?( J0 [7 j. j+ p' q, T0 L' U                        i++;2 t( r/ t2 n) f3 j8 W: I
                        k++;+ E4 i/ ^! J% a9 i+ `" n
                        if (k == n), s5 I7 z& y& T# {3 T
                        {
3 M2 s( }8 [3 l. K4 S                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
: v5 ]: x1 D8 b3 b: L                            k = 0;7 l. K, S8 q, ^  W) t8 U9 K
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小12 H+ C9 ]) {1 j, d
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
5 S6 |2 k" Z7 K3 g( z- t                        }. H% o+ k6 V. s4 m# v* [% n" Q, h
                        else//输出暂时还没有改变数组元素的值
5 i$ _! C2 Q$ h* J1 E                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
7 B8 ^5 X( Y  R5 {                    }
7 \5 W9 H/ v" y1 h. a                    else
) }9 T2 ?6 H+ S( N% T                        i++;//数组元素为0,直接跳过,不计数。。。
6 J# ^- `; I3 [1 a8 _3 I                }
- l4 w9 t. L" N  O / F; m+ {) u* q5 I$ p
$ e1 c& ^. `  O2 N3 B  M
            }//结束while循环. }# R" d2 A3 @
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦! Z* v0 w' x* M  z0 B0 d
           0 G1 [. j/ I3 j6 O
                if (numw[i] != 0)
: L# V0 v. r) H0 {2 h1 p                    Console.WriteLine(numw[i]);
, M$ }4 o$ {' }3 M           6 a* l% d8 T' ]4 n
            Console.ReadLine();
4 J1 r' w1 T$ b/ ]9 H: b        }; P6 g4 O6 q1 e, k- t" ?3 S
    }. M6 T8 x! i, |
}
! r( U. N; l3 [/ ]
小甲鱼最新课程 -> 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-4 08:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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