鱼C论坛

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

猴子问题

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

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

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

x
大家好!. Z( ^! _. ~- y1 M6 \0 Q% p6 R
这几天我在忙着编一个问题,我用了一种方法编出来!7 ~8 ^, y5 b, C5 u/ y1 k5 D1 \
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!7 P5 {* Z4 W5 N! {
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
* X6 C+ z9 ]" a: P# x- ?
% |1 E: p" O: X6 d& k4 y* K( {
6 j- v7 C6 R; A  u& ^5 h) k2 W$ g
                            题目& e' Y& J, A3 C% w3 A
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。  m6 A# A0 o' D: G0 |! ]: ~
第一种方法:利用循环链表# M! d. z$ z! N9 e# _7 S
#include<stdio.h>
+ \( [& i. G; P  g9 T) q2 G% v& R#include<malloc.h>% o3 X, s7 P+ q6 c
#define M 8            //共有8只猴子: P6 m5 U# o4 Z/ H- j% D
#define N 3            //数到3只时退出第三只8 W( Y) _/ ?3 C& W
typedef struct monkey
. Z* X+ g7 W6 _$ A$ H0 r{int number;8 z& e9 _: N' c0 @7 B* K
int flag;
% w- m  Q( [( H: i) z2 [8 m3 Vstruct monkey* next;
4 a2 Q6 r9 g1 f5 ^}MONKEY;
% V( V8 s$ n( K, k, {2 ?. z  n3 T3 ~main(): x" p7 ~3 h: a; W8 A
{ MONKEY *head=NULL,*p,*s;! w% X' `/ ]/ v6 j0 w3 i. _
  int i,sum=0,count=0;
+ x0 v% i2 z& K  clrscr();              //清屏
/ _1 n  S' ?. `' E! J2 m) n0 E' E5 y( o  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
, D& K  H; \9 }  v6 b- b7 \( n  p->number=1;p->flag=1;
, K3 b- w+ k/ a- K9 _  p->next=head;
! \& u6 e# L; V( v0 H  head=p;, E, r- A& a, j, S: b8 o! F
  for(i=2;i<=M;i++)
5 Y% `2 R" ?! E( i3 r; H    { s=(MONKEY *)malloc(sizeof(MONKEY));
" A( i4 z- U7 O! s" l9 T3 q, ^# ^     s->number=i;s->flag=1;9 J# v6 C2 J( S4 e' g' ]
     s->next=head;
' v$ U/ w- \  S' ~     p->next=s;p=p->next;3 ?  F! b3 u8 j, y- N2 K: R
    }& g3 t& i) h7 e7 P
    p=head;
3 R5 p5 K% \, j" Y9 z   for(;;)
: t) i7 I. F# F4 \$ J    {if(p->flag==1)9 X& P$ H4 r- V# N8 J6 |, ]
       count++;. }) |# z) i+ x! M
     if(count==N)
; W! L* d* |5 Q; N7 H5 ?# R        {p->flag=0;
8 o( r- _& ~7 x6 [+ ^         count=0;
5 v1 F- m4 K  t! r. m8 {         sum++;}+ S0 w  b! U% y) A, x, m, f
     if(sum==M-1)4 L. c: L6 h, ^: J
        break;5 u' h  l, O+ N( Q' Z3 O/ K" W, Y. A- g
     p=p->next;5 Y8 h4 m$ H  D
    }
7 J# l" j% ]- |& s3 M    p=
1 G! T4 ]1 u5 B2 e( G- e" A! G4 v7 q    head;
$ `8 }2 e) z% e: n7 R" m    for(i=1;i<=M;i++)1 d7 c% E& {/ C& o8 N
    { if(p->flag==1)
, y3 `; M% a6 U        printf("\t%d",p->number);; a4 \  r3 G+ f
      p=p->next;
# Z3 Z5 `4 q2 T) M    }
! ?; a7 T( M& J) D+ E6 \( }
1 d0 ]( ~  u9 j+ W# f1 `, G
/ g) J8 b+ }% z% z! ~! n% y/ D  N* E! e1 G# n
}

3 K1 [( `# n# c. k7 m7 c  c第二种方法:数组, g" \- o' W# h$ X5 q/ \
#include<stdio.h>/ Z: F4 }5 A  g/ r4 |
#define M 8
% i+ d- \2 X" s: x3 ]struct monkey
! t* t9 \- p! w" o4 F{int number;) N8 j: y! c6 ~
int nextp;
% [8 j9 d. w- K8 l}link[M+1];, A# K6 W6 a! R

" s6 g) Y4 ~, }3 Q3 Fvoid main()/ c( a  P" U3 e5 U& G) @
{int i,count,h;* z8 J+ j5 K( O3 ?) y% ?% J( x! o- d* ^6 f
for(i=1;i<=M;i++)
3 b5 y, l; ^# Y" B( G" H5 T5 s{  if(i==M)
' _2 W: p( g2 w% L   link[i].nextp=1;
1 [  J3 k+ ?5 `   else9 w% o' K/ X0 b; U0 k0 ?9 D
   link[i].nextp=i+1;
# m2 R% M" h- A6 |7 @; I* e* x  link[i].number=i;& T; i0 Z/ G5 p( \) |) Q
}8 n' E0 \0 k4 G" z! y
printf("\n");
' {* ~8 @& [0 x7 {% Ccount=0;. m/ s+ U& v+ o& e  g/ M
h=M;
! L! G, o% m& B4 N% b4 @: aprintf("依次退出的猴子: \n");- E1 V. g4 N- L! H
while(count<M-1)1 j8 r5 D. z; h
{i=0;
+ q% g1 d( {. _3 R% ?- U: uwhile(i!=3)
% C  K: P8 O( C( w* ^3 l{ h=link[h].nextp;0 `9 [9 P2 V. R4 V3 n7 Y
   if(link[h].number)
4 R" J! Q# o7 o* f0 q, I4 c6 s( i     i++;}
7 V  w, _( Y! F4 c9 o: V. U. y+ H4 b8 d2 {3 K( ^$ M8 m# c" D4 d2 P
printf("%4d",link[h].number);
3 d, L! ~: d( E0 e% E- zlink[h].number=0;
! s% k& U, V" x. C1 n- i. ]7 ocount++;
9 f' w, V7 J; a" E$ l2 ~}
+ F* v, h$ y. r2 D: h! z0 L) h. U. \
printf("\n大王是:");
  @+ y  v& ~9 ]$ c3 b7 z  for(i=1;i<=M;i++)
+ O- C& v0 }! }9 H* q  T  if(link[i].number)  X1 d. ]: y$ j, C) A: p
    printf("%3d\n",link[i].number);# l6 O# K: G' R8 K
5 x4 x7 P. T4 n1 q; Q3 {

& o+ s0 z% {$ ^}
' f% D" _: |3 C! Q4 F! H; m
第三种是普通方法for循环
* B1 D4 \* z. Y( w, i7 s
#include<stdio.h>
5 J) j$ [, {4 Lvoid main()1 o+ m- K. l$ o
{ int i,k,m,n,num[50],q,*p;/ ^: C# W3 q+ _1 e. u
    clrscr();
) M+ r7 l6 D6 E4 Y& f   printf("input number of person: n=");; L$ @3 _& U, J# H6 H0 `" c0 _/ O
    scanf("%d",&n);
2 |2 f8 V+ y2 ]  Y2 ]# R2 i/ eprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只1 |7 V: Y% y3 W  ^
    scanf("%d",&q);
" }9 l; g1 P7 o2 }% J: ^0 o  C   p=num;
; m# X0 Q; i* @- V/ q( v  for(i=0;i<n;i++): X" U% b8 U/ O1 f
    *(p+i)=i+1;
; U' b! w9 z: K, p( p   i=0;
1 d( ^2 P/ Z- W( E1 @' X   k=0;
+ i3 L6 E' A: [% O4 R# O. [8 o" |) ?   m=0;
7 D6 N/ u5 `$ U4 _( S8 N: F8 h  while(m<n-1)
% b' V4 A) g5 W6 r8 D' o   {if(*(p+i)!=0) k++;
, n/ k" j. e- A7 _+ J     if(k==q): S# H4 G% y9 \+ G' b
      { *(p+i)=0;
+ P1 f4 z: w3 U8 f$ }        k=0;+ q: B2 y! k( K" A5 F6 [7 ^
        m++;
1 z5 k. a+ I/ y      }
4 t! U1 Q7 q+ g8 N4 x0 J! I    i++;
$ U" ]9 x% T% C( G' z' ?    if(i==n)i=0;
9 u  W4 T6 T3 ~* u   }
- S) e! x  u# W+ h, q) w  while(*p==0)p++;
% [# r9 }" b3 T8 P5 c9 g    printf("The last one is NO:%d\n",*p);
. d2 o- q* v$ |! a& S5 m4 U     getch();
) }8 M* G2 L% Z7 E5 k1 a% P, J& w# j  l! b
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
# F2 S2 q% z  L+ Z0 n  vnamespace 又费马达又费电* {; T5 F: `* a4 W4 J% Z4 N
{
0 I; S* H7 [0 N' J1 ], J    class Program
! ~" D- S( x5 W( M2 W4 T7 |$ D9 X    {
. y5 b, _" x7 W! J        static void Main(string[] args)$ {& l3 ^2 M9 M" `) R. Q7 j  U; b
        {* B  |3 z0 N: w( I" I
            int m, n;8 m6 Q9 `$ Z4 y8 `. P
            Console.WriteLine("请输入数组长度");9 C% r3 ^  p; j# D3 X5 N
            m = int.Parse(Console.ReadLine());//m为数组的大小7 Q9 b9 ^4 l, @1 g# {7 X/ [4 A
            Console.WriteLine("请输入要截取数字的大小");% M# J  i1 P4 O; x& Q
            n = int.Parse(Console.ReadLine());4 U$ W) K+ g& j  M" i, s+ a& ?
            int [] numw=new int
7 s. ?. Y) B0 V1 y9 F2 a: V
# c' R+ L3 f& `1 J9 Y&shy;&shy;&shy;;: l, M1 u; u- o' l2 _3 j" t
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
; U! y, f) O  z) m- n            {0 W1 x8 [7 L4 W% m3 a; }
                numw[j - 1] = j;
! d- r5 h3 c4 p/ [0 q9 Q. \            }
, V& A0 T! u, W8 s- o, d            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
+ H* x7 ~( I2 U- M7 S            while (d != m - 1)8 P  |/ C0 D/ E$ l$ P2 F
            {: e  v! s) B- `2 M- U
                if (i == m && d != m - 1)% O/ J# ^" m1 D7 `+ V
                {
2 L3 m4 A6 b; b; M                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
. r% P$ [8 C* C# L5 s                    continue;
" K. U) B0 l* A: m$ G                }
# k; j5 C1 f0 k  Z, H$ b1 B0 P                else
% k# @! Q, l# Z1 p$ F                {$ w% `* }; s2 H  b$ w9 T
                    if (numw[i] != 0)
( l! N. j% k. L% C: c. m2 N- k                    {
- ~/ H& [1 ~* g1 ^( d) s2 n                        i++;
! d! v" {3 z. T) A; f  C                        k++;* i! ?8 s) R  K) J, Q
                        if (k == n)& \3 `; V) S  b! H/ @
                        {
6 p( {! b' d! `6 J  z; C) I                            numw[i - 1] = 0;//把在n位置数组元素的值改变了& J2 U$ w4 `  v* o0 S; F
                            k = 0;
* Y4 e9 H% c" `7 ?8 f: S" ]              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
  V0 e5 f, \% v5 Z# x4 b                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);: d9 N9 a: Q! [1 N) E8 N/ q
                        }
3 q( ~" `( E, g, O! N5 s                        else//输出暂时还没有改变数组元素的值
3 V+ s; e0 S3 p1 ^5 Z6 c1 M                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
) T  H; g" _* q; P8 F8 A                    }
0 G. S. O6 m$ d3 v                    else6 V9 k1 J% b8 Q+ b4 }. h
                        i++;//数组元素为0,直接跳过,不计数。。。  w# D, A, R7 P
                }- u4 ?2 f0 T) k$ C' W6 K  M

  _' s- ]4 E4 i7 F2 l3 u& a/ V1 V3 ?
            }//结束while循环
* Z! }* t  Z1 S/ X1 n            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦  Y) j; P* m+ F9 r; Z6 _2 a
           
( w9 ~2 @) s2 o' K                if (numw[i] != 0)0 Z" `* [. j( g9 M0 }- Q  \
                    Console.WriteLine(numw[i]);
' K+ B. z& z0 h  c" w0 A: X           1 O- C) c2 O2 q  u
            Console.ReadLine();% T5 e: M5 p, O5 D6 |4 w% `
        }
) X( N3 t& z* J7 x( z    }
8 S) }( D- J8 E3 N# x* P}' A/ C& P! T! M6 @& \: U* b
小甲鱼最新课程 -> 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-1-29 15:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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