鱼C论坛

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

猴子问题

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

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

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

x
大家好!# B/ `! r. S* ?7 P+ C. n8 ~5 g
这几天我在忙着编一个问题,我用了一种方法编出来!
" f8 i1 B- ]  s! Z$ |" i1 e- x5 o但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!1 C" M8 `( D$ A0 D
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
+ C9 H" @+ t( }  O  C' M5 T0 w4 R
4 k; S/ k1 m& x4 G; `
/ I1 r. _2 t( u; O
                            题目
5 K) y  V8 a: M$ O山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
* q: W! \$ g" N3 S6 k第一种方法:利用循环链表
/ b4 H3 F0 r7 g, c#include<stdio.h>
& a( V7 Y/ w! m$ B" i#include<malloc.h>
: J! T# B4 w, Z8 a5 C; [& N#define M 8            //共有8只猴子" M  Q+ ]6 H4 K# b( j7 b
#define N 3            //数到3只时退出第三只
6 A' E4 q' ?9 f: }, btypedef struct monkey
9 U9 z( r( z0 ~0 X1 |+ c{int number;- E2 ^! C$ T# V8 `% I: O4 C
int flag;
) L4 V, b% a) s! C! \% Xstruct monkey* next;6 o: L4 l& j3 ]1 v5 I: G" I
}MONKEY;
) g% m9 V9 s- ]# Umain()1 W6 u/ u. J( ?" O+ l/ j
{ MONKEY *head=NULL,*p,*s;
( `' _; L2 B2 \$ N9 w) I  @4 W& g( k  int i,sum=0,count=0;6 C: a" f3 f: J: K/ h- {2 I
  clrscr();              //清屏& D, B0 g7 {$ u& z+ ~4 ~
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
) R; C' d) V# |' ^3 T- x  p->number=1;p->flag=1;) g) }/ N6 @/ }/ x* @
  p->next=head;# ^& p, M: L9 ~) w# C$ F
  head=p;
1 ^5 V. |" S6 Y  for(i=2;i<=M;i++)
5 q: F# n7 c4 R! A7 w8 C7 z# _1 O    { s=(MONKEY *)malloc(sizeof(MONKEY));9 O& o" {) E. z
     s->number=i;s->flag=1;
3 `  K1 B. `1 U) y, q: z     s->next=head;
: W( |' }2 l0 e8 N) ?# S. n     p->next=s;p=p->next;
7 q- _% `5 l5 J+ l    }
/ ]. Z2 H3 Y3 m' C0 E0 C; m    p=head;
4 u- b( f, G& @: |  o   for(;;)9 q& h! g& V4 ^9 f& g3 n# |% X
    {if(p->flag==1)
( j& P2 O5 N/ N3 d; y7 J6 C" k% m       count++;( g) j! G, l7 A; c  Q
     if(count==N)
( q  f- p7 R. Q1 d- \3 ^        {p->flag=0;% G5 {8 I. N5 b( F9 d* t3 X
         count=0;
% @: G/ P& O; {2 O7 C         sum++;}
6 e& W* e* \6 w. q     if(sum==M-1)
5 C4 U( a* n' w" C3 g# D6 ]        break;
% V2 ^1 ]; s7 j/ d     p=p->next;- y$ l" D' P' R5 E
    }
( B) b9 V, L- ~! W, H6 Z* Q* g% j    p=
" G) q# O4 }  x1 O) ?    head;
  ^- v7 ?6 g: r- V8 u. o! R    for(i=1;i<=M;i++); T2 r" e/ a* V" l0 F) J
    { if(p->flag==1)
7 Y. @  ^( @" C" H        printf("\t%d",p->number);
$ [# q* ^1 Z8 B) X. F/ z3 Y9 p      p=p->next;
% a8 p' D  Z8 ^% y( w    }3 ^% `) ]6 V" ~' w
( {3 o( N0 h8 ~0 ?
+ f2 }2 H  O/ C8 b8 {2 N$ p

& J- T: F* L7 w  A* _}

. c9 I  Q# x( L$ Y" u第二种方法:数组: U% }: P: y$ B3 t+ g+ r! H
#include<stdio.h>0 p# l4 y" U' U* x% f
#define M 8
& h2 }( c4 b) A, l+ v6 g& N% Mstruct monkey
9 e7 N1 O2 U( X1 w' @2 c; T{int number;! }' j9 _3 e7 |+ U
int nextp;
+ R) a; ?- |6 I+ m8 A% z! b# j}link[M+1];* [' H+ E. B5 W

* l) G9 E! W0 t/ ^+ i7 `  M# v: l+ evoid main()
6 U9 n6 i4 D* a, \, |$ ]# X( C{int i,count,h;0 `. T* f4 A# m; v' l
for(i=1;i<=M;i++)8 m" t: m' p' |8 d, q' }
{  if(i==M)
' t6 n" S7 e: a+ x) ?8 _! _# ]   link[i].nextp=1;8 C3 h( P8 @. h" H1 _, N. ?3 P* r
   else; t3 a% S3 d- z% `' U2 i
   link[i].nextp=i+1;3 B* D6 k' ~) y$ W' P4 Q
  link[i].number=i;
+ g( J% k* v0 f}
+ O& q, [4 p7 a% u5 eprintf("\n");
: y. \3 u, \. Y3 s( rcount=0;2 @6 O8 p* e4 i* T' O) Z1 r$ a  [7 s" b
h=M;: c$ n: K, d8 [& E( P
printf("依次退出的猴子: \n");
2 G  b/ ]. I! z0 Z, s. ?while(count<M-1)
3 V3 B8 C9 P( q. i/ a+ r+ `8 }2 ?{i=0;
& R# r. X/ `& V# e& p& ewhile(i!=3)
; e# `. m: Z1 x6 |" D+ j) x1 u{ h=link[h].nextp;
6 S# B  g1 O5 @. L3 X% w   if(link[h].number)) E1 ?% j9 n( o
     i++;}
$ m. y% B+ K/ c+ S" g
; ~" V: X" j/ J* l$ y9 I2 eprintf("%4d",link[h].number);9 D7 A* R: M$ J* ^7 n0 n
link[h].number=0;* r: J, H1 s) A; ]( T) g( @% W; I
count++;% ^9 f6 ?' j; F- V' l
}
5 U1 q/ m/ v3 Q0 N& s* g! F* E3 |3 |: k  R- s8 }9 b0 k
printf("\n大王是:");
, |, F8 ?! m- V- l  for(i=1;i<=M;i++)
: D* U- }* A) O! w2 m" l# i  if(link[i].number)! ]0 x. W4 p1 v! X+ `
    printf("%3d\n",link[i].number);
, s  d6 s6 y! M) a( `% S+ H  A  u4 m; C6 b0 ^1 K
' [/ B- c9 \: N+ Q5 Q; Y/ X
}
. v  T) |& h2 G1 H9 w, L( W
第三种是普通方法for循环

* f6 O/ ~7 [7 h#include<stdio.h>  M( u- X; y6 K0 L
void main()
4 ^/ G2 X2 M) |! L3 ?{ int i,k,m,n,num[50],q,*p;
) _- ^3 O3 n% H" `- G+ T8 r    clrscr();
2 K2 I. j$ l% b6 C  E+ E   printf("input number of person: n=");2 C: g# t8 Y2 w3 A
    scanf("%d",&n);2 ?) ~2 O7 ?* _  s" c4 s2 v  |
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
2 k: r8 ]. d& H    scanf("%d",&q);% a+ a9 k" k; K
   p=num;2 i. j) x2 d+ C$ M+ e5 |
  for(i=0;i<n;i++)
