鱼C论坛

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

猴子问题

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

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

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

x
大家好!
! S: P3 x& a0 F5 N这几天我在忙着编一个问题,我用了一种方法编出来!% G' g/ `; y3 {$ Z. z" O
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
' x. S1 W# |, ]' D+ g0 i8 {注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 & l0 S0 H! g: ^' W  _. h

5 N& ^$ |) r- _$ i6 u; J% K5 h5 @" O  f+ j- S
                            题目
, N0 k0 `1 G2 ~' w2 m/ c) \山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
( B( X( z2 m" K, N第一种方法:利用循环链表
* g8 R$ x. {. z#include<stdio.h>
. V1 l- `2 i/ J) i* v+ V#include<malloc.h>
" J, ?- V$ Y+ P, `0 }#define M 8            //共有8只猴子; j2 J  C  k: P/ X
#define N 3            //数到3只时退出第三只
2 V7 n0 F' @' V, T" n% z) R1 Ztypedef struct monkey
1 g+ o, X) X+ h) w& L{int number;4 Q8 L( _6 V6 D% j; \! R- f
int flag;
) t% @9 d6 @. B( q+ i9 fstruct monkey* next;
' {2 a  R$ e7 o% V: Q- W9 R9 w}MONKEY;
6 ^+ I: q- D0 W/ X+ |5 y4 ?  Imain(); x& B: m9 K) g. I
{ MONKEY *head=NULL,*p,*s;! O* h; V* Z% H( d
  int i,sum=0,count=0;
2 q; Z) s6 r. @2 t% q  clrscr();              //清屏
7 Z( J1 j, g0 \/ E& r. ~; O  Z  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存7 H5 b8 O) X8 U3 L
  p->number=1;p->flag=1;  ^0 L& p2 Y# Q
  p->next=head;
) s/ ?  I8 v: R) r  head=p;" F- T2 w1 n+ E2 G7 w. u. l- l
  for(i=2;i<=M;i++)
