鱼C论坛

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

猴子问题

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

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

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

x
大家好!
+ y% c) S0 Y) D% O. |* [, s这几天我在忙着编一个问题,我用了一种方法编出来!
& _% G' e7 l/ c  U但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!" L1 g! a& b1 F; S
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
& B, n3 _5 p7 }( |
) u; L+ O5 Q. M2 o" E% `+ K
; F, U1 x# Z2 J
                            题目
# {5 \8 G# m2 G; q. ~1 S; t' q2 E( |山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。; I% M- k9 m& v/ {4 R
第一种方法:利用循环链表
: u  @# X9 S5 m( H$ y2 ~  v2 m#include<stdio.h>3 V8 ]+ ^6 o# V3 h8 Q. V
#include<malloc.h>2 `& ?% H" q2 G! x8 \0 @
#define M 8            //共有8只猴子
$ s4 p8 _# a* L. l" R4 ?#define N 3            //数到3只时退出第三只
* W3 [; E8 x( d8 O- j, {: W& E9 a, c5 gtypedef struct monkey" P) j8 v7 J! R
{int number;& I, y/ n! ^$ D
int flag;. O$ N" _# C. v3 |2 m0 a
struct monkey* next;
' c. i% Q# k1 u# |/ m- i}MONKEY;
6 k' n) F4 Y! J1 c$ c: ~( O6 r8 nmain()
, _3 j4 _  R3 d8 u7 A) g6 o% a/ D{ MONKEY *head=NULL,*p,*s;
( K: u- G' D( f: E6 U# B6 }  int i,sum=0,count=0;. h% j( w5 n  x+ L$ |- X
  clrscr();              //清屏6 Y+ B  Q2 `8 d  F& K
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存2 h$ X% @  u( }7 i* U4 x
  p->number=1;p->flag=1;0 d) }5 l, S: G) L: E8 M$ [
  p->next=head;7 w2 |( |" h. X  x4 L
  head=p;4 \: ^% M: Y" U; k! W9 g
  for(i=2;i<=M;i++)
$ I# K& Y. ~9 T9 I4 U0 J9 D' R0 K    { s=(MONKEY *)malloc(sizeof(MONKEY));
1 E6 ?8 {; M& t- f6 s     s->number=i;s->flag=1;
  |2 p1 M. \' i8 y' y0 Z% \     s->next=head;& A' N7 H; B7 G; A% S
     p->next=s;p=p->next;. ~; R" L/ w& z, u  [( H
    }+ f# t& U6 j6 s1 F! d7 U, b
    p=head;
4 I: K' Y6 Q' q: Q* _7 ]- D5 I; `   for(;;)
5 V2 o/ d. m2 \+ c    {if(p->flag==1)3 G/ v% T. o3 N& H0 D8 x2 @( a
       count++;! q" F* u4 y  C7 R0 s
     if(count==N)8 o; j) Z. c& x5 L  Y5 i
        {p->flag=0;
/ z: P  {: ^: u% \- V         count=0;# T, _$ z# ]) j* L% ]- ^! q' z
         sum++;}
8 p% q6 T; }. T4 `, g5 r     if(sum==M-1), b$ V- t  G: X- Y6 H# A. [
        break;; R2 l8 J* s* Y. [/ \( R
     p=p->next;
* V! U- R! A9 s    }
7 w& g7 f) Q0 n0 \. N    p=
  `; \) Y* b; C  B3 j0 D    head;
9 |5 K! K5 Q$ R( `3 W9 n    for(i=1;i<=M;i++)
% S9 ?9 ~# F6 w5 O* q! n% h" V. h% p    { if(p->flag==1)
; a8 w- m3 T+ J4 r! r% ?        printf("\t%d",p->number);
1 ?- P1 ^  F5 }2 K& \. B4 R      p=p->next;# \8 G0 _5 G4 S6 j
    }8 k* o0 }9 G% b4 o
' `- [1 q% J5 X: `6 H7 l
  L* s( T" r1 s3 ~, X

! d: ]/ K! j) I2 J}

