鱼C论坛

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

猴子问题

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

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

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

x
大家好!
8 t8 h) y+ J$ {; n$ _这几天我在忙着编一个问题,我用了一种方法编出来!
/ ^3 x4 w% R' L  ^( |0 n但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
% K' k9 X# Y& H  J/ P1 q* {% P3 B注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
1 J+ `2 K- B' C" q* d
0 m0 z5 f8 J' ?) @: x2 g) U+ l) w4 m% _+ v
                            题目
8 I  v# P" k( E* V/ R$ K: t; e0 _: y山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
4 l/ k8 m0 k$ g6 q' y5 w第一种方法:利用循环链表2 I8 i/ u  Z; |- ?! l% r
#include<stdio.h>
- t) s, L9 H8 Q, Q5 k#include<malloc.h>" a) Y6 H+ l( u$ S- l
#define M 8            //共有8只猴子: P. F( G% q1 Q3 `% V) P. A, i0 K
#define N 3            //数到3只时退出第三只
9 X: d% D6 u. N; |; d/ v3 Otypedef struct monkey
, X" G+ B' C% p5 t2 @2 R3 L{int number;
( G" }* |* m  J9 I& I; G0 [. `, eint flag;2 E$ L+ V& ^- e) Q  y3 K! a
struct monkey* next;
8 o0 w) o$ {9 _3 A, F; D% i8 D7 w# M( ~}MONKEY;9 h9 R' K* ]- I3 f0 @8 i+ _
main()& z$ C5 m. n% v* k
{ MONKEY *head=NULL,*p,*s;8 ]. Z* U7 H" B
  int i,sum=0,count=0;4 e6 ?9 T4 d0 i. G
  clrscr();              //清屏
. R, U3 @& U  f) Z  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存' _* ~4 l$ _- Y; \1 G. n( \; s
  p->number=1;p->flag=1;
; q0 ^; b9 _: o6 C  p->next=head;6 \0 H. `1 v% U* j, I" D0 I8 v
  head=p;+ B! H- G$ Y" Q( f0 w' ~
  for(i=2;i<=M;i++)6 Z1 F! e7 w0 g/ U
    { s=(MONKEY *)malloc(sizeof(MONKEY));
" U8 [/ b2 Z7 c( k: M     s->number=i;s->flag=1;
, n" a& j5 I. r) n4 Z. `     s->next=head;+ I! V6 c5 P6 G1 K  R! V) a" @6 d( Y
     p->next=s;p=p->next;  c* ?( X# r; d# Z+ {
    }
