鱼C论坛

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

猴子问题

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

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

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

x
大家好!2 U: n% F  e3 E* X: b# |
这几天我在忙着编一个问题,我用了一种方法编出来!
+ d; u0 a/ c, }6 O: j但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!' Y% N2 M8 k, ?# Y: Q
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 8 v: A7 ]1 s3 n' {5 }" s! g# U
8 `/ ?  I: b1 k1 t
" `( q! u# a+ P! X/ ~; v
                            题目  s( D' C4 \* e- P* L
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
: b" u+ _+ j; |# {' Q  d0 Q第一种方法:利用循环链表
0 ]& ]. V" w3 [6 F! h#include<stdio.h>7 J, Z$ }) z# @: d# `
#include<malloc.h>& C$ Z5 \( K- C1 o
#define M 8            //共有8只猴子
, w/ |( S( B( A; y7 b) K#define N 3            //数到3只时退出第三只
9 ?& i1 y, L7 U. ]% G6 b9 rtypedef struct monkey2 `5 X6 b4 O% {( x: j
{int number;+ ]+ K" w% w; S
int flag;
- H) T* z  e; t2 i1 [9 }4 Zstruct monkey* next;
. I* ]) A) e' X, r: ?% b5 m}MONKEY;
4 G# c9 s, Z8 Y' \. r2 v5 ?main()  B+ h" s5 d4 r2 g7 P" y
{ MONKEY *head=NULL,*p,*s;  ~$ p! u: [+ x; M
  int i,sum=0,count=0;
0 h9 ?$ a; j* ~3 W7 D  clrscr();              //清屏
) T- P2 y2 E$ z$ [2 A7 U  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
. Z/ W5 d2 N0 Q( o: H  p->number=1;p->flag=1;* X4 d4 f: E0 C
  p->next=head;
) W7 V! h* V1 h4 e  head=p;) t# N) p5 {6 K$ o) W; G9 E
  for(i=2;i<=M;i++)6 J- l& R4 J* B; v9 ]; n/ Z
    { s=(MONKEY *)malloc(sizeof(MONKEY));
5 N, h# `. c5 x' p     s->number=i;s->flag=1;) i% R" U: E! K/ k) V% Z9 L
     s->next=head;
: k8 {  k" [0 d+ r8 l     p->next=s;p=p->next;
+ y; X$ [2 A+ q+ }    }" d% Y# l. L6 S# X% @: @+ p
    p=head;( Y; C4 |7 B6 u8 F3 Q, J: A
   for(;;)6 H( |; L, a0 T7 ]5 Z% w, L$ F
    {if(p->flag==1)
, l/ o, x0 T1 Y* l0 j       count++;" _$ `8 a! B5 C9 X
     if(count==N)
3 D! E5 W% \& B: y        {p->flag=0;3 t+ ?) J7 [# U: O2 L) I- n# C
         count=0;
$ g# [# h; w8 x% H         sum++;}( w; E/ X: K8 y2 d
     if(sum==M-1)
9 P1 D! L: _: L+ v0 J2 \& k        break;' u6 O4 M8 V& Q5 z
     p=p->next;
' b. o' _+ A5 Q1 _$ W5 C    }( _- X- ]2 Y: I) M) p
    p=3 r( [& D8 f) y% H
    head;) k# G- ]. F! P9 `7 l
    for(i=1;i<=M;i++)
6 F0 o& b( ^! T- b* Z! @    { if(p->flag==1)
; Y' J3 Q$ X# q9 p. b        printf("\t%d",p->number);0 C3 J8 v; @/ j0 p4 X  P9 N$ U
      p=p->next;
' V0 n  {& W6 E3 A6 l( L; J    }3 O! y$ Q. O& R# g

  m1 `: B. T+ i% X- f: p3 F" S! ~: g3 f
9 X7 k8 Z! x, i
}

. u2 J8 U# N! Y& ]第二种方法:数组/ ], s# A, f1 q
#include<stdio.h>" ?& ?# e9 c( z4 m
#define M 8
. |7 |" w( y6 p" H6 d1 e; |+ A5 O$ g2 Hstruct monkey
7 w9 o  N" [3 A9 n{int number;% ?* N" O( {8 b9 L
int nextp;
2 K# [& m! c  l6 t# B}link[M+1];
* t! t1 O: k, e6 K  r9 p
, r- w4 @, {# c5 e/ cvoid main(). @; D& t) o9 h+ s* B( o: ]
{int i,count,h;
1 n2 l  v2 x3 B4 }$ j7 d! P' L, ~! Sfor(i=1;i<=M;i++); m  j, r9 ?% I8 Q2 N* c
{  if(i==M)
4 ]! |7 n" r" s+ W4 \5 K5 a# B   link[i].nextp=1;% o6 p. y) b& C* U. {
   else* @4 e: W0 G) s* z, J% G/ b
   link[i].nextp=i+1;. ^- Q, q- n# V3 ~
  link[i].number=i;$ q& K/ ?) A: _, b: P9 \
}" L6 c! [  W& @
printf("\n");
5 O$ E3 V* d+ ncount=0;
: X0 `9 }& A- F7 B  i5 z6 i+ ]- zh=M;
- c5 C% S3 I2 ~! Uprintf("依次退出的猴子: \n");
% }! V8 Y) F4 j8 H( Jwhile(count<M-1)" C. D1 ^' J( ^* g' M
{i=0;* W! z3 n# Z4 y3 R) g# f: R
while(i!=3)' }: ]/ ~6 U" n  d( ~, l; z  V( }! T
{ h=link[h].nextp;
- j* u. z/ Z9 n6 P   if(link[h].number)
+ H( O& O- b0 b     i++;}
& T( B) ~. i/ @# ?1 o; a" ?* z6 @5 l% @9 ^6 r! w- x. C
printf("%4d",link[h].number);/ K& U# w- @; ^# v7 R
link[h].number=0;4 M) F3 {& {" C" ?. o
count++;; a* \7 Q6 N$ O  Y! p" Q9 I
}
/ @+ ]& Y# ]& f+ T) V
- |: W& s) u- M3 e9 kprintf("\n大王是:");
5 `5 e+ q7 `/ z' F  for(i=1;i<=M;i++)
: |4 E% ~: O" w) O$ A2 }7 y  if(link[i].number)
8 X" I7 v$ s- J  u! I: e0 N    printf("%3d\n",link[i].number);
3 X+ v8 d+ M0 H1 o3 ]8 y0 k$ G: n
& }7 |2 i- v5 f' M1 B
; e' x# t  P  d6 |. w2 M  p}

