鱼C论坛

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

猴子问题

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

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

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

x
大家好!
$ L) u# h/ A; x  n0 \% y这几天我在忙着编一个问题,我用了一种方法编出来!
" m/ ?$ E# ~+ Z/ G但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!) ^2 i. ^! v/ d. L
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
" P7 `, [( E1 \& I
. d' B5 r- w7 ?$ d+ ?- G: T
. |, U- \: R) }' x
                            题目
. e; x5 S7 I  ]1 X" ~) X" s, o山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
. D( I% E1 |$ R0 Y* L第一种方法:利用循环链表
. r. s$ b( h: ~# E! k' ~- }, B#include<stdio.h>
/ z! n/ D/ E& d5 X& x5 u3 g" a#include<malloc.h>
& D" `( R  G2 Y, u" M: ~8 c#define M 8            //共有8只猴子
3 \7 W6 |; a  B0 X8 L#define N 3            //数到3只时退出第三只. y( K# B# k% d1 V
typedef struct monkey/ O3 _1 c$ }7 x" X: z8 R+ {
{int number;
9 n# r. c5 d+ V! ~* {1 B0 |int flag;  d; A5 v( O0 c
struct monkey* next;2 u' K0 T. D# l/ H/ F4 a
}MONKEY;
5 Y# L4 x& b) }: k: a9 |. J  N. |+ emain()
; ~4 b1 v2 w1 N( V; g8 P1 p" j{ MONKEY *head=NULL,*p,*s;
& K2 U  k! E- _$ D4 B0 {( d& }  int i,sum=0,count=0;% g3 g5 r9 T- G! U& V
  clrscr();              //清屏9 J1 y6 A. e, e3 h2 j& E( Q6 D# p
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
. u/ ?& H, n, K) h& s1 `: ^0 j  p->number=1;p->flag=1;, [3 t  o: K5 w7 F3 b( D& B4 O% I' b
  p->next=head;
6 w* c4 Z& g/ d. V, }) Q  head=p;
) t4 N5 p8 ], z* h+ @, r9 X7 W  for(i=2;i<=M;i++)
9 R- B1 F% q$ [7 c    { s=(MONKEY *)malloc(sizeof(MONKEY));# Z+ S6 {- _  X. p* m/ d0 T
     s->number=i;s->flag=1;
1 F5 ]$ g  g1 A& u: k* w# T     s->next=head;8 O# }9 M- U& C0 e% C) b
     p->next=s;p=p->next;
# \2 j% d! }; ?! W; d    }
0 ^( w) l; V3 Z) p# Y: V" f0 H0 K    p=head;
4 i3 H% T0 E* q1 o% }   for(;;)
9 F6 ?7 a  D! _; q+ Q  X- w) l    {if(p->flag==1)  ?/ V9 S: _! {" [" k5 Q: \
       count++;
5 ?9 i+ [1 I) \     if(count==N); E% y9 Q  w# _8 g
        {p->flag=0;
/ v  E+ j. P, {/ b! i# K; ^         count=0;
3 R& }7 X* ?0 V# `( {         sum++;}
) r9 s! q, r( M4 C2 O' `     if(sum==M-1)4 @5 k. Z: a; f& L
        break;! K9 H: i2 O1 Q& C& l8 t
     p=p->next;
5 D6 U' i" ^& @" c% s    }
' i; K5 [, [3 G0 ]- n6 c. I    p=$ P" z0 h5 A' c7 p
    head;! ^$ `5 T& G6 T" K3 O; q
    for(i=1;i<=M;i++)
& [3 l: t7 c3 c5 Z    { if(p->flag==1)4 X& L2 Z/ C& F' ~
        printf("\t%d",p->number);  j8 @$ h1 q' q2 L0 N+ \
      p=p->next;
7 `: h! p' l9 h  k  M    }. }+ k2 r7 |1 T6 y0 Z' h
. z+ Z2 e: H- z6 q
/ V  _: ~6 J* N5 x' m/ T

. S) F. d4 ~. X0 |}

' @4 T" n& Z( e2 t( G第二种方法:数组
; N8 y1 h6 d& T+ |1 g3 q, m7 c7 \#include<stdio.h>5 `- v: s5 q2 ~2 z6 k' ^
#define M 8
: W+ y! z9 S7 m3 A' pstruct monkey
$ v) A6 d: r" e8 O. w{int number;
1 G- A9 q7 s& k! s5 L$ p  Sint nextp;1 N8 m5 ?. L) Z- F8 g9 X! i* F
}link[M+1];: N( J1 f( {+ D# F% r* O
' I2 F9 H9 Z& o; t* B
void main()
. G# x* }5 a* V: _: D+ D{int i,count,h;$ B7 Y5 J  [9 w# t. {5 t6 k
for(i=1;i<=M;i++)) _# _: }7 Z3 l; ]5 n# _' I0 O
{  if(i==M)4 k1 G( @, Y" L1 @4 A
   link[i].nextp=1;
: `$ O; \& o+ w" p+ n& m. p% ^3 p   else
6 }/ _! G/ t) ^6 J, Q   link[i].nextp=i+1;  ^4 T' r8 o- U
  link[i].number=i;$ z! [; u( ^7 ~, }7 r5 L
}% P5 B* ~3 C, H
printf("\n");3 b4 O& t1 b& G$ J2 k+ A1 O. o) N2 h
count=0;0 i7 R2 D8 b- `7 n& L1 N. Y
h=M;
. ~/ Z0 }- H! X+ w2 }printf("依次退出的猴子: \n");
, |* U$ n, T4 R4 W+ W" m/ jwhile(count<M-1)* r& X% B( ~% ?5 {
{i=0;
( B( y- C; L( F# v. `# V1 {6 vwhile(i!=3)$ m  k# i% w+ D/ v
{ h=link[h].nextp;7 h' C* R6 K. o* u
   if(link[h].number)& C) T, h$ X8 O( E8 a8 _: }9 {
     i++;}& I* M" P( y  x: a5 j% \" A1 _

2 w! V. P+ E8 rprintf("%4d",link[h].number);
/ ], S6 l8 a/ K9 X% glink[h].number=0;
. }: ^) K5 V4 l4 d( P/ g2 fcount++;8 c* B* M% ~! b) d7 D# {) @3 H4 l$ m
}4 M" K( M$ o$ _6 A! p
( ?! E. S: `- F8 ]6 T9 \: Y- C1 R
printf("\n大王是:");, X, h) k, s: O: d1 v5 S) i
  for(i=1;i<=M;i++)
2 P5 D; u7 C1 A# W, f  if(link[i].number)
4 ~0 p# M1 v% X5 K& p' \    printf("%3d\n",link[i].number);
* Z8 z5 X: {" l$ F, M% T. C: O( Y: N
9 I% L6 C' S4 K3 ]' k) R
}
* F% C- _3 v) Q
第三种是普通方法for循环
  m: v- V6 i9 E- e) I7 s% M+ l
#include<stdio.h>
& @+ o" L! s# u. G' E* G8 w3 ?void main()
5 t6 A7 i5 y# d% q0 p{ int i,k,m,n,num[50],q,*p;
# j1 ^% X/ o$ j1 C- m) Q6 [    clrscr();9 n: ~' ]: t: G, W( v8 Z
   printf("input number of person: n=");
, Q+ f3 y) M' C: E# r  \    scanf("%d",&n);$ ?1 [( d( k4 S) @' i4 f
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
' G) v) t& }/ ]9 ]    scanf("%d",&q);- _+ z1 L& S" f4 ?. W- `  J9 n
   p=num;  ?# c0 M- M" \  m- [
  for(i=0;i<n;i++)3 Q6 Y1 U$ s) D7 p  f; Y
    *(p+i)=i+1;
. W- U7 i* U4 {4 g6 J, f   i=0;
) @: N+ `8 z* m3 c5 I7 {   k=0;
2 d2 u* D/ a( t   m=0;( Y* w# K  U& x0 p; i" e2 i
  while(m<n-1)
$ ], |& R8 }0 N8 F4 T   {if(*(p+i)!=0) k++;0 r9 y" J3 b7 S/ L  `6 ~
     if(k==q)
# C  ~' s: G: B      { *(p+i)=0;
7 ]  C% r: U) ~2 _+ e        k=0;
$ v7 {) t/ V* _- y9 [        m++;# z) M1 f7 D  U8 T7 y
      }