% `/ W% W0 i6 l& J! u    p=head;
) G) i* T6 t7 `) G' _2 G. P% F   for(;;)
( U' s4 w" b; P    {if(p->flag==1)5 N- _3 s+ V- l1 u, G1 y, N
       count++;! V  E0 _0 N& D6 [* B5 F/ O! g6 d
     if(count==N)
9 E$ L0 B: |8 z* F! f$ t        {p->flag=0;
4 a* _+ l/ q/ e) V0 ~         count=0;
0 l: s4 n% n' I  t         sum++;}8 F' w2 S, f) l( X
     if(sum==M-1)
) Q+ i- r( p. L4 L$ ?$ T# r        break;& a( W- q" B9 V7 r% L/ ?9 D
     p=p->next;
' Q  i5 @* w0 ~" \# M9 E0 Z    }
3 m% r5 L# p8 n' E, j    p=
# h) a0 o2 w- G7 x    head;6 r! u) l  t; l5 D- P$ N
    for(i=1;i<=M;i++)3 T& h% r0 R) z
    { if(p->flag==1)- j9 T5 `( t$ M. A" m/ q6 L
        printf("\t%d",p->number);# P0 F# Q9 E. f' d
      p=p->next;# N2 ?. B: w* X
    }  s( C7 a1 q' X6 j
6 A" X& F+ B8 ]8 o' f

  P# k8 k; l* g% h# D' R
% y2 b, o0 l1 \  [% }}

4 `& _  i: I2 V$ I- X' I2 B/ _第二种方法:数组1 {7 [. a( @( R5 W, T/ e" R8 s) E
#include<stdio.h>
( _: b% W# |! m- n#define M 8
7 }) f" u; @) I1 ?8 j# i& Wstruct monkey
4 }0 M) ?5 X3 Q# p6 M" c9 o4 d/ f" E{int number;
% _3 F6 u5 L# G# y) x; Z# N# pint nextp;
' T0 f" S- {$ c0 {  k2 @}link[M+1];
3 i1 l0 r" a) [# }. K% D
- D, A& a: D; h( Ivoid main()
. X3 e! n/ B; ^{int i,count,h;
) H1 t5 e2 N+ t. N8 R( A0 |for(i=1;i<=M;i++)
0 d# S! J/ M) d2 K8 u3 R{  if(i==M): U9 W0 s$ P7 u& {$ i+ f( x
   link[i].nextp=1;
# O% C6 t' }$ s. y   else
; c+ D: m- Q1 h6 D7 y! `1 t3 W   link[i].nextp=i+1;
( L8 e5 u4 e1 \$ p9 o* S  I' z  link[i].number=i;* A6 e4 z4 G0 N( p
}
3 P% a2 C, i! K6 v/ ?printf("\n");9 K9 F) b* L4 j5 }: h+ n6 Y$ ~
count=0;
* ~( Q7 m6 N6 A# f! @h=M;0 Y! R6 N& l$ |6 q) @0 p# w
printf("依次退出的猴子: \n");! h; C8 K' C$ B
while(count<M-1)1 y' b9 C' [; m7 [9 l
{i=0;
  J1 i- D# \" cwhile(i!=3)
+ L1 _1 d  m7 \. g: Y- f) h- Y$ J{ h=link[h].nextp;% d9 D( D( l. U9 ^
   if(link[h].number)
$ H1 j4 d. x' v/ K. [     i++;}
* ~3 [3 R5 j. K: M! k4 o1 A& ^, W0 q2 k! T' ^4 J
printf("%4d",link[h].number);
# Q. f# o% c0 e' l. Olink[h].number=0;
# q4 `$ c+ |( U+ [count++;
* _  }- k8 W4 z( N4 t}8 `! e! z% ~5 y

" ~  ]8 j" L7 [! T% Jprintf("\n大王是:");
: \& [2 v' Y6 {6 Q- x# O4 I" @  for(i=1;i<=M;i++)5 J& a$ L1 K6 }: ?
  if(link[i].number)1 ]9 v( w7 h; _7 m- m
    printf("%3d\n",link[i].number);8 ]0 u3 ^' l" j9 b1 a' y

, J4 D. G! z; w) [5 D* E& Z/ E; m# @: l, g) [7 r
}

! n$ d" P2 |% m' v5 n! p0 s第三种是普通方法for循环

1 \- v2 n. n3 u( K! w#include<stdio.h>- a1 V" w4 o) c1 R3 ^" ^4 E; V2 ^
void main()
/ P' e5 {1 X# f- C0 b- x2 g: D{ int i,k,m,n,num[50],q,*p;9 v- |( G8 I4 G
    clrscr();
( V( j% i2 L+ E6 c. c   printf("input number of person: n=");
, c8 E/ E7 b7 v5 K# B    scanf("%d",&n);* p* h7 m: j0 {  B' E. z- p; k. F3 F
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只5 G0 N( d2 P9 M. u$ q
    scanf("%d",&q);
' h9 Y9 r+ C# f* P7 c   p=num;6 s+ |* a) F& F
  for(i=0;i<n;i++)
4 x* p% k5 ^$ y" s- J' X  K    *(p+i)=i+1;( _$ }2 C' ^8 Z8 [7 d' N
   i=0;0 `* V7 D8 |( m
   k=0;
% N' I& X+ u* b/ S   m=0;
# C0 M$ M, i$ O  while(m<n-1)9 U3 v: @8 J* \# f+ b9 u' H+ o
   {if(*(p+i)!=0) k++;3 G, S  ?! j% b$ r7 U7 ~
     if(k==q)
* Z/ q! B9 _$ s2 B# Z- Y6 W      { *(p+i)=0;
+ H/ j3 N  p% V. S* q        k=0;
) k. m# q, f# K0 d* u        m++;( k, I1 Y$ I) X5 H/ c2 I
      }9 w, [% @3 Q! s% g. w3 q9 `5 r7 w
    i++;
2 ]! P/ P3 u- c) N    if(i==n)i=0;5 `2 ^1 K) W8 o* }
   }
4 ]6 o' P# b5 r. C4 `/ V  while(*p==0)p++;( g% U! T/ h3 g/ `+ Y( d, P
    printf("The last one is NO:%d\n",*p);, T; R. |9 M5 [1 [
     getch();
$ ^" K: a7 H4 |. Q! @; B) @: m8 n5 f3 Q& {
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;' Y+ ^/ M: Q7 d4 g: i
namespace 又费马达又费电) Y5 {& f5 p* m5 F& D) P
{
$ C, k- p$ _; P% R( U% k  t: R    class Program/ Y6 q$ o0 ?& A/ ?4 k& Q
    {2 |( L' j4 G& S6 z
        static void Main(string[] args)1 `+ K- h4 b5 k, k$ J' D
        {
; T7 M+ c! a  l6 m% r. F            int m, n;! K" M/ j8 K9 a6 }* R9 A9 W
            Console.WriteLine("请输入数组长度");
6 R& D& Q  Q; T" c            m = int.Parse(Console.ReadLine());//m为数组的大小" ~$ `& H: c. e- x
            Console.WriteLine("请输入要截取数字的大小");' F4 K$ {  Z% F% S& I  J: i( ~
            n = int.Parse(Console.ReadLine());- C' R, x6 Y9 v/ ~, ]* V
            int [] numw=new int
1 u2 Q: R$ I! g" Y* n) ]( ^) l1 I+ L* b& X
&shy;&shy;&shy;;4 s( K  X# ^! a- M
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
5 Y0 `3 ~8 v( x$ ]3 `2 Q/ m            {
# |. c) K- H* B' l1 L/ X                numw[j - 1] = j;
  |' Q0 C( ~) e            }
' x7 q; B" r: {5 L            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
) x2 T  p2 v0 g- V* e            while (d != m - 1)2 s5 e, c1 U: a" s
            {+ u7 P/ U% l7 h, {" l) \6 V  k
                if (i == m && d != m - 1)6 Y; T- Y2 V) ]) p2 D
                {
$ g" r: F, a# e, q6 q                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
0 y" I7 m/ D: @  ?8 |. b                    continue;6 {& {' c# e+ i5 m; E
                }+ m/ K% O" z6 r% s; f. G
                else/ u' F3 m) T3 B4 M7 j" e. w
                {, h' M2 s0 K/ F& O  d
                    if (numw[i] != 0)
- o  Z5 j) r, z! _3 A- ?- x                    {6 t; N% Y8 A, ?, H& m0 \
                        i++;
* W; g0 T$ ]+ J: R6 r* V5 [* X1 I4 X                        k++;  b6 s9 Q% C; |+ I
                        if (k == n)
" l, G1 ~7 r5 z5 D' s8 d! ^. Q                        {$ [5 Q$ m; m% \; ~' H" K  o) `
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
: P& y) L3 o1 L# o                            k = 0;' |6 D1 o; K7 j5 R' j! V3 M. |6 n
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
1 u$ `, X2 J' a5 x( T                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
/ s3 [3 Z' z1 z                        }
) u& z# \: t" s0 [! O" ?/ v1 _                        else//输出暂时还没有改变数组元素的值
9 T+ P; F; c& J7 N! @: ^9 l. \  u                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
1 N7 S' X' ~0 k" a9 e                    }( k+ Y% x1 y: t/ S: w- {4 C, X/ I
                    else
7 G# c8 o( ]; i; f: T) O                        i++;//数组元素为0,直接跳过,不计数。。。
2 r6 [. p' H: B                }
) b: Z/ m) X5 V4 T
6 A$ {4 V& D: z4 ^
" z- t- |/ r! a" \+ A& x            }//结束while循环
$ N( R+ @- a' f( o8 {- U% X            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
# I" Z. R* p1 v+ l5 d6 e) m2 k             I$ n" S+ d  f2 t* f
                if (numw[i] != 0)
+ J7 F. W0 l! e; y                    Console.WriteLine(numw[i]);. g  I$ n. ~7 k$ @' \; H
           
8 r/ Q& M7 j7 F$ Y$ g  n# f1 A            Console.ReadLine();
/ u* W; y6 N4 f  |; L$ Y        }
% I  \1 e* g! B/ d$ P    }5 n  s$ q  q* o& ^5 d1 W- |3 M) r- p
}# t- `7 ]% W! X+ L& @  u
小甲鱼最新课程 -> 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-6-14 09:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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