鱼C论坛

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

猴子问题

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

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

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

x
大家好!) V# [* \+ r  g9 {3 T8 ~  [
这几天我在忙着编一个问题,我用了一种方法编出来!
/ A; S/ t7 y5 t% `但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
# z9 K9 a. [% H% s( [+ @' o注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 7 j* W& ]; K) J, I2 Z

8 |" x/ [9 s1 p' ~& l
7 c; {0 S1 T2 g& o6 T1 o
                            题目
" |. u7 U  B# }" a( ^0 W山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。' `. O+ @0 Q- e& g4 h
第一种方法:利用循环链表
6 G( p! R; ?$ r/ W#include<stdio.h>" c* U. @- V5 G( e8 t- o
#include<malloc.h>  f& E7 \" \! D, c5 e1 r# e
#define M 8            //共有8只猴子
9 n+ O  R3 S$ M; e' p+ ^" |1 S#define N 3            //数到3只时退出第三只9 ~3 T$ O6 @6 Y5 |
typedef struct monkey0 a8 k7 u4 m- D; j. R) J
{int number;3 M' i# {2 M0 m# N! W0 k
int flag;- A! ~6 D- K7 t2 l
struct monkey* next;, @  a) X0 g% w( B
}MONKEY;+ z- s# u9 l: ~6 O( |
main()
- |1 f8 Q) j6 a& ?. a) Q  _. C{ MONKEY *head=NULL,*p,*s;
  o$ @* B% D* x  int i,sum=0,count=0;" Y+ r0 i  v( `5 ?# A: r- J) N
  clrscr();              //清屏
5 I( g: W$ [4 W, F  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
  H; v  K3 _  }( k3 c3 _7 O  p->number=1;p->flag=1;
4 P* P) |9 ]  n0 Z& a% g  p->next=head;; o8 H/ c8 q: s: \
  head=p;7 `2 J% G# Y$ H) \
  for(i=2;i<=M;i++)6 Q2 X5 y6 U7 b2 A) ?2 R* \
    { s=(MONKEY *)malloc(sizeof(MONKEY));
( `+ i& r- w  V; [/ A( g! I     s->number=i;s->flag=1;9 Z9 @& J$ g& p' @: F5 h
     s->next=head;: |4 P  H: l& Q
     p->next=s;p=p->next;
* k. i3 z  r* {9 X1 w0 R. E. [    }+ D7 i1 R' M: \2 b
    p=head;/ v9 {( D+ H% o$ O) m- a
   for(;;)
) W5 l8 s% M* m$ G* H! E0 ^+ Y( C! ]) J    {if(p->flag==1)
) j: z; ?4 @- G       count++;; I; A: z/ C  K) d& T* t
     if(count==N)
/ E7 t9 `; n  I& i& N0 X% t        {p->flag=0;
* Y! r" i. W7 n3 W3 u         count=0;
1 A5 [3 S$ C& N. G7 [9 m         sum++;}1 f% |' K5 Z  |; ?* |# j8 W
     if(sum==M-1)
- ]" z+ K# I8 g2 a        break;2 i2 D2 C4 ?; e/ Q
     p=p->next;
0 w& c. H- H1 e" n& X  F" \$ t5 p; A# t    }* V) y$ `  M1 v1 y4 j
    p=
+ _; P' P% ]* Z7 s; l* Z    head;) r% B' u: N& N7 ?( c  {
    for(i=1;i<=M;i++)
& ^2 y- d. ]' S# X    { if(p->flag==1)
% G; U& s, N( n6 N0 l7 ~( ~        printf("\t%d",p->number);/ ?7 `. J+ E. d. ^( x1 N
      p=p->next;" q( y. r% g7 C; t6 b; O6 w
    }
( W- r/ N) V. s2 P" C1 x* i: ^9 @
( D( `0 j! `" P! Y/ R1 g
* B' j! H2 i8 u0 `) o  V( T5 q% d. D( B9 n! E+ K5 s; S* Q
}
0 b: c/ B& m# P+ k, M3 l
第二种方法:数组
( N; P, g+ ]0 b: o, ]#include<stdio.h>
# d+ q  K# e' Y) Q( P& P  e5 A& f#define M 8
# L& R5 A5 n1 nstruct monkey
& ]2 e) L/ O3 u% o! ?0 t& y{int number;
% o, V: V: C0 e" f/ W/ Z1 rint nextp;
/ `1 A9 n* \3 F}link[M+1];
" H. L* x( G6 b6 ~
4 k- o3 ?) q& \; Rvoid main()
5 [/ b" n9 M0 |# O{int i,count,h;
. U; L# G& Z3 F# K8 zfor(i=1;i<=M;i++)
$ v& k/ e0 w9 p{  if(i==M)
3 c$ D6 o! Q5 j! J0 s   link[i].nextp=1;; x. w- l% e/ }( q: S! g
   else; K0 d4 O8 r1 a+ V2 O
   link[i].nextp=i+1;
5 @/ C% c3 W( G  N/ ?: w' \7 |0 F  link[i].number=i;) Q8 h5 d* S0 K0 M, }
}
: D( F. d4 R3 u2 w, g  J2 wprintf("\n");9 e& @) h1 h( H) ~4 X! |* F
count=0;  p3 n% O( f- ]( W. Q; i
h=M;
9 p$ n' I6 N- D& @' Z$ Bprintf("依次退出的猴子: \n");1 c+ u3 E* D6 R5 N) u$ ^3 y! N
while(count<M-1)8 R0 d7 D; h9 M8 t6 q  y# L; C
{i=0;) g  U+ ]; t2 C2 ^; A
while(i!=3)
( O1 b: x7 e6 u* W" y3 E{ h=link[h].nextp;
. |& w5 t) ^; G2 j2 t# w   if(link[h].number)1 C. H3 J0 m: n/ Z7 e, ]  G
     i++;}7 k( ^  q' H' O/ Y

" Z+ E( g. Z0 ~8 s7 C8 uprintf("%4d",link[h].number);9 |. ?, \4 h! h
link[h].number=0;
0 r% r9 U/ W2 a( G1 Ucount++;
% N5 ^6 e) @# h1 `6 o. V) X9 B: Q}: J3 [, I8 }  k$ N% `3 r. Y
+ Q5 z/ {9 e7 d# V/ G
printf("\n大王是:");
/ x; ?! X5 |5 e5 F, Y7 w" y! r  for(i=1;i<=M;i++)
/ ]  U0 S: {& C  if(link[i].number)
# q" A- p. Q  W( s. L    printf("%3d\n",link[i].number);! N/ W1 s9 x" y/ ]

& ]. V. V! l7 Y6 n- u
- X+ s( r) _: Y9 {& o! X3 G}

2 e# F* v( E# H* q6 r1 M第三种是普通方法for循环
0 C) R2 E  L6 J0 w6 Q+ R
#include<stdio.h>: E" w) h2 F' w& o
void main()
- l7 g& y1 D$ e{ int i,k,m,n,num[50],q,*p;3 d. F0 M$ b; q. I2 \4 j9 n
    clrscr();
9 i$ D! c5 M8 W: T7 q- W1 _   printf("input number of person: n=");
7 a2 D0 ?0 v+ X4 f0 B" o    scanf("%d",&n);
3 m- I% ]1 [; ?2 Z$ aprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只4 v$ L0 }+ D# y4 r- h5 d& Z& k3 E
    scanf("%d",&q);
: T( n5 S, R( B% ]+ E5 v   p=num;
- f) s0 e+ C7 s' c( I: L" D  for(i=0;i<n;i++)
' s6 e/ ~, `, ^$ @. _3 w4 K2 e    *(p+i)=i+1;
! q3 ^( w( y' v7 L  C- t   i=0;
1 b" t, M. E& \3 Q$ m6 g  \4 {7 C   k=0;
# Q& N1 d, P8 Y5 K: P' T6 w   m=0;
6 y4 [6 s, s) M0 l4 I  while(m<n-1)
' [: m  t4 _( p7 x1 @   {if(*(p+i)!=0) k++;
, ^, V. B: I1 y2 C( m! }     if(k==q)
9 f* ?& y9 p! ?2 i      { *(p+i)=0;% n& W* R. \  `: G0 X  C
        k=0;: f/ C& ^8 k8 ^: \$ F$ F9 o
        m++;
: D$ A3 H8 M) M0 _6 b0 t' Z      }6 `9 G: f# x, R8 [5 D
    i++;
1 x! s  Z, h4 u/ Z    if(i==n)i=0;; k' ~* t& O/ N1 ~9 v3 d& `
   }; I( Z0 D( k' t8 F. W) V
  while(*p==0)p++;5 o! W  b- _9 }8 Q1 S  j
    printf("The last one is NO:%d\n",*p);" t' s! x% o: {: x
     getch();
$ @2 C5 N5 V  D, H; R4 j& u2 @1 T1 n# c3 B
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;# G( u6 t( M0 k. z& l/ p$ X0 c
namespace 又费马达又费电7 H# Z  s3 S' C
{/ Z& ?6 Z8 A. F% y& \
    class Program
: ~2 |0 U: |: k& R8 r  |    {
. N2 Z; g# @& G  g1 L        static void Main(string[] args)5 e, f0 Y3 U# M/ P$ V
        {4 x/ }8 n: J$ g8 }9 d
            int m, n;, [4 _$ V: K8 f
            Console.WriteLine("请输入数组长度");
- x/ l9 a- O* O7 F' B            m = int.Parse(Console.ReadLine());//m为数组的大小- M/ n$ b: e1 k0 s% I8 }& Y% q8 U
            Console.WriteLine("请输入要截取数字的大小");+ N7 y" M, t+ m: e- C" v
            n = int.Parse(Console.ReadLine());! H0 E: ~  u- W& r$ @( H) I
            int [] numw=new int
, {" K8 z! D% L# P/ X/ g. f# D; H# a4 C2 n5 Q
&shy;&shy;&shy;;; I4 w' E$ `9 x
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数! A% S! L: ~5 X3 _4 q4 I
            {
4 b" m6 s: |, j                numw[j - 1] = j;
$ f& u" R, Q  ]4 ]: W            }
  Q( K' Y& S+ F  V+ l* P            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
2 _3 R* _- K7 z! |( N5 u& @            while (d != m - 1)8 I1 G- V; ^4 i, c$ x: u
            {  P7 x+ n& n, _! r) i4 W1 t- d
                if (i == m && d != m - 1)
9 H( @' r% u3 q. P                {
0 w2 R# ^  ?" t" N& x                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!$ j0 Q: O1 G% Y- R
                    continue;
/ d2 O. g% ~: ?" V                }- Y( B1 g6 L8 U
                else9 w2 O) [/ J& h6 O
                {
, m3 b% w; h1 g" M- \0 n  |                    if (numw[i] != 0)
% M; I+ D9 `7 E1 s/ S' C8 Y- {8 f                    {7 j4 i) z6 v7 `+ A% V7 |
                        i++;
1 L/ p  N# f2 `                        k++;5 u1 _- p2 I# i# Q# K7 J+ q* y
                        if (k == n)- e9 ]) h; `3 X. Z: f6 M: G
                        {
8 q. c4 X# W; m/ C+ }7 M3 b7 b                            numw[i - 1] = 0;//把在n位置数组元素的值改变了" X. v* n# k7 d* r" j
                            k = 0;
1 N9 Z3 F/ _! H; B' d' u              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小17 C5 K0 B4 R$ \
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);2 U& j. F% R" b- ?/ i# W
                        }
8 y; W* A1 `1 D/ A                        else//输出暂时还没有改变数组元素的值$ G' O% y8 ]1 U7 h
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
! P$ Y( l# N7 h* l                    }% K7 h- R3 r  v4 l* g  j! S. O
                    else/ o6 n4 y, r, G( P4 n$ t
                        i++;//数组元素为0,直接跳过,不计数。。。7 b0 j: c& \) M/ k
                }% ?$ F! P3 j; {

0 b3 `, F4 w* m! \  A- C
% s0 o6 s- W2 R9 U) b$ o            }//结束while循环
6 h) r+ f$ i. B$ V            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
& r! p/ O- C! Z/ m( j- {( z4 r           . G. Y+ c2 o4 q  ^1 z* H! K8 z9 C3 z
                if (numw[i] != 0)6 V& W) U; l! ?8 _
                    Console.WriteLine(numw[i]);
4 o- a' w( ~6 o9 ?! }           
- Q9 ?* s3 Q5 A+ y6 x3 t9 `* P            Console.ReadLine();% n6 ~+ M9 [; x4 K) G  h# p
        }
5 C  {: L1 e7 ^# ?0 x" c% Z6 C    }+ ^: k! v9 a( Y. P% J6 K7 s
}5 H/ t3 X* l% }- q0 C1 y" {2 [
小甲鱼最新课程 -> 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-20 00:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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