1 J) z5 R- o, \8 W; u第三种是普通方法for循环
2 P1 E3 M3 l3 i0 ~
#include<stdio.h>1 ?- X5 }: g3 N! v5 t
void main()
6 f- B& I: Q: l1 F{ int i,k,m,n,num[50],q,*p;
& L# r: }' m- e* s- Z    clrscr();( a' K' c  A- ^' V! e
   printf("input number of person: n=");
. [2 N; X' b* T( ?7 E6 {, m, l" C: N    scanf("%d",&n);( H/ `, k6 l& n$ i* G% Y% }3 l$ n
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只& V- F6 f8 g* ?% I1 f- A
    scanf("%d",&q);
  M' r. ]/ \' M6 I7 ^   p=num;
( ?& A5 Y+ V) o( |3 x# U. g  for(i=0;i<n;i++)
9 Z1 X4 u( t0 f1 G1 _' @    *(p+i)=i+1;  M  P8 }  m! M- j  Y
   i=0;) D1 O: G4 D$ F: u. n4 v( ?3 H0 \# k
   k=0;# y" L; Y" F) g% S8 f0 k& P: L1 L+ T
   m=0;  w2 D4 u0 p4 v4 y( m* \
  while(m<n-1)) F+ ?  r0 `" o5 |1 G! B1 W1 G
   {if(*(p+i)!=0) k++;
. A( m% c4 A- S6 d  i( B# @$ t4 Y     if(k==q)
% G7 X* F/ ?/ u$ T      { *(p+i)=0;; N( P1 o8 Y/ A/ E# y
        k=0;9 p: W3 M$ N  J0 Z  d' l5 L& ?
        m++;& L( l0 a3 v3 b7 `$ |5 y) d2 a; e
      }( p" U% h% {) C. W" ~& }
    i++;
/ d- y$ D9 Y6 h  O# O    if(i==n)i=0;
- \- G! n  F4 _' Q   }" e) h6 j, R- e$ d2 o
  while(*p==0)p++;- C+ P& }5 D/ b4 U% X
    printf("The last one is NO:%d\n",*p);0 v) z" }9 {7 q
     getch();/ k- H$ w2 m; @  Z6 E+ A' k

