鱼C论坛

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

猴子问题

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

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

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

x
大家好!3 y3 l0 u/ U8 q- I$ w
这几天我在忙着编一个问题,我用了一种方法编出来!' g. o  w3 _/ b  _8 y
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
7 ~1 n$ ^" G4 U" J7 n9 _0 G' P8 H注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 4 o/ A* y6 k6 K* k- Q% V
& @7 d" T% X. q  W

- A2 |0 ]6 p/ M1 H8 `, l" C! A
                            题目
: f2 {) W3 ^. C2 [1 c' M/ B) b3 e山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。& k$ L: ?1 P0 t/ k* E  `
第一种方法:利用循环链表
- w( j( v2 Q# L7 j. \6 Z- P#include<stdio.h>
5 r, u2 ^: u$ R4 d( ^#include<malloc.h>, ~( ^* b0 V; k
#define M 8            //共有8只猴子' C3 @, P$ w) x
#define N 3            //数到3只时退出第三只
! D  I& b- `' x# z: h" b0 ?3 T/ G& atypedef struct monkey
4 J6 ~2 M, Y% I2 s{int number;
6 j" y% e( m  n7 ^int flag;
3 G; O0 _5 K7 [# astruct monkey* next;
+ Z7 `6 u0 p3 m1 d}MONKEY;$ Y! V/ _, G3 f( O1 F# C
main()5 m2 `; S1 V  `( Q
{ MONKEY *head=NULL,*p,*s;
$ }4 |+ \6 ?/ m9 w  int i,sum=0,count=0;- d' `, o5 R  e* f5 |: [+ J4 F
  clrscr();              //清屏) t8 c  _. @# ]" S
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存: E+ d# w) u, @" g; Q( x, C9 q, m- v
  p->number=1;p->flag=1;* p4 C2 g% j( C3 z8 I! ^6 D$ T$ M
  p->next=head;
4 j& g, }# c1 j9 _: M  head=p;
  e" i: N& F+ `& X6 y* V  for(i=2;i<=M;i++)
+ A, D! L- Y; B% F    { s=(MONKEY *)malloc(sizeof(MONKEY));* N" i$ s) {) i" C9 B$ j1 s/ Y9 d$ X
     s->number=i;s->flag=1;
! \2 O( R# I! {2 e+ K! W     s->next=head;! m. Y4 O8 j: f: G0 d4 c' }9 _8 z1 \
     p->next=s;p=p->next;: Z& g" h, b! ~0 z( L
    }: j/ }! l) _9 i* M# e3 J
    p=head;
$ X) P$ g9 G4 K* J6 a& o4 ^6 Y   for(;;)
. t! b- n8 |/ q2 S    {if(p->flag==1)
$ _, f" y/ M3 J( v$ U, O% w' C       count++;9 d! a& ]0 @* X. a
     if(count==N)
7 g. F) V; q! h  _5 v1 y        {p->flag=0;  P/ x3 _6 ?2 `9 Z
         count=0;
+ O3 e$ P6 [9 r% n         sum++;}
1 T" {* ~6 [! ~7 S0 C     if(sum==M-1)
" Z4 L: p  S/ }8 l        break;+ {7 n5 \$ r* ^; M! y; F' f7 s( n0 i
     p=p->next;( Q/ y4 V. s9 j* M* F
    }
7 n4 E5 @# H+ W4 m3 P    p=
* o1 W2 _, _7 z9 {" x    head;! B) `( J3 L" Z1 a+ ]7 \# d- W
    for(i=1;i<=M;i++)
% L+ s1 S2 T9 J; t    { if(p->flag==1)3 q2 w) h( c2 J: ~0 f1 O" @0 `
        printf("\t%d",p->number);
0 \' X) C& L; J5 l      p=p->next;9 |% {" f" ~# R
    }- p9 B! {! g/ L7 r: k
2 n3 A+ c% x) Y0 \

0 \4 ]5 h! K* X; f% p/ D- `
1 a# c$ \* u) l}
* U5 H* ]& z8 z' W
第二种方法:数组( V/ t; n: _9 ~$ {; q/ v6 @2 v) o
#include<stdio.h>
  M# r0 i9 ?3 p0 V' D$ }4 u4 H  M#define M 8! B+ t& a+ I% _" r
struct monkey
: \, b9 w' ?" k1 T# v. v9 V{int number;
2 j3 ?7 `* l. f, [# l1 tint nextp;
' h/ z: F; Q" z2 d, X}link[M+1];
+ M3 g7 X# V3 \2 j
$ M3 z' P8 F! A' p/ {9 z0 cvoid main()7 R* k+ {7 W( D8 X( Y
{int i,count,h;
: c$ L, y. R/ d3 V& T$ yfor(i=1;i<=M;i++)" j/ r7 I9 T/ ?% d0 Y& W
{  if(i==M)$ y0 J& M. J& w, F/ _' p! V
   link.nextp=1;- q$ r$ f; Y. x/ u3 h
   else, s7 J$ _! ^+ S; p: z  v( s/ p
   link.nextp=i+1;
9 c; |* E+ |" [4 I- W5 F6 G  ^# \  link.number=i;0 w( ]6 A& D4 W7 A+ T* @# f
}. S% G" V! K% a, l1 Z& B! y$ s" t
printf("\n");' ?& |, W! p0 p, ^& h( c1 C
count=0;, n8 b! T# `4 t* n. T; C8 w
h=M;4 g) `& M* g% @' ?% t8 S
printf("依次退出的猴子: \n");4 F! Z7 w: _& u* U# i. N
while(count<M-1)+ O$ z$ J3 C4 |" F2 a
{i=0;
! R, N- r+ J9 `+ K4 uwhile(i!=3)* m2 B( m) r7 b- j% c: ], s+ F# r
{ h=link[h].nextp;
8 `% d, P& r. S   if(link[h].number)6 @/ M1 A& j# F# W- [( b5 q7 F
     i++;}7 j/ n& ~, g) D2 r
+ n0 y/ }& {* W
printf("%4d",link[h].number);+ g5 w& j1 E  q+ T, S; K
link[h].number=0;
: D/ [0 A7 V9 T* z1 K. ?count++;
2 O$ d+ Q& Y, M0 x6 ?3 u3 F}( [1 i( n5 ~% E$ N/ p% o! P; n

; o) R! [/ y# t, O+ ?' E/ N+ Mprintf("\n大王是:");( T" f) l% D3 e
  for(i=1;i<=M;i++)1 x1 e' p- G2 D8 Z5 z' ~9 P/ \  {7 }
  if(link.number)- H" u, Q7 I' P' C6 V0 t
    printf("%3d\n",link.number);
3 u& L6 r: q+ K- Y/ |, a4 o/ i3 t& C7 |- t$ r4 k% o

# D2 {/ F( D2 v0 }# Y& m}

6 A  K& T( E/ A9 K9 {3 a+ ~1 H' d第三种是普通方法for循环

1 {& ^8 f" J' J$ r#include<stdio.h>
( m& J. @# {" }# uvoid main()! B- E) L9 g6 `. g0 G$ L5 v
{ int i,k,m,n,num[50],q,*p;
. T) s; C5 M* w7 J0 d    clrscr();* d% o5 q2 D5 Q1 i' D& O1 I+ Y
   printf("input number of person: n=");
% N  c; d! G( C* D( r    scanf("%d",&n);
* g- |5 k/ E& \- ^* \printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只* Z9 M) ^7 a1 A, l; e  e
    scanf("%d",&q);8 C0 e  ?2 g$ e9 z
   p=num;
  N  f+ H. g) J: S  for(i=0;i<n;i++)
4 T5 E+ G/ V  Z& v% V    *(p+i)=i+1;
3 t) P+ G% j+ K3 }   i=0;0 i( i6 m% c( Y) V
   k=0;9 \+ p; t  }7 W3 f% f% v
   m=0;
& }) W& e/ u  y5 [! `5 o1 C5 C  while(m<n-1)- H" \( m! a! M6 g
   {if(*(p+i)!=0) k++;
0 {  J4 s' G8 _1 q     if(k==q)
2 l; ^: w5 @9 S2 z5 M9 w      { *(p+i)=0;
, M- n% f; U/ F" s6 M1 ^; G9 r6 o  z/ e        k=0;
8 |+ p7 e& E5 p( t# k! ~4 O        m++;
# u5 T' I& W! d* h: o      }
* ~# P: e: [3 p6 g    i++;
3 v+ w4 R& K8 A* B    if(i==n)i=0;
' H+ k6 I/ h, A: ~5 b# G   }: u: m+ l! k) z/ x4 ~% p
  while(*p==0)p++;
! Y9 X# f- p6 g$ ?: U1 C6 Q) D. q    printf("The last one is NO:%d\n",*p);! ]4 a  B$ P) j. ]9 ~7 A
     getch();
  ?! b2 S" C! y( S  H5 n: f9 J9 Y9 ]$ {( w$ o2 t* V  u+ T
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;; O/ b1 Q9 `; E' z
namespace 又费马达又费电
  x( {6 i8 Q1 n; _& F{) y; V5 M. v  b3 p& @: }
    class Program5 S: X0 H. B- ]' _, [
    {
% Y$ M. ^( J% l7 x" Z) }        static void Main(string[] args)8 I* K( W7 W, o7 r0 h
        {5 o/ p: j' z- F: G7 N
            int m, n;& \! P+ B( K' t
            Console.WriteLine("请输入数组长度");( k$ V9 O# a" ?  B' R: h
            m = int.Parse(Console.ReadLine());//m为数组的大小0 M% V4 q: l" U3 g% V* T& G
            Console.WriteLine("请输入要截取数字的大小");: Y# P9 W) e7 L( X  B( @  b
            n = int.Parse(Console.ReadLine());9 `& F- ~' N1 x" r) ^
            int [] numw=new int+ P: W; m5 |5 x

5 {% q; T/ g( B( @) c&shy;&shy;&shy;;# \' E; y2 Z9 i* T) t, R8 n
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数+ U5 \4 C- y/ n0 d. b7 O
            {# Q* r6 l5 ?/ B% B. b/ q
                numw[j - 1] = j;$ F7 S+ L$ ]2 i7 w, Y0 a3 g" [: ?
            }
! _9 F* P1 z' Q5 h5 P) f  Q* |; J            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!7 j. L! u; H: b/ T, b3 `5 a
            while (d != m - 1)
, Q4 e% [) l( z+ Q7 ^& ~, t            {
6 E9 ?, F8 z  \                if (i == m && d != m - 1)
  F8 K6 Y$ b7 T  ~& y8 F                {
! o. K" g+ r& J1 w! e6 b- D; G" {0 f5 i                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
; U9 o  ~% t# `( M. j3 f9 z                    continue;
, @& L% y" j$ I; p" n) {+ _                }7 G" R$ ^1 n# [3 S8 k9 K0 F4 W
                else
, ^9 p$ u, H) o6 V' T                {
; W; K9 W/ ]! O                    if (numw[i] != 0)( [$ f) l$ d# I1 m. Z
                    {2 Z. r, L  b& D- ^9 ^
                        i++;" A6 S4 d/ A. p* ^) |
                        k++;
% H6 z$ v9 G$ ~/ I9 S: v) L( d8 q                        if (k == n)1 \: {: o6 w: V; R) D. g
                        {
' Y+ O% }9 e* k" C- E/ P0 N9 k2 w( ~                            numw[i - 1] = 0;//把在n位置数组元素的值改变了0 b$ q+ W* K$ W/ Z3 u9 Q
                            k = 0;( O( \/ V( s) H+ V
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1& V% }2 l! t/ N3 D: @
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);6 x* t' h: f/ q9 k& y
                        }
( J" ~6 e" Y$ n/ ]* n6 J7 \                        else//输出暂时还没有改变数组元素的值
; ^. b6 _% D1 Y                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);/ T4 K" k9 I! ?# B; W
                    }0 O' i5 H  S7 e& {/ w4 b2 t' L! Q
                    else3 k4 v4 F7 S' a9 ]$ _; ]
                        i++;//数组元素为0,直接跳过,不计数。。。4 c8 K- J2 p" G7 C) {1 t
                }
9 @4 \, O" E0 y' u
$ m  _7 D! [' N9 e$ e6 T. B
) y3 [, b+ v. P* R4 E0 C# u5 K: v1 W            }//结束while循环( Y1 b! }( @& L
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦2 U( `. E- l# {8 J8 |; F0 R- ^6 K
           
* Q+ Q7 o- {) q: X                if (numw[i] != 0)
4 ~% S8 X% L! g% n! c- E5 g8 n                    Console.WriteLine(numw[i]);
3 j* ?; b" S$ L           9 {8 ~8 o3 K' u. _5 ~: C
            Console.ReadLine();  s) S8 q' I" Y& n% B/ o0 z) X3 @6 i
        }; j' q6 v; O1 J2 v: H0 p
    }
' G1 j+ G% ?+ s}- H% y- U6 u" c4 B4 V5 E
想知道小甲鱼最近在做啥?请访问 -> 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-5-12 00:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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