3 Q& j6 z3 f0 `) L* z' D    *(p+i)=i+1;
+ n8 o9 s9 A- W2 P   i=0;3 W% N, ]; i9 i
   k=0;
& I1 L* t- \  F% T; _! B" B   m=0;
5 K2 b- L+ D6 I, `  while(m<n-1)
* W* E7 u& g- c6 A   {if(*(p+i)!=0) k++;
9 `8 `. n5 {$ p/ t5 r, p7 j( \( p     if(k==q)0 C$ V# _! v7 Y' D/ F+ k
      { *(p+i)=0;9 h* p- d' N( K3 T% g0 j8 r7 A0 u
        k=0;: u9 K% y9 {( O) X1 `$ j/ y
        m++;: C9 C) C0 e9 K, u! p- f! _' \
      }! o" z3 X& V/ q/ n( W- j
    i++;
1 w2 W2 F+ r: E4 H2 C3 B    if(i==n)i=0;
, o7 w1 x8 O6 o7 X9 E7 Z   }
/ {; \- m3 x5 ~# V/ k4 s9 G9 U  while(*p==0)p++;
, K$ k7 g5 @9 m% a5 ?( X    printf("The last one is NO:%d\n",*p);8 g+ X5 N6 F, u5 p
     getch();
  V+ j& {/ U( q- F$ E+ Q- Z. j6 ]% R) B# m+ T+ U- ]/ p, C* E
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
2 D1 l5 J8 F* y4 ?4 Anamespace 又费马达又费电
$ |4 I5 |& M. ~( E5 D# w* X{
: o; |9 I8 a0 m1 M    class Program
  ^' M3 C0 o; S  R; V    {
8 q  d5 U- y' B6 e0 ?        static void Main(string[] args)
7 j- u3 i8 s) B! J" [  q) b        {
$ u4 l7 y0 p9 }6 I4 J# _            int m, n;  ~7 R9 M& D) T' u: m8 l$ G
            Console.WriteLine("请输入数组长度");6 M; ~1 f2 U. w- `1 ]! k
            m = int.Parse(Console.ReadLine());//m为数组的大小
1 w5 a  @# V- Z  {" v9 J& [! R8 k            Console.WriteLine("请输入要截取数字的大小");
/ A) q: `1 T8 H            n = int.Parse(Console.ReadLine());
: e9 Z7 Z5 {1 d            int [] numw=new int0 Q2 v$ j( Y3 C: T; S

3 `6 H( _+ }+ _&shy;&shy;&shy;;. |0 f' |6 v6 O8 T# i
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
) {* _; |" i: H* U            {
8 U$ x, }7 U1 |! I" s! y( j; m5 m/ X                numw[j - 1] = j;, S4 N3 A1 z5 e$ x6 A6 x
            }
" y8 {7 ~$ i! i3 ~            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
, |+ k6 A* z/ t, x            while (d != m - 1)9 @* d) I% F8 B9 m: S
            {
3 j$ L8 T2 B8 I- b% g                if (i == m && d != m - 1)
4 C. y6 }& E( \) d& w: H                {; {0 ^$ _! c  @; q2 y5 K( X. M
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!$ \" ~1 w" T4 H9 K$ ^
                    continue;
3 W) s0 L0 E) P; X8 ]                }
% s# z" i) n+ d                else
" _# N/ r/ u3 r/ T                {
. R& u) w; Q( w8 m                    if (numw[i] != 0)8 H8 E" e- e7 j; J: X
                    {
. j) w% [/ e$ C+ \                        i++;
* d5 o& }5 q( W1 ~4 M                        k++;% k# W: ?, O' X8 a
                        if (k == n)
) y) `7 X! r' Q' L                        {
& D. p0 N8 z8 X) x6 I/ l& r                            numw[i - 1] = 0;//把在n位置数组元素的值改变了; u1 Q/ A3 F6 g& o. n. S
                            k = 0;8 Z& t/ {( ]- E0 r2 }, z- W, \
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1) i' ?. a2 G# W& o+ \
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);) ^5 h4 V# q% o( y6 z- }$ B* ?
                        }
0 z$ @( L' ?( l* t$ R2 j                        else//输出暂时还没有改变数组元素的值! E! k) G9 `! H
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
: I4 H- i- \9 G8 j                    }
& s; d2 `9 l7 |! e( e" c: |- m/ _9 \+ i0 x                    else
+ F! P" M$ g1 j, w% ?) l                        i++;//数组元素为0,直接跳过,不计数。。。
# \" N. ^. h5 R8 a: F- Y: D: I                }
" E2 H9 H5 B5 C) Z& S# d# Y3 W
, ]3 A  B  ^& m# I! p( h: ]) U5 H( F. W  w2 t- [/ d8 u
            }//结束while循环
/ z8 x8 `3 A4 |# \            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
6 i. V* b# u3 O- ^7 Q$ j) R           
. I$ h/ ^' k- f3 Y& Z6 G                if (numw[i] != 0), @6 x- c1 v  t/ R7 w" d
                    Console.WriteLine(numw[i]);! t$ {5 G3 L7 P6 ^" O" L( s# p
           1 T8 T; l9 N$ p# V- u, T4 N
            Console.ReadLine();
8 c0 v. }& Z2 x% |        }
3 s, E& [+ ~/ u    }: r5 ^. u$ o: S7 Y, H4 F$ @
}
6 ?' R# \2 z: \" E8 v) h8 w  X# Q7 q
小甲鱼最新课程 -> 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-23 22:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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