鱼C论坛

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

猴子问题

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

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

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

x
大家好!) |8 h9 n+ X  Q. M/ L$ ^% m
这几天我在忙着编一个问题,我用了一种方法编出来!
. Y/ n( v: L5 p8 }3 k/ a但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!8 D& k) K  C& V
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 & H$ c% k' K! _2 ~+ L

( W5 I( B, O6 G, i* o! l3 L/ F2 P2 ~( u; u
                            题目4 p& q: J5 f, I' C% k
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。% _& H: ?  P) M+ F
第一种方法:利用循环链表
5 r8 K! k& p# u3 O7 {1 Y/ g#include<stdio.h>
( L( J! L( [4 W+ j8 q' `#include<malloc.h>0 Z' }, X; L' n
#define M 8            //共有8只猴子/ M, x* [5 x3 \+ |0 }' o: Y
#define N 3            //数到3只时退出第三只
4 u6 O# T. S$ c" o  Q; Itypedef struct monkey( k1 j( W. D, c( y
{int number;
5 U; C: @6 H5 T+ P% h5 W  `+ `* Dint flag;5 ^( n' f: B2 n2 p+ [/ ~, Y
struct monkey* next;6 @4 \% }4 c: l; \) @2 q
}MONKEY;
3 h1 W9 X* C# j/ Wmain()9 ?, O& P" X* E! f2 A
{ MONKEY *head=NULL,*p,*s;5 f6 ]& b  I: m) N0 }$ L
  int i,sum=0,count=0;: `5 f  C+ v8 V2 z* A/ e7 E5 \7 S
  clrscr();              //清屏
; _% H5 F# E/ }* e  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存5 D' i- [0 l  o+ d% z$ O7 [
  p->number=1;p->flag=1;
2 x, S7 c! m9 O$ L& s: B. `& i  p->next=head;: g/ A* [* `: c9 |, U
  head=p;
7 h0 S" V/ E# v0 L+ ~: V! H. g8 _  for(i=2;i<=M;i++)
( l5 x6 v5 K8 N$ d% i9 |    { s=(MONKEY *)malloc(sizeof(MONKEY));" J( I! u0 C) V2 p; K+ Q
     s->number=i;s->flag=1;& F/ P! G$ r# Y. U  y# w+ v  t# R
     s->next=head;' q% v* E! |9 ]" d# y
     p->next=s;p=p->next;) I; D  {  L# Y( V1 @* R
    }! J# p9 I( [' p
    p=head;: L* [) w# S* H+ P4 x# C
   for(;;)8 s& i2 W) q; H1 x" w# s
    {if(p->flag==1)
# ~* R2 |( ^# ]       count++;
$ O' E) S6 S: l% }6 V" G     if(count==N)
* ?* U0 U/ |# p6 Y        {p->flag=0;6 I- @7 R6 q# M. Y* f
         count=0;' u7 [3 g, C/ ]3 d$ k; R4 O
         sum++;}
& O% @6 [  @) m6 ~  t, y7 M     if(sum==M-1)+ Y5 @% b  V4 L5 p& O, B
        break;
" B/ b+ t5 ?0 {! d4 n1 \1 x; F     p=p->next;. S. l5 v6 h- d9 x
    }3 j  H' j. ~# C- V- [' m3 p+ O2 u
    p=
6 x1 U  P$ K6 |- @+ e1 }    head;2 B9 m8 u# P# j$ g+ k9 S
    for(i=1;i<=M;i++)7 t' q& T( \0 O! n9 W! h) G
    { if(p->flag==1)7 T% W4 t. f% B. O7 Y! w) ~% C
        printf("\t%d",p->number);8 k  ?% m- ]4 C, {: N2 N; n
      p=p->next;
" H% ~# h8 e; k' j' k, m# b    }
8 n. h4 G  ]( h: @) V
+ i% V3 j  s. H; H2 F4 a# Q0 I* F' x" D! |: I' o
: U8 k0 Y* ?$ P5 T" h' Z# P9 l
}
7 p, A2 l& P# T) W7 H
第二种方法:数组; q. D6 V/ y  |4 A- E7 C
#include<stdio.h>' B) t  C! ]& L
#define M 8
/ ]/ j5 ^" s! \struct monkey
7 K. A3 h3 C+ ]* @{int number;
0 L$ Q, q0 l$ dint nextp;
) g) D, S* E- x7 {( e% l/ x}link[M+1];8 _' X/ R2 w  J; B& M5 R

0 O4 \( k/ r: b8 v( j$ |void main()1 M/ K( B- V$ u: v1 x: M( A1 ^
{int i,count,h;3 Q( `2 C1 x% D% l$ e4 D* d( @2 w
for(i=1;i<=M;i++)
8 z6 O+ k; g4 }2 H, F{  if(i==M)
. E2 z0 [5 [. o7 {   link[i].nextp=1;
6 `+ Q$ k: u, \. D, `5 n8 n) v   else: ^+ G2 c! e( c1 i3 x9 T, w; j
   link[i].nextp=i+1;
2 Z7 \3 B# F- `" l9 _  link[i].number=i;' O, T# k+ a, {
}
; ?: N  R" I8 @/ |+ G5 qprintf("\n");/ _7 D3 O/ m$ A
count=0;
$ @7 \0 A& K/ d6 u1 qh=M;
0 k7 z9 b& ?" y* N% e6 bprintf("依次退出的猴子: \n");, b4 M; x* [% q
while(count<M-1)
+ g" \$ T* X. o0 k% H  A- V{i=0;0 `0 s' d5 D. r, P
while(i!=3)3 I) i3 Y5 d, ^5 i5 V( h+ i; S! T" Q
{ h=link[h].nextp;/ o; j% r& b8 p, W8 t3 t6 H
   if(link[h].number)4 }+ J' I4 Z6 X2 C! c& p
     i++;}0 u" P& I4 b+ s+ ^1 ~" ]! @  h

- T0 W0 T0 x& v4 P- Aprintf("%4d",link[h].number);5 z* J7 M  X* `) j4 D9 }
link[h].number=0;" s2 _* o1 {$ w  C* j2 S' P
count++;
% ^' B% w3 l4 w3 W* ]; `/ b7 }. j}# d) c. T8 ?  C% {4 r+ \& S1 Q- R, n

4 P. H# D. ?; }+ ~: Z1 [+ |printf("\n大王是:");+ J5 }9 ]( B5 v
  for(i=1;i<=M;i++)) ~) c/ Q' v  I4 J* {3 a
  if(link[i].number)1 E7 g3 ^7 n  O! r! r( g
    printf("%3d\n",link[i].number);. j0 B  w9 G/ s* O1 P

" w* I9 Z  H: O9 R7 k$ y9 P' v
# X" Y/ r% S9 W}

* ~* v  m) K/ Z4 p: X- C第三种是普通方法for循环

