鱼C论坛

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

猴子问题

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

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

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

x
大家好!$ @* `. i6 ], z" m
这几天我在忙着编一个问题,我用了一种方法编出来!
' @$ y0 z$ X$ y! U但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!1 Q9 I, n/ q. c
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
7 t4 [6 u4 k  w* `1 U! Q, ?5 Z
' ?4 ^/ k" w  l1 W9 T9 k6 I* t- |; }- R! g- H0 U
                            题目
) {" m2 N) d2 D; g. S* x山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。" g3 b: i: O3 b
第一种方法:利用循环链表* Y+ Y. M2 q8 g3 l8 N
#include<stdio.h>4 z6 B+ i9 ^. ~7 e1 \
#include<malloc.h>
2 A! v0 y% ~; m( }& o, w#define M 8            //共有8只猴子- `0 y% V1 e2 I' G7 ^. G
#define N 3            //数到3只时退出第三只
! r9 k" q: x' r5 ^1 T) K# Ftypedef struct monkey
: Z" H  q, n% |% r. ?{int number;
, H& a  T+ P/ ?int flag;4 }/ O% k! Y: J, f
struct monkey* next;0 O& L2 Z! F) ^/ M
}MONKEY;
, ^. m+ {: |1 p+ ^, Z  Qmain()' s2 K: R( z6 g1 D1 |! @
{ MONKEY *head=NULL,*p,*s;
6 C* F; D( X% C0 w+ Q4 v) r1 f  int i,sum=0,count=0;
/ [5 f. }. q# t; A% Q( }5 L  clrscr();              //清屏
  L& K( d. r& e( ?7 a- x8 U  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存6 v6 s, T/ D- n& w* z2 w
  p->number=1;p->flag=1;+ ^& o  Z- z, @
  p->next=head;
2 J$ P% f$ N$ d( I, I3 d* V& ?8 y) ]  head=p;% j. n) y! V. e& Z: _
  for(i=2;i<=M;i++)
# y, T7 n5 Z; A% h    { s=(MONKEY *)malloc(sizeof(MONKEY));
9 R. O" g5 g( \     s->number=i;s->flag=1;0 ?* r5 P6 u- ^& n
     s->next=head;# F5 j9 m( P1 K! R: o
     p->next=s;p=p->next;
5 e& M  G- n/ Q, U+ H$ H    }
6 A2 w$ [9 [% |$ v7 T    p=head;
- [1 O4 v8 d/ L1 J! p   for(;;)
5 t/ e; ^) o: C( G7 w    {if(p->flag==1)4 S1 s9 Z% U$ v  ^3 j
       count++;- D! m* v( H% _) d
     if(count==N)
* j/ D5 o9 W% F+ f% m* t; \        {p->flag=0;
3 j' ?( F9 Q! A3 A. o. p3 ^' i$ y         count=0;
8 g' w% u+ _2 ~- f& L# {1 F# D+ v         sum++;}6 M( O# C' K* G+ N7 o; ?7 J  H7 U3 H, l
     if(sum==M-1)2 A0 N& V* b/ Z/ P. I1 x# L) \" E
        break;
) G' |& Y3 {4 F; I     p=p->next;
+ x$ y2 q$ Y  ]. k    }1 }5 B, F1 a9 t4 t
    p=* t! s' q7 N) g8 [8 H+ O+ n0 O
    head;
5 t, H7 |, ?$ t% q- {8 H# g    for(i=1;i<=M;i++)
/ {# f  I# w3 _3 I    { if(p->flag==1)
9 c+ L5 w9 C& K% Z        printf("\t%d",p->number);  ?' e  i0 S, t$ q
      p=p->next;% G4 y+ ]4 q: S& Z+ a8 \7 E6 H- m" i
    }3 N6 z! f2 S: Z8 z  x
% z" z0 z/ v8 b6 i

" t8 u+ ]% W: @% e/ |7 Q
5 D# I  O' G3 G3 j5 J) I0 J0 n}

& i* i  v1 B  V9 [  L$ b, J# F第二种方法:数组( g; w/ _1 k' D% Y. Y8 D
#include<stdio.h>0 {7 U( R6 [' q7 |
#define M 8
( c3 U% E9 n6 x/ _struct monkey
- S- J8 }% B" i0 s, j) o{int number;3 v; J/ j* `% O* d- L
int nextp;
/ o3 F, T- p3 f# I+ C; C}link[M+1];& D! A0 E9 k7 U# `9 o+ ?) P- [, s

1 d. n0 @! Y9 Y- ~! vvoid main()
* C1 R& Q# A6 c2 A{int i,count,h;
$ h" \- \9 W' }6 n' a1 Jfor(i=1;i<=M;i++)
* j; `. _* O, i+ n0 u{  if(i==M)
! D. E+ ?* a; ]& U   link[i].nextp=1;7 {. }1 e9 v; y
   else
$ y' T" S. t/ V- Q- f9 \1 \$ Z& f1 I9 O   link[i].nextp=i+1;2 u" v8 I# B! A
  link[i].number=i;
; f$ E: G4 g$ e/ {}
$ ~* n" j6 D& p6 T- }printf("\n");+ J/ O# L) A0 V3 r
count=0;2 ?3 U' }& ?1 y2 Z7 ?! r
h=M;' q7 E) Q7 z5 X1 D! k
printf("依次退出的猴子: \n");
% c4 e5 u, X1 s3 Hwhile(count<M-1)
' r7 d  B: |* C/ M6 o3 W, r{i=0;2 q; {5 {) n- v8 [, H# U
while(i!=3)* z, w/ s" d" r! q4 r" T: Q+ i/ s
{ h=link[h].nextp;
) L# c! e& L5 Y. ~) V2 g# @   if(link[h].number)
/ B$ [+ ^* p9 n4 j! W7 R' H     i++;}# i- Q4 T: N* }! H8 P
/ ^! j+ a! B- c% e$ _
printf("%4d",link[h].number);
7 a- E0 @" A3 r$ p; Ylink[h].number=0;
( l! }8 k+ W6 l" ]+ Ycount++;
1 ?6 l" q& T* u5 a! [: g3 P6 k}, t2 I2 B/ s7 q

& _* _) Z* o  m  D7 F5 hprintf("\n大王是:");
$ @1 M* e1 x0 }/ I, p  for(i=1;i<=M;i++)
7 O; x. m! j/ g$ c3 v% Y  if(link[i].number)& z# ~1 S2 i) j0 R
    printf("%3d\n",link[i].number);, {: M# {1 Q5 B  C4 ~  m' f% l: Z
* B. [8 T9 J" y9 u* p. }6 X/ A+ x5 A
* j! J& H" G+ ]3 g
}
  g5 Q4 H4 T8 b- z4 L9 x7 O$ ?
第三种是普通方法for循环
: q' \3 F+ m  ?, }0 f0 @- K8 z
#include<stdio.h>
: C& @3 A2 q0 I" ^/ Kvoid main()
1 b: A$ Y; G# g  M. `; {{ int i,k,m,n,num[50],q,*p;
4 @4 {% a, U6 M    clrscr();
0 a% ]: ~& C1 L/ U7 l9 G5 }0 b" y7 W- @   printf("input number of person: n=");$ a- N- b9 D) L5 t- w
    scanf("%d",&n);
* }2 Z' k+ |& e! H" g5 T: }* _printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只5 Y4 X" C" \* [: l
    scanf("%d",&q);. R+ V$ R# n8 Y5 O$ k0 P' [" J* g
   p=num;
2 `% n1 j8 I, Y( p& U  for(i=0;i<n;i++)( U# Z% E# ]% V, `8 |
    *(p+i)=i+1;. a$ ^# A2 c4 D/ C
   i=0;4 o# Z) y$ }1 G/ Q
   k=0;
, v2 M$ x( l2 n. c8 k# I: o: e   m=0;9 T8 T, X, d( C
  while(m<n-1)
+ L( L1 G% E5 f4 C   {if(*(p+i)!=0) k++;
4 i. C% c( ~$ \5 F: Z) J     if(k==q)
  `1 X7 S" `# Y3 C$ a/ y7 y      { *(p+i)=0;
7 F4 S6 a- |& v7 e! w9 V' ]        k=0;
" v( {( D& U; v3 z        m++;/ I% F. S6 ~3 O; ^/ m1 e$ M) A
      }
3 e" ?! {3 Q! r) W7 w    i++;
0 L0 R$ ^- [" c2 Q: O    if(i==n)i=0;8 |7 }. M3 s, B7 K/ z) M5 B
   }5 v, X) P0 \1 N! R$ w7 Y) r! |
  while(*p==0)p++;
' U& M. l8 I9 T+ e+ O$ q  N    printf("The last one is NO:%d\n",*p);6 ^3 e7 z' t0 F: ?2 m" d- P6 }
     getch();
4 L* K1 I2 q$ O7 U. X+ h6 F. ]  s; H
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;' t" i! S! F2 O2 S3 ]9 P
namespace 又费马达又费电
7 Q" v  ~( ]. M6 t{0 l$ v. [) b0 \6 o1 c0 O
    class Program7 l. ^8 K" K- N$ C: O
    {8 j( X6 J# ^' K( A( X
        static void Main(string[] args)( y3 W5 l5 Q4 ^/ c" k
        {
+ M; K5 _7 O3 n% b7 S            int m, n;
# F9 Y1 T+ N. N' q2 R% Q            Console.WriteLine("请输入数组长度");9 Z8 U5 Q7 s( ]+ O4 a' L
            m = int.Parse(Console.ReadLine());//m为数组的大小) S& ^$ H+ `) c0 T% s+ X7 B. M
            Console.WriteLine("请输入要截取数字的大小");
9 j4 F! t5 i; m3 i1 z2 u! a            n = int.Parse(Console.ReadLine());( ?, s' X. A% E! X
            int [] numw=new int# q: ?& Z) Q# r1 Q" v5 s' f
- \$ S# z% t/ t/ g
&shy;&shy;&shy;;) q- `+ y! M0 W% H( g
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数1 a) i8 }1 `2 o: `# z7 s4 G4 \
            {3 ~7 n& x  i! f2 ^& s2 J2 |
                numw[j - 1] = j;/ w, ?  \6 p5 p) K$ a. C
            }
% A: v6 U) c5 |9 a            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!0 L: ]6 V4 u2 o  C; t
            while (d != m - 1)
8 h2 L) b, {/ S0 Q9 K3 p; O            {* g$ i3 H6 z+ ~" k0 `# ^
                if (i == m && d != m - 1)2 c5 Y5 v2 d7 {: j
                {
+ \$ |/ d9 W9 o/ I                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!0 f& F1 [: ~0 b: m4 y% }0 T1 f
                    continue;( n$ _) z% B& _9 |
                }  [: p2 O& a! P+ H
                else+ ?# B% w5 X/ d
                {! f6 I/ Y4 _9 e# b- P4 k+ c
                    if (numw[i] != 0)& A6 e  m- w5 w. ?1 R
                    {( \- h6 M! _7 z% O6 c
                        i++;
4 i. Z  E$ b0 D2 V+ g& E                        k++;
& J* l! [6 k6 ?# H7 o( a) c                        if (k == n)  V* ?, }# r& ]  {' A* Q; X
                        {
5 L/ r5 B7 }- h9 Z                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
8 a  z2 `& \/ L5 C                            k = 0;7 K) }/ n! r) C; F& F
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1" O- W' s7 O: {- P4 @
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);8 u5 l  w0 g' O1 U" o& J' I3 }( a
                        }
$ I8 Z5 {3 G9 W7 c* Z+ I                        else//输出暂时还没有改变数组元素的值' N8 m- z7 J, @& h, K% G7 E
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
$ K; W" b; |7 ^- Q% a                    }
4 O+ U; {- g, c0 L! ~9 ~( _6 p2 x6 Y                    else
$ f7 t* H( a+ O                        i++;//数组元素为0,直接跳过,不计数。。。: R0 A! r4 E, G2 E  U$ ~! u) D; `
                }$ q/ ~+ j% u! o/ h
+ }3 P+ ]6 G) b
) J, y; F) I: e$ t( s
            }//结束while循环5 N! u0 l& C0 {5 H- Y
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
, N/ H; }$ c; g5 V8 @6 Z0 K           
8 M9 y4 K  w8 d2 E9 d                if (numw[i] != 0)
) V" H! P1 W( w1 E                    Console.WriteLine(numw[i]);
- \, s" ?' ?2 l           + i! `0 X- u) h3 D4 [  V  s
            Console.ReadLine();
7 g& ]: m. k" b9 Q- F4 w: L3 U        }. r1 @3 A9 @! M) _; J1 S
    }
5 w1 O$ _% n6 M* |4 X1 r}
# P* ?& c8 B; {( H/ i: 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, 2025-5-21 22:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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