- }$ w: I0 @+ q! P+ `2 C第二种方法:数组
/ w( s1 u: `5 c7 O. X+ f% ]1 B6 [8 Z#include<stdio.h>
& i) f; ~/ G! O#define M 87 \' A) F- c! e- p* [+ Q( t4 t
struct monkey
  B: ~% ~& @7 R% Y- X{int number;9 V2 m0 m0 ]( d% [* F- p" g9 ?5 }4 ?
int nextp;
. z. s' s/ M0 ]& _( [}link[M+1];2 x6 A) Y0 h6 f/ k( M( l
& x* H/ k5 z0 x5 B7 M6 x
void main()) T+ b- ?% N) m
{int i,count,h;) D9 G2 V- K1 U" }
for(i=1;i<=M;i++)
8 s9 K, U" B, ^- v9 D+ c* q) x{  if(i==M)
5 y& z" C2 g$ O4 k" ]   link.nextp=1;
) ~' o# Q' T+ B4 l! b; s" g   else
* E! r5 P1 w' x   link.nextp=i+1;
1 J9 }7 k6 `' b: k) |  link.number=i;
& d, _$ S+ u1 H! ^) r+ a}! J: `6 g3 o% j
printf("\n");; N1 [2 t  ^" c: E5 T
count=0;
6 ?- ?* o* i' j/ X# k9 oh=M;
, I! Q& f3 \9 ?" e1 B' ^printf("依次退出的猴子: \n");
. s* i5 s( Z1 Z# i, Mwhile(count<M-1)- m( @' K  m$ {0 A/ e6 X' [8 V
{i=0;
9 O$ Y( }8 C  L9 uwhile(i!=3)
9 {6 a6 a8 W& \5 U& B' [4 I7 a9 P4 @{ h=link[h].nextp;  A/ s7 Q1 i  x( r0 f1 Z& g8 Z
   if(link[h].number)2 y0 c5 i# A2 }( M
     i++;}
; }' s+ @8 `6 ~2 K8 A6 r# j
$ T0 ~1 S+ m5 _1 h# Qprintf("%4d",link[h].number);# f: ^/ Q$ ^/ d
link[h].number=0;( r3 U" l  }" i4 G
count++;. [9 a8 @* K  i- P
}  G) q9 l! z7 j; d, o% r
* Q% z) a6 j9 f; ^  A
printf("\n大王是:");' O  q, w/ s% E0 k
  for(i=1;i<=M;i++)8 E, n* C3 Q& h5 C  h
  if(link.number)
6 W( a  ?! x  }4 t- z; I  w: b    printf("%3d\n",link.number);1 u0 I% M3 d1 A3 t) T3 j" l' s
( {2 h3 @( x% ]- j5 `4 ^, Z! t; `

0 b' z1 e: I, d! f/ o}
! V8 B$ ?  b8 s
第三种是普通方法for循环
$ R. t. {2 y% K6 e) [
#include<stdio.h>$ m$ O% N; L4 b" v7 q1 H" ~* A4 k" |
void main()
* m! s9 e6 q% ~7 x; z) r  |{ int i,k,m,n,num[50],q,*p;
& W( }; O) L" J    clrscr();, l& {& W) w5 S$ \7 ]# R/ ]
   printf("input number of person: n=");
) C0 i- H! c' @" c    scanf("%d",&n);
6 M& H  e+ v0 W1 N2 eprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
( z; K( Q& n+ e6 g6 Q" v    scanf("%d",&q);- T# ^+ n  B4 S+ h/ i
   p=num;" p# e9 h3 [( }4 M0 ?7 C
  for(i=0;i<n;i++)7 s- Q" ]  l- H: h: D0 q; e
    *(p+i)=i+1;
) G% }. m3 A. A$ `* X( f& i   i=0;) o1 C4 ~! p+ b  m; w
   k=0;4 x( v- |$ ^* L$ j
   m=0;8 e4 `+ K/ M) Q: E# J$ j
  while(m<n-1)