( b7 J% L+ [# J3 z2 S" [! }#include<stdio.h>/ u9 R+ F5 m: U9 P! B0 ?! Q; Y
void main()
9 k5 K2 J( X/ x% Z1 m4 ?{ int i,k,m,n,num[50],q,*p;
' {5 v7 {2 O/ S: k, C! z, s    clrscr();
/ M0 C. |& C7 A2 |  y  k# o& p2 @   printf("input number of person: n=");
) l) r8 Q+ x5 [5 K0 Z4 N    scanf("%d",&n);1 d$ K6 [& m7 n
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只% d( D  C; j0 m  b* H+ Z4 w
    scanf("%d",&q);
9 I( U" e9 O# s% {   p=num;4 L1 ~3 k$ u9 \- H7 Y0 w
  for(i=0;i<n;i++)$ O; e$ |# v  B$ \# o
    *(p+i)=i+1;- z5 Y: n" d0 s: G2 e8 V/ w. K
   i=0;
" S7 S; T( u5 c   k=0;' ]5 [! P+ H8 E) O/ V
   m=0;1 }# q9 G3 o: G/ Q3 M
  while(m<n-1); \& a/ @0 @; r0 f$ f* z9 u
   {if(*(p+i)!=0) k++;
$ B* M" F  [" x  i     if(k==q)
5 Z( L/ L! x. M, D      { *(p+i)=0;4 X- v* X- Q8 `% m. E5 \+ b/ q% X
        k=0;( x& k1 t4 e( ?2 Q
        m++;
8 H/ x  [8 O4 R) f      }: j& I, s1 [" `- M
    i++;
! d/ F# V# `# G4 T0 E; G( D    if(i==n)i=0;
) ?. _. r5 }; b# F   }$ ?# A5 e" q1 F. C" W
  while(*p==0)p++;% Z7 g4 i) x4 R# K% D3 p5 |9 N
    printf("The last one is NO:%d\n",*p);
  {' r  q4 H* {; F- z* [     getch();  c  K7 E8 l) c  j" F  b5 P1 k

5 t! Q8 c0 y1 p9 b}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;+ G  O& J: c5 f( M! J
namespace 又费马达又费电8 r8 n9 U! a+ T  G
{1 l% K+ X7 @  z: O2 ~4 }" m
    class Program' [1 e# v" _$ E$ i: j' l5 x
    {, ^8 Y8 v4 Q0 G& C3 S: e2 P1 @& L- {8 K/ j
        static void Main(string[] args)4 x" Q  f6 u' R; p# Q( y! C: l
        {
# i, U5 N4 c: f' A) n6 x, D5 _& n            int m, n;
2 Q) L# `9 B& H$ g  G' h% W$ F            Console.WriteLine("请输入数组长度");- h) ?+ }; e: M, Z' u; |
            m = int.Parse(Console.ReadLine());//m为数组的大小; B2 I/ q! Z8 N
            Console.WriteLine("请输入要截取数字的大小");' u1 j1 Z7 y+ g- _
            n = int.Parse(Console.ReadLine());0 X' d* R* l- [( H& J
            int [] numw=new int$ H& d1 q6 F; L& n) W7 A

$ u( y) A) `2 T3 k&shy;&shy;&shy;;, i- b# G1 l# e7 d; Z8 f% u
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数# J  \. m+ e2 n5 ]
            {' H# h! i$ s( [1 R# q
                numw[j - 1] = j;
$ q" C" f7 [6 I: s            }1 a* w1 H- @! Q+ K1 C
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!8 p5 F8 m" `: k% p
            while (d != m - 1); q/ K, M! j% \
            {% L/ g4 P& d  ?# ~2 x) D3 M" j
                if (i == m && d != m - 1); N5 T1 J1 j+ }. w7 j
                {
3 U0 k9 Z- T$ S+ I                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
( @. l3 q  |$ Z* X                    continue;4 o. x. z; m9 g0 ~8 S
                }4 g- C: T0 x+ B$ f  B) l5 m
                else
+ [" [+ Q! e$ p- s3 D: Y2 g                {( S+ S2 X- t  a) ~4 l6 {4 f  M& Z
                    if (numw[i] != 0)* E! K# e& a& A  o- o, t
                    {
! k7 i) S5 _9 s/ }                        i++;4 Q% ?3 U; j6 j: h: j. ?1 c
                        k++;
: X& E& T/ h- u9 m                        if (k == n)8 d& B" S  v- e. f  [
                        {
# O/ }' U. s# _* l6 T! K/ l" X5 }# z                            numw[i - 1] = 0;//把在n位置数组元素的值改变了: U& t/ h) ?* m, Q) h2 Q, |2 D
                            k = 0;
4 `/ h4 d$ \# t              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
' @" O" d8 @; c( O5 S                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
$ H' }0 H) D# `! h                        }  K0 o, V6 ~0 a, j* `$ N  c( H
                        else//输出暂时还没有改变数组元素的值
5 l7 i' q3 V+ o8 a' v/ h9 R; a                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
8 D/ J% W, \8 ^5 X                    }+ a* X8 {0 d! G2 y! S( ~. [
                    else8 U9 l0 X% W" |7 a  u
                        i++;//数组元素为0,直接跳过,不计数。。。
6 j' [$ F% y: a) p! U& T                }: X0 c6 K1 Q+ [+ A0 a( r, ^+ b; m

* y* N- U0 _0 W
, |* o4 U: q9 H3 M            }//结束while循环4 i( I9 Q  [% C0 D
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
; A2 y4 z1 l8 u8 d/ _           
% D( `) @+ N9 U6 x8 q9 g                if (numw[i] != 0)" F, m! c* d9 m
                    Console.WriteLine(numw[i]);
1 G; j6 \" f9 z& l           
' X( S! E% m! }9 u9 l5 U0 ?  s$ f            Console.ReadLine();  `, {& \. u3 c! o9 h6 N5 |, z+ U6 K
        }
" G7 n. o9 p8 i: ?8 S* e    }
/ P7 b$ T! v) n5 r/ p}# C0 ?) y# ^( \0 ~
小甲鱼最新课程 -> 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-6-29 20:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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