: @$ b6 @, u2 D) q) [% n/ I    { s=(MONKEY *)malloc(sizeof(MONKEY));: m0 m+ _9 {# m$ d
     s->number=i;s->flag=1;
- w: X+ q' k/ w# m7 `, ~     s->next=head;
; W) f; W2 d2 S1 J2 Z     p->next=s;p=p->next;
  a+ q; O; y7 @$ a6 Q+ j  r% [. h    }
4 @1 M, I, V' L3 ~    p=head;) _5 R6 N: M9 p' }4 S/ d
   for(;;)
( M# h- P$ \& ?' [" m4 W+ J6 [    {if(p->flag==1)
+ [; M2 Z  x5 i1 R       count++;: K; u* \* h) `( b! I+ w& V* Q
     if(count==N)* y6 F3 @- |% r' y: q7 z
        {p->flag=0;
- a8 C8 K8 J7 L$ g( |# _9 d         count=0;
5 \% b- ^; r- t* b0 i4 b, X$ ]  M         sum++;}
1 x# X1 M0 K4 ~  _     if(sum==M-1); t8 g9 e2 u4 I/ v- X
        break;
6 k6 t& F3 F' R$ Q$ F7 d" L     p=p->next;
! t& P/ l* z" o4 B; T; O" m: @    }
! B/ O  V6 a$ z5 Q- t' R% }    p=+ V2 Q4 f, O9 G& g0 j# j
    head;
. v! m4 O  `# y# r    for(i=1;i<=M;i++)$ r7 v# I9 ^4 r
    { if(p->flag==1)
0 q. `6 U# ~. @: x0 C5 e9 l+ H        printf("\t%d",p->number);
. X7 _# I2 K8 i; t: t! k& Q0 m. d7 v      p=p->next;9 R7 o: w) z( l, l
    }  _. Q' p. P; L4 t
0 w% E5 U& l9 N' h. O* q# _7 O
( Q- w: G# Y: A% @5 E
+ F0 o& Z. c/ f- P) I
}

) H- p+ d9 t* t+ Y8 b第二种方法:数组; P5 ?7 ?7 n# v( v
#include<stdio.h>
" A2 r! I  [. d% y#define M 87 N, t& e2 L% C' G8 Z; V; i
struct monkey0 R/ y% d6 P9 Q
{int number;
$ y) o! }% J+ [int nextp;! n5 V, M; Z8 l9 a$ Z' W  V
}link[M+1];
, V% I, [; z+ ?
( G" e( |. d3 B: z5 \; l; Z1 qvoid main()
2 C( r# i7 ~! H2 r! {3 k# {- ~, A{int i,count,h;
/ P7 b) ^) z( i$ Sfor(i=1;i<=M;i++)
- a; N+ l8 H; \* G{  if(i==M)
5 q( D+ A8 B& Z1 O3 {0 e% J   link[i].nextp=1;
5 k& K9 F$ k+ P  b   else1 _2 B. T0 n0 B5 m! V# G
   link[i].nextp=i+1;! r5 I' C3 Y. E' }
  link[i].number=i;2 w( R# c  I$ n$ G+ ]! j7 G
}
4 A4 L4 @4 E7 K6 T0 hprintf("\n");, U0 p7 }/ l! m8 N+ m, x7 D, I7 l
count=0;
6 Y  L0 q0 d# t) H- _* Xh=M;) Z9 l; S0 X- |& Y8 [; ]
printf("依次退出的猴子: \n");
+ V7 e" W: U, P( D* f: ywhile(count<M-1)
0 @0 g& `9 B) R& O{i=0;
, o, n% e/ d/ }while(i!=3)
0 S2 `* _3 ~9 U{ h=link[h].nextp;5 h' J; R. U! m7 X: Z
   if(link[h].number). P. m# z: U- z# e4 b% k; H
     i++;}
  N0 w, `( c, j. A# s' U* E
, O/ {+ L8 F& F$ p  i7 o% g5 `, pprintf("%4d",link[h].number);
3 c" D8 D/ N# Xlink[h].number=0;3 i: _( a5 n& D8 ~
count++;
, v' ~" N# F. Q! k}
  V$ }; x6 H( r' J7 V  f
9 M) B: k/ y4 ]printf("\n大王是:");" c$ x" C( P! V& S" R/ G) X
  for(i=1;i<=M;i++)
5 _1 S7 P3 S3 E( s1 c5 {, Y' e  if(link[i].number)# `. z: t; t* V/ e
    printf("%3d\n",link[i].number);
8 E2 Y4 |$ k) p8 P
- Q$ ?# D! Q$ z* R: y& Z9 e  @6 i
}

  t8 _3 A. v" p8 C: _( }第三种是普通方法for循环

8 `  V. _. v/ @9 [. @! X#include<stdio.h>
7 l5 w% j# h' p9 I/ \' tvoid main()+ H: f8 K. H7 `3 j, ?
{ int i,k,m,n,num[50],q,*p;# |* Z- d% v" J  J
    clrscr();# A, D" }( n' X, N
   printf("input number of person: n=");  ~6 a* O3 `$ E- s) h
    scanf("%d",&n);
2 y* W0 Z* s# Hprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
+ S/ g5 Z6 b, A2 g, {0 |  u    scanf("%d",&q);* C' i, J( L" Q6 ^
   p=num;
) ~/ K% D9 v% h$ Y  for(i=0;i<n;i++), `: U3 S1 N1 l
    *(p+i)=i+1;
, U4 r: J) D" B9 y0 h   i=0;
+ n- O+ c/ C) i; s: i   k=0;
! u0 ~0 F0 ?" u1 h2 L   m=0;& \* W) a' S; ^4 K3 g
  while(m<n-1)
) h: K0 m4 Y; I2 ~. ?- d5 [  q   {if(*(p+i)!=0) k++;# k- e- \/ E. t' \
     if(k==q)0 d8 G$ N7 @1 z' y
      { *(p+i)=0;, u4 V8 }( ]) Q& R3 _7 f2 L! U
        k=0;& d$ ?/ b  S+ e4 a5 U9 {
        m++;
& Z. n) L/ h- s2 I2 D      }" j7 k4 H% `6 a* s) y: z6 J' f
    i++;