1 Y, D8 N7 p. @$ V   {if(*(p+i)!=0) k++;0 {5 J' k& S0 n7 Z
     if(k==q)
! D% }% c6 @; g% T8 i      { *(p+i)=0;0 R5 d# t- n' q# A  C$ Q5 g
        k=0;; v- h- Y6 V1 O
        m++;
- M, L( A- d0 |: ?9 o$ l8 j# H9 N      }  k* R* n2 G" }' Q7 d, R
    i++;
8 z- I3 T- R: S/ u3 G  ^+ Q    if(i==n)i=0;
- @- L9 A" T& x4 I& b7 W   }- v5 p) E0 H; ~- \5 I/ \
  while(*p==0)p++;
8 C' O; e0 v9 l& w8 a* W    printf("The last one is NO:%d\n",*p);  c. _1 D' [  L
     getch();
& M) Q+ ?) o* G3 n
) Z% h9 u6 C8 @( Y/ F8 _2 h}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
& ?# ^5 E1 J' x6 Xnamespace 又费马达又费电) m& v' i* o1 W# S" ?: X7 o- B- n! L
{8 x( D/ e6 ?  c1 v$ k+ b
    class Program
% I/ l8 d. D5 I7 I- k; i& J    {
6 K6 K- i; e/ h% u: W8 C0 Z! t& x8 V2 _* a        static void Main(string[] args)6 U$ x* ]; f. Q! e7 p
        {
1 k* U8 ~8 n' [  Y$ ^            int m, n;6 `- q% e+ w. _& j( y6 S8 r8 H6 S- Y
            Console.WriteLine("请输入数组长度");
% L9 x! }( l/ [$ H3 E$ n! \            m = int.Parse(Console.ReadLine());//m为数组的大小
6 h1 L, e9 P- W4 f. p! ?            Console.WriteLine("请输入要截取数字的大小");
+ @  u' u6 [6 V8 g5 \) A            n = int.Parse(Console.ReadLine());
. x8 i$ J& Z6 Q( @            int [] numw=new int
( U) c, S% h0 m' s* F0 v( W2 q6 d
&shy;&shy;&shy;;) m2 z/ `+ d! M, T( }" |: J
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数# n# y  W( @2 M
            {
9 W: B4 u& T0 o# g                numw[j - 1] = j;
$ @1 x0 v2 z: t) t9 k            }( e! \4 T, t5 F2 X
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!6 m( y& @' r# h  C4 {  P  n2 S
            while (d != m - 1)
% m# Z% X3 o7 f% H& P            {
' @) o2 g& b+ s1 @% g0 T                if (i == m && d != m - 1)
/ }9 [4 a7 W3 @& g: u0 O) J                {
2 q. g5 F. n- T                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!- ~. g( h% E* i% [  L2 Z
                    continue;
9 |# I6 m9 W' b                }
8 e* }' }2 F' m, _( K  D7 \                else
) @) v, g8 O$ v1 g                {$ U/ {& S/ W1 p1 v8 P
                    if (numw[i] != 0)+ @3 `2 I& X0 L3 ]
                    {' N3 c. `1 c' H- H' h$ M
                        i++;2 s7 G! Y- }. i$ Y- Y9 A7 Y
                        k++;- I& k" l4 l( e' ?1 l# m# ?
                        if (k == n)
' Z: S( o, }7 l( `                        {
0 [, P; L3 S& G# v                            numw[i - 1] = 0;//把在n位置数组元素的值改变了& Q, o* V2 D4 n* w0 i1 U
                            k = 0;/ D- y* ?$ Q$ b3 L$ o5 n4 W5 F4 W
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1& e0 N! r& Y8 u& L* W9 b
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
& O7 W, `8 N( T1 P- D2 y5 I9 b                        }
% x# i, P3 W7 q) Q& ^                        else//输出暂时还没有改变数组元素的值
, J( E1 y! g+ [" ~7 ~. M! L$ [                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);: Z$ E' U3 k  o* d$ M( O
                    }
! d) A) l. }- g                    else
! r. C- `$ ^) J8 k2 i. ~, ]                        i++;//数组元素为0,直接跳过,不计数。。。7 ~5 R  Y! M' H# F1 N! E
                }! H! Q/ V4 X% f8 v! ^+ G* ^
' }* d0 Q8 ^$ a, q! S* p% i: u

2 D4 Q- c  T5 }+ a8 ~. a( X            }//结束while循环
7 `" K* C9 l" n' q            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦3 e. E7 g# E' D; X+ p7 ]9 W
           ! r+ m: E% e' R2 [6 M! S' X
                if (numw[i] != 0)
. a+ h: J( C+ C7 v- B& @' L                    Console.WriteLine(numw[i]);9 ]. i/ E7 U' X& z. A4 ^/ s
           ( S) D4 d5 v. b9 v. r, b# ^; j' s
            Console.ReadLine();
! U/ C9 W5 _# ]" G( e' W) z        }
- N) l7 Q" y0 x) x    }9 K' u: v% S4 f! v2 g& X
}) V6 R! s+ \8 j* f
想知道小甲鱼最近在做啥?请访问 -> 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 06:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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