( P: D* H3 \2 k4 i5 g; J& W}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
8 Y7 Q* t+ G4 D  k5 u* I4 enamespace 又费马达又费电; q5 z. |3 `  a
{! S  l5 c1 e; ^' \: h) s
    class Program4 H8 M+ P0 C. M& y3 @
    {& n0 M: c  w  F, Q
        static void Main(string[] args)
; {, E/ `& h: V6 i2 Q' X        {( {  y( N) p, C; |4 ]! q
            int m, n;
2 K0 N' t; K3 `+ H" \/ K            Console.WriteLine("请输入数组长度");
! U/ U1 P5 K  P- O) y' y5 G  m            m = int.Parse(Console.ReadLine());//m为数组的大小4 A9 t- G' h% g' e5 H% F
            Console.WriteLine("请输入要截取数字的大小");
  B  c1 h7 `: _4 J- K2 @- H6 U' N, t            n = int.Parse(Console.ReadLine());6 o, s9 N4 @- Z: O1 I2 o3 {
            int [] numw=new int6 O: B5 Y& @* G) ^0 V
) `: f1 `/ |1 u- A
&shy;&shy;&shy;;' L0 v+ p" s! M; W$ p* ^& k
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数, e% x  I) c7 T) N* P) N/ I7 d! u
            {( T5 |( E6 L' b
                numw[j - 1] = j;
& f+ C( l5 K+ h4 ?& [$ _            }
$ Y5 V/ f5 Y! K) {            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
1 j; y) c$ \. q2 H( l. U            while (d != m - 1)
: k# ^* o2 O; h* N: c1 R: o9 _            {
6 k6 u. |* a  K2 K                if (i == m && d != m - 1)
! @' r* G# E+ Q+ m, H* o                {
5 C# T7 R* Q& \- k# M. q                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!" j% s2 ?' u- Z5 z9 d: j5 M
                    continue;
7 K1 Z3 z1 C$ j8 F! v- h3 {, f                }% ^% z4 t5 t' r% J& ~7 ~" Y
                else
+ K2 a+ q: x5 J( x                {
, \1 ^5 ?+ l/ \+ K& z- M- P8 q' I                    if (numw[i] != 0)6 O- j/ l! ]# M7 P
                    {
7 M( n, |% m, O% [7 b                        i++;
6 v; C. T. U# E' b$ G6 V$ N5 A, D                        k++;) ^; {- }: T' z: t0 I7 q
                        if (k == n)
8 L* g" S, w1 [. }  b& x9 f& Q7 l                        {
5 ~& |# n8 B1 o                            numw[i - 1] = 0;//把在n位置数组元素的值改变了. \. G' n: L  Q
                            k = 0;5 u" j5 e1 ?  p8 S# `; B; Z
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
1 V2 ]  M% W" [- J" C                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
* p& E0 c/ j9 x( b, o# c5 w                        }6 V0 K2 M7 k% X# R
                        else//输出暂时还没有改变数组元素的值6 g% ]0 |! n& g; a- }6 u! Z
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);3 |/ s  n# x& d" D& r6 m; C! W+ w
                    }" ~  l+ _7 N: ~# s% @& Z
                    else; B3 u0 x( n( E- I9 S7 Y! }. w
                        i++;//数组元素为0,直接跳过,不计数。。。
8 r4 N# q  m4 t' c5 R, y                }+ b* B, Z: a0 H5 E  }% x5 J! [2 |$ J/ l
1 X* c  K5 F/ s: R% T( @
' C' s( o8 r0 [
            }//结束while循环7 L# F. |9 S. ^! ^
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦; D! g. I7 W$ E4 }+ q/ D
           
1 z  h  V+ {4 q5 @/ o* B                if (numw[i] != 0)
0 i% n# B, ]7 @/ i7 D; }                    Console.WriteLine(numw[i]);
3 s- D0 s; i1 ]           . R" f& j$ `0 Y5 z7 R7 X6 d! W' V5 y
            Console.ReadLine();
2 N  M. X+ [7 P+ s# |  Q        }
: V6 l- }- I7 c; k+ J* ^    }; [7 j' d0 U, W" x, |
}
- R2 @" e6 T/ {- \
小甲鱼最新课程 -> 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-25 00:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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