5 S" o3 L, b$ {: l+ w) g  W* N# ~    i++;
  l# A6 _$ u: x& q3 C    if(i==n)i=0;) m& |! w6 b* d- y) z4 W# K
   }; o& M6 H; \2 d! M) z8 {
  while(*p==0)p++;
9 F9 p/ d( w3 P0 f, u3 u* H    printf("The last one is NO:%d\n",*p);
- Z9 P3 B9 b, v9 u* Y; E     getch();
% \( O2 s/ R( q# _. ]# a; b  Z$ I1 R0 ^! F
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;3 v. I" h$ _# w& V
namespace 又费马达又费电) e+ A! E# o5 }* d
{
+ u# A& k7 ?6 w) V0 M# g, g    class Program8 u2 K  k/ ~$ _8 t* X
    {* L  I. n6 l- m
        static void Main(string[] args)
* G9 H$ H3 I9 O& B- i' M& R  Q* A        {
) t1 D" k* C; R            int m, n;
5 O% B' u# }5 b$ j* }1 e! C            Console.WriteLine("请输入数组长度");
: m) k: v! {' U            m = int.Parse(Console.ReadLine());//m为数组的大小
1 G  T: x9 T2 q" V2 Z            Console.WriteLine("请输入要截取数字的大小");
) C" B" V2 T1 z: M2 w5 F& p            n = int.Parse(Console.ReadLine());9 t, Q* d" s- J* S/ D
            int [] numw=new int1 I1 K( v, U' O1 j* U+ c

) W. V/ Y2 t1 k/ {&shy;&shy;&shy;;, J! c7 P& b, @# u+ h" `
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数  w, h7 I6 H* ~5 Y3 t( ~+ x4 ~
            {( \. `! O+ p" p0 }! Z& b: h
                numw[j - 1] = j;8 m7 J* Q7 y! A/ _- c
            }9 F: m* @8 s- O% S
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
& s8 z7 _1 Q- R4 }* s' L6 ^            while (d != m - 1)
( Q- o6 o) @8 a  c0 ^6 L; d/ T7 {            {
8 T. o$ s% b6 ^4 f                if (i == m && d != m - 1)9 L2 K% J# B( p7 \
                {
' J" B; x, W$ D/ X7 B% `                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
% A, C2 N8 d! e( D                    continue;
: A) N& x& \$ |" D                }
) ~6 ^, p' j, K+ N! a2 S! \- r                else2 W% ]1 H8 }" F, J
                {
% ~  j/ V# z) c! J- j1 w$ r                    if (numw[i] != 0)
3 r( d9 s: X$ E7 ~0 U                    {
. u0 c6 f% c/ s; @. J                        i++;
) C3 M/ ~: E  d' U- S                        k++;, J$ Q0 Y! g$ K& C9 {1 j3 U! d
                        if (k == n)" F9 X2 \' L; W% \# s& O
                        {
' d( W9 j, a0 ^; t- [                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
; \& s2 k% e2 y# o- [* \7 x                            k = 0;, R2 k0 C$ ^6 p. R
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
* V$ d; x7 R0 q, l                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);+ {0 X0 ]! q) w
                        }
( O! h* r; B. @8 h9 {, l                        else//输出暂时还没有改变数组元素的值# k( e0 o0 Y4 s' G" a0 k# \
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
0 c$ a! h3 C1 M  a0 a! j                    }
5 T1 j& C' }  Z5 `                    else
3 s) ^9 n* ?! m) w: p4 r                        i++;//数组元素为0,直接跳过,不计数。。。+ |1 U4 p1 y0 s% L, H
                }6 b" p6 X4 Y5 Z
* a- ~3 G# O) B6 z  a
! W' |1 @! |, y
            }//结束while循环! U/ a. N: {3 m, ?  f
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
* I- U/ u/ B0 h$ C9 W  y5 U           
$ w1 k. |6 G* h                if (numw[i] != 0)
; K( N9 K9 v4 i& i6 p                    Console.WriteLine(numw[i]);+ D  W2 Q& P" p. ?
           
) ~$ P/ H6 ?! |: n8 m/ r% r            Console.ReadLine();7 p5 N" Q" ~& p1 p$ o
        }+ h' ]5 C. S. j" t- W  C! l
    }
% r! z; \2 S. x, W; s' _& N}: x' p& z# o2 G* d4 d. m
小甲鱼最新课程 -> 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-7-2 15:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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