鱼C论坛

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

猴子问题

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

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

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

x
大家好!
* r$ s+ ~0 g; B' R6 j/ |这几天我在忙着编一个问题,我用了一种方法编出来!# l5 @" o$ G0 [3 t" e1 O
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
5 g) z: B4 z0 o3 z注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
+ `' I3 A5 r; w5 K! d8 l2 N& Q1 q5 T& h7 L" i1 J+ G
+ S5 E+ [  [; @
                            题目
: p' x: H0 x7 m- x山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。& Y7 O2 x, N& q
第一种方法:利用循环链表
  d, J3 J8 p* q! B#include<stdio.h>
3 n3 O# @7 n" f/ I#include<malloc.h>
- I4 B# b2 n" p, \6 C+ I#define M 8            //共有8只猴子
! }/ c, d( m# n  c5 i# s+ s9 w#define N 3            //数到3只时退出第三只
# Q7 o+ V! L& E# W% L) C% @typedef struct monkey( {  d& j, a& A+ R' z
{int number;
' i( N2 C3 W7 V  h3 R8 x3 Gint flag;
" ~$ e% [& u" a) cstruct monkey* next;# c+ ?7 E, P6 N0 d7 Y/ g
}MONKEY;7 J4 W  n0 g$ w1 {- ^9 v2 b
main()
7 r& e$ |! W# t{ MONKEY *head=NULL,*p,*s;
8 B: u/ Z" O- @  int i,sum=0,count=0;: p  f9 \! t! O/ @  t7 U
  clrscr();              //清屏
9 O# F) ?+ V, z, M! S# ~5 B  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存5 V* Z" i& X0 T% S! ]2 [8 [
  p->number=1;p->flag=1;9 n5 v" O4 z9 }) `% D
  p->next=head;
4 r6 W9 r. Z) R, O1 e- {# H  head=p;0 `8 d# ?8 [* C3 z" Z4 r/ C8 n
  for(i=2;i<=M;i++)
6 Q7 y9 x' U& K4 {! f4 L    { s=(MONKEY *)malloc(sizeof(MONKEY));& q2 D) n  a1 P. L; d8 e
     s->number=i;s->flag=1;
. r% z: W2 v7 k6 e) G5 F1 T) l     s->next=head;
" Q/ g7 u8 b: i. E1 S& z2 a/ k9 i     p->next=s;p=p->next;1 U- C+ K# a/ n2 \9 K1 N  V! k
    }
3 Y) d* E* I6 e6 h/ i5 A    p=head;
1 ]9 E. O1 `4 g- H" G   for(;;); C5 Y1 {0 F* Y6 n
    {if(p->flag==1)
! v; L8 f( s7 n# }; U5 r       count++;( g; ]7 f  I# l% Y4 K
     if(count==N)& J. w2 q; C8 @+ f! x
        {p->flag=0;$ i# d1 C: x. A; c
         count=0;
9 Q8 \, v' A( h  O! h         sum++;}
6 [2 w- t1 N& v0 T) f' n     if(sum==M-1)6 q4 ?$ X: `: Y( |6 {
        break;
" F* \0 e, N3 Z9 G2 N( @0 c     p=p->next;
) @0 Y9 r) y7 I    }8 P! B1 T8 `  D
    p=  C6 m, u6 s1 R0 X$ f9 ~2 |" j. }
    head;+ ~) s2 M% a. B& Y! z
    for(i=1;i<=M;i++)
3 J9 l+ Y: I. ]4 M/ G- J: q    { if(p->flag==1)$ z/ i9 @1 e6 w, s
        printf("\t%d",p->number);
% O4 P: u' y8 ^  Z' e      p=p->next;/ S  H* @  u3 q/ c
    }; X; F% Q/ C8 d/ `) c1 q# j

/ G: P, U0 D& n' Z# [) D! n, Q. Y/ s' l6 d& Q& ~+ o" h' q, j

7 B4 J$ s# _7 z' U! ?0 N& \9 u}