3 l& v# ~) r1 @; G' P$ J    if(i==n)i=0;
) j' I- d& i0 g; }   }
- ~/ w# j7 I% A8 o  while(*p==0)p++;
. Z0 Y( E8 e/ v& W1 F6 k/ a$ C  [" ^3 K    printf("The last one is NO:%d\n",*p);. a9 ~" S2 f; |" [. U5 k
     getch();0 X1 y2 P: \  D8 C1 m; N" r

& v5 ]! G# C6 P7 h0 k& V}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
6 O- N! ]( l- \) Znamespace 又费马达又费电
5 D6 k& L4 B3 i' g5 X{
1 e- i/ Q- |/ ~    class Program. p+ T" P# F% t) Y7 V; X7 o: o; \
    {
/ p# c: }6 E' t' W* B  R        static void Main(string[] args)$ {- V0 D1 j3 S; G2 P( _
        {
- _- ]) w  A& K* w" W. T            int m, n;
) u5 _) e. r0 h" Q9 d5 r            Console.WriteLine("请输入数组长度");
' e' j7 Q7 P0 s3 H' ]            m = int.Parse(Console.ReadLine());//m为数组的大小
+ k: _* h: v2 z- Z* T            Console.WriteLine("请输入要截取数字的大小");% ]" ~% ~! h$ y- j  ]2 E  `2 v% ^
            n = int.Parse(Console.ReadLine());6 m% F; G' L3 H
            int [] numw=new int; D; _0 t, r1 Q* y5 O) h
' n. S. O# e/ a4 B$ @
&shy;&shy;&shy;;4 D2 X% R1 e$ h
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
/ P! b/ M4 U3 q' t0 |4 ^            {# d9 X1 D; u0 a: |
                numw[j - 1] = j;
, L- d$ M/ f1 Q: }2 A  W            }
5 W* X/ `6 U& Z) u; g& e) ?  R            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!0 I5 x6 h) l* Q  ~
            while (d != m - 1): e, k" n* u) d. l
            {
+ B2 I; V4 e4 A; W) z3 X7 g                if (i == m && d != m - 1)
* E1 ]" d: \' l) ]                {  ]. v4 W- G' r! W9 i/ x7 I
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!: x  l/ S* l0 J- P) i2 p1 t
                    continue;& ~( S) M: @  h& d; K
                }
9 |- a& w7 l2 J% h1 S) n# r                else
* b8 D' C# s# }) Q0 {/ a                {0 k" o% `  g/ b
                    if (numw[i] != 0)
/ t9 C, R2 B- v4 M                    {( s8 h4 Y, B; M0 f7 n' W7 l& W! o
                        i++;
9 A6 \) v, n$ c2 A                        k++;1 ~( M8 r, U: `/ p: ?6 v* o% a# v
                        if (k == n)
  L( I# S, j: N' n* g9 o' c                        {
3 j* W* I# @$ V. C                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
% F6 ?" r0 w5 ]5 F$ b                            k = 0;
( q* f" i6 q% Y  Z. W' m( I              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1; {3 n9 \' s3 P9 a( [! `
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);0 _/ g7 U4 h8 t/ j8 ~
                        }( s/ R, `: t: d
                        else//输出暂时还没有改变数组元素的值
+ \* Q+ G  H; T. c4 T7 D                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);, n. S1 T  x. e; Q- i' R( t
                    }
/ |1 R& J* R( G- k  Z2 x                    else
% E6 h  Y: b2 W/ Y) z+ F                        i++;//数组元素为0,直接跳过,不计数。。。, p7 f1 ]' ]3 z& T0 c
                }6 ]/ |/ v8 Z. V( o* t' ^" u
! z, g# r& ]6 ]' a1 l! D; q
, q1 m0 U( @; _9 V, B/ I
            }//结束while循环* |( S$ ]  i" ~
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦! x" O1 u' P0 b3 u
           
' z7 \1 C; G) v! z                if (numw[i] != 0)/ i+ B$ m: T% c
                    Console.WriteLine(numw[i]);1 D# O5 W# Z( {# a
           
/ y; I; O/ D* @            Console.ReadLine();
5 J* }0 K& [& \, |2 Q" b$ f        }
% Z/ e: |7 r/ B2 P6 r    }/ M8 j' w0 {0 C& W0 T9 }, ^
}) v% S/ e2 A: a1 d3 O9 U- O
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 00:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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