鱼C论坛

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

猴子问题

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

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

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

x
大家好!% R: G5 }9 d7 Z4 v+ P( n/ t
这几天我在忙着编一个问题,我用了一种方法编出来!
: V3 n9 w/ }; b2 T+ i但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!3 H! t0 k/ ?' P
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ) E, {% P. t1 \+ C

1 ]) J3 W1 E5 m9 I* L  Z) S9 w0 I1 h7 K
                            题目: N9 i9 P% U: a/ L
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
' w3 ~; l+ N" j1 Y' s2 Y第一种方法:利用循环链表9 G4 X+ J8 F. y
#include<stdio.h>
& K+ {9 W" r: |#include<malloc.h>
8 Z8 ]5 h5 d3 H4 ^$ E4 F#define M 8            //共有8只猴子# o; q& U0 z$ Q4 i# m1 P. ^- ?
#define N 3            //数到3只时退出第三只
- u3 r( {1 S4 t8 y* N" V: Z8 w, jtypedef struct monkey/ l- s, e# q% s$ @$ g, V1 L7 k6 z
{int number;
1 @# T% J7 q1 C6 ^3 K; rint flag;6 ?2 C, P/ W+ g3 Q8 U/ I% E
struct monkey* next;) x2 A# p, O- g5 o5 D
}MONKEY;
& v4 D9 E5 u/ R5 K% `  u7 Xmain()
8 q- N; u5 g7 p3 o/ E- s  z, X{ MONKEY *head=NULL,*p,*s;% P; X# V; q3 o: C
  int i,sum=0,count=0;! N* x  ?: U; E0 v! ^
  clrscr();              //清屏* W( H9 Q0 U- _6 e/ S
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
3 m8 u2 ~6 _- {& r* h  p->number=1;p->flag=1;1 ~. V6 q% ?' W& E6 A% x4 A
  p->next=head;/ ]# c! G  l- p& k' c0 e
  head=p;
% O" ~2 m. S! P6 ~0 F  for(i=2;i<=M;i++)
2 W  b7 Y- |8 E    { s=(MONKEY *)malloc(sizeof(MONKEY));; d; j9 f: @) o$ @7 o
     s->number=i;s->flag=1;4 P- r+ r6 f$ ?  h4 Y& d
     s->next=head;
. W6 f' @0 y8 v" ^' K( I) m     p->next=s;p=p->next;; N9 s# w8 |. F% a4 D: L( i
    }
+ c  i; q& `( U" D8 w    p=head;8 _; x  |7 t* w2 X( ^3 ]7 f
   for(;;)0 G& C! @! [9 @0 G% }. V- X
    {if(p->flag==1)
7 @; l1 V& o) z5 A6 [# u, _! L       count++;
; `( g1 L9 q% r. U* A0 l8 l( F4 k     if(count==N)
. h0 ?2 a$ x3 d& v/ j. p' N' ?0 `        {p->flag=0;
/ w  |7 L9 \" ?- T" D         count=0;
" p0 o9 Y6 ?! [" N$ Q6 Z& T         sum++;}8 j+ i8 x% A7 R
     if(sum==M-1)9 Z( V4 d8 o* N8 \- {2 l# F6 w
        break;% k4 J6 c% K) L7 _
     p=p->next;
: g! h% g" I) ?    }8 y% D9 G' F8 Q" }2 m  R$ N8 [
    p=
, N7 a+ w3 F& b9 y8 V* ^    head;
& Q9 P5 P8 i9 S    for(i=1;i<=M;i++)3 H+ A' s4 @9 c5 f* c
    { if(p->flag==1)
$ [1 ^; i# X% _7 U' Z( Y+ \2 a        printf("\t%d",p->number);
# n7 M  h0 q# P' Z. Q( f2 T      p=p->next;/ ?+ r- c# z8 N- W4 I) H& }% |/ |
    }
; x8 i9 O- _' N6 h) ]' q$ @5 O4 m9 x+ g" K

. I8 L' p0 h% a0 I
* U$ R" z- E* p( b}

7 N: ?/ p' U5 o: A第二种方法:数组
+ B* p0 a9 ^2 E+ `+ X- e#include<stdio.h>3 F8 N3 ?. Y' g& [! T
#define M 8  U; P2 O" [0 M8 s  u8 Z5 o/ N
struct monkey
" P: @/ R! R8 o( ~& @  h, R{int number;$ m1 l& O9 @3 K  W: F+ M+ o
int nextp;
6 G. t( j! O& V6 L8 s. Y}link[M+1];
6 y( {6 e1 @( l. M5 Y" e# c8 z% S3 u$ I; |: e3 F6 B
void main()! G& S* Q) g5 ?+ \4 k6 v0 t/ `& R
{int i,count,h;
% d7 Y2 b; L% w3 V" Q5 ofor(i=1;i<=M;i++)
, B0 h% s" c8 s0 s$ u) W6 J% _* _{  if(i==M)5 ~( P0 Z6 v1 i) J/ ^, T
   link[i].nextp=1;
+ y1 E2 ^. w9 m" `   else' |( f2 ?5 e# O3 O, h& W
   link[i].nextp=i+1;% R: i7 V7 j, ?& Z8 r$ d
  link[i].number=i;
( t6 q) ^2 k. w% ~+ X  ^5 H}
8 `+ G/ p: Q) |5 yprintf("\n");
- e0 v8 j6 y  T8 X$ h+ zcount=0;
/ d0 s( S. X9 l# Jh=M;  t: n8 a  ^# r) k6 ?6 R; c
printf("依次退出的猴子: \n");
/ J, i" h7 J4 O1 h# zwhile(count<M-1)$ |5 Q8 d9 A  y8 ]% ^
{i=0;
. M" d# H, F) P- mwhile(i!=3)
; b0 q0 y( z8 B8 k{ h=link[h].nextp;
" ?1 I$ y0 s4 l4 g* Y   if(link[h].number)
, b' g8 f. f! r/ k( x     i++;}
; @! L6 j' u. ^( Z9 _7 r5 r% l6 f- }3 K, M
printf("%4d",link[h].number);
- C  x/ n7 _; c$ x4 \) slink[h].number=0;% z' l) ~& v8 O
count++;8 ?1 M# w0 ?6 Q# W
}6 ?$ S* ~) D6 o8 t8 G  ]
% H9 R3 g9 C- ?& `5 k  a
printf("\n大王是:");
3 p8 G/ }# q) Q; J1 K  for(i=1;i<=M;i++)- E" {' p; J3 s- {$ H+ B
  if(link[i].number)
# n- o* w4 V  C, D    printf("%3d\n",link[i].number);3 f) u# b8 J3 L/ Y% ^

! n' w/ m. {" ?; ^' ]3 j) F% B" ^
}
! O$ D' g% f4 a, D
第三种是普通方法for循环
' n( Z' M  J/ ~2 i+ ?1 j
#include<stdio.h>7 S* A  u: {7 e% d9 i
void main()
% P  ~% o8 X5 {+ _4 o0 y{ int i,k,m,n,num[50],q,*p;
0 M( ]- h+ E. _- k$ e    clrscr();
/ X/ ]  w; l# D+ [5 I   printf("input number of person: n=");4 N( q$ y$ g1 }4 y! I9 p
    scanf("%d",&n);
- q: o" H' P' \  ]$ j: Mprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
7 G( @" x/ l, m3 T) ~/ v    scanf("%d",&q);  ^3 H, g) ?6 N' h  m0 M" d$ x: ?
   p=num;' x# A& u3 `1 |% a
  for(i=0;i<n;i++)# ^1 `" y9 `+ d7 w  E7 y/ x
    *(p+i)=i+1;
# {3 q; J8 F0 @9 c" v   i=0;
- ~1 d3 r/ a: J: U   k=0;
$ t8 g- T; V; t  M   m=0;
5 }6 Y2 X" K; c' C4 _- q# Y  while(m<n-1)
; l! K4 p7 i& e, _4 ?. G   {if(*(p+i)!=0) k++;! L9 B2 ^! U" H" k4 a" Z7 o
     if(k==q)
$ X: a8 C% ?3 [+ Q      { *(p+i)=0;2 k! }1 p) }; T6 d  T! I
        k=0;" B( h- w2 U3 q& e
        m++;' W) U' c; ~0 K' S( n
      }& L! Z# z% c1 W7 j  c, |" X5 \; }
    i++;
2 |7 r$ j8 p" {    if(i==n)i=0;
' z/ S2 u. K4 C; S1 z+ {/ K   }
' H9 ]2 H5 U2 B- j  while(*p==0)p++;
8 H0 A6 t) o$ V3 G1 u( u    printf("The last one is NO:%d\n",*p);
) E: g) i2 a3 y     getch();! X# Q9 z0 H4 y" i
/ o- G5 h  V8 ?- N
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
' W- x4 t" d# p3 m; c* qnamespace 又费马达又费电
3 s) @5 _* F. ]  Z5 Z# {9 B- d* ~7 ^3 H{$ I& `- M# l8 c+ J1 F3 p6 w* [0 [
    class Program- w+ N5 C. S5 U
    {
* n0 X- x9 {: Z6 U% N/ N3 D        static void Main(string[] args)
- m- I9 e4 r  F        {. O2 Z; M+ i) _; u) h. |
            int m, n;3 ?% [5 t' ^  O4 t0 T
            Console.WriteLine("请输入数组长度");
# e3 q5 R3 P& X0 a" A  J            m = int.Parse(Console.ReadLine());//m为数组的大小$ a+ }3 ?( {0 p" r
            Console.WriteLine("请输入要截取数字的大小");
, u8 s2 T- I5 m# J$ [; u+ b/ L            n = int.Parse(Console.ReadLine());
/ k: [8 `) s8 f9 Q( `            int [] numw=new int6 `' b* I2 z# B; I

' H* Z2 n2 `5 X7 D7 A0 A3 S8 q&shy;&shy;&shy;;
* Q5 }; @6 u* _# u: l0 K& B            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
+ z$ @5 S9 D% N0 A7 `            {
7 f! a' ]$ r9 h$ u& i. v/ M  }                numw[j - 1] = j;
: H* t/ r! ~- ?            }
' R7 ]6 v  Q* c5 |0 J            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
/ }3 u$ c$ M" Y% g9 u            while (d != m - 1), `' _9 S# \& O  `4 C* q
            {
2 b4 g4 ]% w+ o  m                if (i == m && d != m - 1)0 Y  z* J% D3 H) M2 u9 [
                {& Z& o* p' c. q
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!8 Z( W" d" F  W
                    continue;* n8 M. w' L2 |3 P6 @5 c0 t
                }& {% ^1 C) \% v8 F1 j. g. Q. `& u7 H
                else
" g3 T) t4 Q/ B7 z9 L9 y& m3 H, F                {
% F" ~& e( c( i+ w                    if (numw[i] != 0)7 i$ W* R3 S$ D0 s
                    {% C9 e6 c3 F& n+ R( A9 @
                        i++;4 c' Y: S5 W, D
                        k++;8 s* M3 Y0 e  Q6 ~, S$ ^9 \
                        if (k == n)2 C! {& Q. K+ _% H( W
                        {! _: [  u& h, D8 G) {' Y  S# [9 Z( L- }% O
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了2 y! M( ^% \* m& H& D1 v
                            k = 0;
, ?$ [+ L5 y( q              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1. r  H7 r6 q: F0 I
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);# c% ]% x: d: P4 v4 V% V
                        }% K; [: x* M' R2 }" n" k
                        else//输出暂时还没有改变数组元素的值9 ?/ b* E% e5 ^1 o( [: r5 m, ~6 U
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);, T2 o# D) J) L7 {4 @" L4 H
                    }% u2 o( x3 A3 c9 b; V
                    else
- }6 o8 r/ R. R2 f8 c                        i++;//数组元素为0,直接跳过,不计数。。。# a* f3 t- _! g1 ^* D) o
                }1 L% h4 `" w6 L; J

3 k% C1 b1 M# f0 j4 `$ N
, ~1 i0 k' N- K& H' S. u            }//结束while循环1 c7 G8 [0 Z. r3 o
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦7 d: P) v3 e. [4 [6 l6 G: I
           
# E5 F. Y. p, {. I                if (numw[i] != 0)0 Y+ J! \3 K# I4 Y1 D3 b7 M
                    Console.WriteLine(numw[i]);
0 X/ N, K# _; p. k7 u1 m1 i           # X3 `  o+ }! M( _# D8 u! I
            Console.ReadLine();+ J$ R! G, Y1 R; q. {8 E
        }
* b4 u) \1 T% i2 b. W1 G    }5 h2 |! S- h( q! U3 V* Q0 s
}0 J" l- Q2 p& H: g) }1 J
小甲鱼最新课程 -> 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-9-19 20:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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