0 Y% I3 e! j; L1 d% `, Z& B  U第二种方法:数组( h* d" N8 s: `& R8 M
#include<stdio.h>
1 F7 D7 p: ~6 ^5 Y5 z#define M 8& a5 r6 S3 T$ a+ R' S
struct monkey
$ _! Y& [% S9 Y+ ^, s7 U& Y( G{int number;
5 t3 v2 G$ h5 P5 x  V0 F+ ?) u9 mint nextp;
7 H' Y7 Y( X: `}link[M+1];. I% b, K: r7 v/ ~; c

4 c" H& E, `: L. m1 g/ b" |& Fvoid main(): I$ G, K: T# d, z% n/ u4 W- C
{int i,count,h;" P; C) z( x  o1 h2 ~9 C4 j  s
for(i=1;i<=M;i++)
. e. J. Y: H' u- A2 i0 b{  if(i==M)
- P4 Q% `# m4 ^$ ?; u2 k7 P6 ^   link[i].nextp=1;
/ G( L: I0 [) @8 V9 o! I   else3 T! ^3 O6 U+ W
   link[i].nextp=i+1;
. ^5 s' H& s0 r; p. _; s  link[i].number=i;5 X+ |% T7 i, C
}8 }3 X+ f! w/ [0 ]) q
printf("\n");
8 S# n% g/ O% @- Hcount=0;) _" }1 l( |1 V
h=M;& @6 r  h8 {6 o  C( k3 ?
printf("依次退出的猴子: \n");
8 y  I; T! e& Y* Awhile(count<M-1)
1 b% S; h7 A) ]! v9 @{i=0;0 p% Z; I$ a/ r+ n; p% _
while(i!=3)  B6 J* j* t8 _& a0 ~
{ h=link[h].nextp;* P7 a* d/ ~2 t+ h' S  F. i: a* N
   if(link[h].number); A/ }5 P' n( R  |
     i++;}) L8 N" Z- q/ T' d% e$ @

+ {! q' S6 I. u" i' S' W4 Fprintf("%4d",link[h].number);6 w- I: z- v1 i3 \! n, q8 H
link[h].number=0;2 O, S; O0 a# b1 N
count++;. U; X) u. [$ L! h3 ]
}* k3 L* ]4 r9 T0 t8 c  H

$ `! T2 ~& S- z- nprintf("\n大王是:");
# z  r% Q. G0 D1 H3 _+ Z7 p+ W  for(i=1;i<=M;i++)
& t) c5 G, f% T4 {& |2 v2 [  if(link[i].number)& C. Y3 W- }/ D( |% T( z6 l/ J. X- n; s
    printf("%3d\n",link[i].number);% ^5 H/ z# [" c# @0 t- {. z

1 A! Q( {9 c( y# F
. j, Q/ i& Z+ l- C/ R0 v" S}
0 D/ z/ H$ U3 R8 T
第三种是普通方法for循环
2 o: @. [0 P% D" B
#include<stdio.h>3 Q% R$ }; y3 ?: M: A
void main()
$ V" c8 O% i9 \8 _8 r3 E' _9 Y  y, t{ int i,k,m,n,num[50],q,*p;& i4 F8 R+ `+ t0 P: \
    clrscr();
) X  @( C: k( C# h0 u0 P   printf("input number of person: n=");
* M( b8 E- c' g  h* M# U    scanf("%d",&n);% A2 H8 T9 G: {2 R3 {6 b
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只- j  W( }/ g8 ~: q
    scanf("%d",&q);
! T9 u1 D1 N! w: ]   p=num;7 y3 n$ R' B  W0 t- L. b& o) ~
  for(i=0;i<n;i++)* k. Y; V3 k6 R/ F
    *(p+i)=i+1;
% C  S) g6 `( g5 ?) ~   i=0;
, M3 P. }/ U5 n0 `; @$ h/ D$ C   k=0;1 c7 f, k# ^3 \* m
   m=0;
+ x( Q, u4 X8 ^  O$ B7 m: E! O  while(m<n-1)
, y  l- d4 n/ a& }! t  A) Z+ ~   {if(*(p+i)!=0) k++;3 F  @! S7 S' g3 P+ F
     if(k==q). S3 \8 t9 }% [5 z1 o
      { *(p+i)=0;# C: ?, I+ Z  l4 w. q# n
        k=0;2 `* N" Z, T$ x# n* W% ^1 A
        m++;# E& ?( \# S! R
      }9 Q: K& R8 j0 n2 U+ F6 \* }. Q
    i++;
4 u3 a! W, w* P    if(i==n)i=0;; f: Y) `9 y+ Q& W0 Y% |) V
   }: @0 }0 `1 o  e( u% k5 k
  while(*p==0)p++;
. O5 n8 E4 e1 D8 s1 A    printf("The last one is NO:%d\n",*p);2 @' `3 C4 F' I, H4 M3 e
     getch();
0 E$ Q: n8 N& m( U
) l' y' I, W( F* \/ w' `) q$ k}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;- ~; g% m6 M% I& W4 ?
namespace 又费马达又费电
0 N. N! \9 i) q: M2 r& C$ j{! m+ v& }7 s6 n
    class Program
0 {9 h2 j7 I% A6 i  A! j- p+ \) |    {
& X: P# v2 P9 n, `  v8 `        static void Main(string[] args)
/ n$ A3 f- Q& \# m7 S/ G        {
: M' y2 c) u' P* @$ u            int m, n;& ]! b* Q7 t* V2 D" ?( s8 L0 o2 z
            Console.WriteLine("请输入数组长度");
6 x  S5 B2 `) c6 z: A4 G. M; ]- m- K            m = int.Parse(Console.ReadLine());//m为数组的大小
5 ^% K" ~( K* I. d            Console.WriteLine("请输入要截取数字的大小");
3 g* G' N6 [& d+ k' X/ m& L) w2 h            n = int.Parse(Console.ReadLine());
5 O9 o6 d' E6 O; X, C8 ^6 `  k- x            int [] numw=new int
! U# T! L6 T  I% W/ n& W. C$ Z$ h1 b( v
&shy;&shy;&shy;;
- z9 e9 y$ K' t1 k            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数1 ~, A" N$ \0 p; p% ]' r; o! U
            {7 t) y0 p: ~  f& m7 T# ^& l
                numw[j - 1] = j;
/ p1 Q; C, U( ]( p+ h+ Y$ {: n            }. y, W) b( M; l2 l
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
' i1 J" t6 c  x: b# h+ b3 [! U            while (d != m - 1)" s3 m+ ^& e* ?* Z9 H5 s1 N# a
            {" j4 d) V% d6 X: A; j
                if (i == m && d != m - 1)
/ y- k  v. y' b# R$ k4 f                {
. a9 b9 B" v$ e  f3 y0 s                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!% w9 _3 C# q6 G1 l* R+ W
                    continue;
- J0 T6 j4 l! T; R                }, h" b4 v+ \! a
                else* G  x1 V4 U7 {6 C  t3 L
                {2 A& @  W: l. A" D
                    if (numw[i] != 0)9 ~2 j# e& `  l
                    {8 ~' `0 K6 s2 V# i# F
                        i++;
! m/ o0 |3 I* v4 v7 D  Y6 N                        k++;
' y' M( x* g8 N5 A                        if (k == n)5 a7 R0 W& J; K* e
                        {
4 m1 n# Y# z3 T( f                            numw[i - 1] = 0;//把在n位置数组元素的值改变了% N$ T* J) y" s# _
                            k = 0;- n- F" Y2 K3 S2 F% y4 s+ P
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1: X* d2 b2 E$ n; @& ]
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
. w7 D4 U6 N* U0 K  x- W                        }
' h2 m* l  X5 V                        else//输出暂时还没有改变数组元素的值
' W' K- Q# w$ d3 M  d                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);3 k  H: S' c: I4 [
                    }
  E! |' K" ~3 q, e( }0 ]% S1 U! m- X                    else6 \7 ~! G4 A" D) J
                        i++;//数组元素为0,直接跳过,不计数。。。
5 A  a/ G8 O0 V# w4 {+ D" h                }
; [% U% c7 ?: I) ^9 Z, q' G" }  e' G* k
/ v2 Z# |- l1 T, X0 u5 `8 T2 D9 c$ I- _
            }//结束while循环$ f. s* |0 m: _; j& J" p' \" r7 m
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦$ _6 o' O) s4 F: h9 b( t$ d4 a; y
           ; l7 R' s4 [( j, d% e: v
                if (numw[i] != 0)
% ]( h% U5 v! V                    Console.WriteLine(numw[i]);
6 _# t+ G4 ]4 I. ~3 [/ R: u6 N           
* W- t7 M8 x4 i/ V/ A            Console.ReadLine();
4 I3 D( [, |4 ^/ L' z: V        }8 K/ B( n# h8 Q7 k+ p" y& |* v
    }  {7 P- ~, @1 t& D8 c# j
}
- x" {+ a' q7 U- l2 m* r" x) a
小甲鱼最新课程 -> 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-2-7 23:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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