鱼C论坛

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

猴子问题

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

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

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

x
大家好!
; d) B1 Z. A. Q7 E这几天我在忙着编一个问题,我用了一种方法编出来!8 A! {, {  ^, u% n+ q9 N+ |
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
0 r$ V4 p8 @$ C+ u$ q0 z注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 6 O7 A0 }! F8 @6 f; o
- J3 D: W9 n' L& ?5 O
& R: ~* l. c0 i0 A2 P2 f
                            题目) m6 F% u/ N0 }. Y
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。- ]3 i1 g  |. L
第一种方法:利用循环链表
# ?2 x$ _  k$ s#include<stdio.h>9 D5 {, K1 F- S3 f
#include<malloc.h>
" w0 R  Y+ t2 V" d* b+ e#define M 8            //共有8只猴子% b  e% s* h6 m" r: l( U
#define N 3            //数到3只时退出第三只
! B; c1 {  T% V3 {2 Otypedef struct monkey2 t2 s/ x, d  n& g2 C) d/ r: }
{int number;
4 E6 @" d5 G5 v9 k1 Pint flag;
) E& i0 ^5 S1 ~! s- F( bstruct monkey* next;
* ^4 I# e8 C" s- K  n5 m" i; i}MONKEY;
$ Y8 b& Z1 h9 e7 D* ]$ ?9 umain()
( [9 E: C0 y% ^- W{ MONKEY *head=NULL,*p,*s;
* y  q8 S1 B! z, S- m9 E/ ?& U  int i,sum=0,count=0;$ }  r; o1 R7 n& ]1 T4 @" K
  clrscr();              //清屏
$ v" g2 @* \; J  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存5 k3 e8 ]1 K3 z7 ?" M, y5 E
  p->number=1;p->flag=1;6 B! }* b" K( Y$ p
  p->next=head;2 n8 e3 I+ ^, L
  head=p;( m: x7 l# k  c1 ~% O; E! s6 N
  for(i=2;i<=M;i++)% k+ z+ y5 m; Z* x$ p0 K0 ]& A
    { s=(MONKEY *)malloc(sizeof(MONKEY));$ e* h; T+ R: x  i2 N
     s->number=i;s->flag=1;+ M7 c- i1 m. g$ ~
     s->next=head;
$ R* a- u7 \0 r) `: |     p->next=s;p=p->next;
' {/ F& ]% B* Q* ]3 S9 \8 `) c    }0 r/ w6 d9 W3 ^6 m
    p=head;
* Y$ d  G! d3 Q- g' c   for(;;)
6 D) v7 w/ F$ U* t6 ^* r    {if(p->flag==1)1 B6 B$ M+ a3 \# G( ~
       count++;
0 `4 F# u' m0 w$ z% ~2 ?     if(count==N)
9 l' T6 k7 w- {9 C( |6 U1 E' |8 @        {p->flag=0;
) [3 U8 T! ?1 n% K' A3 Y  h         count=0;! A0 d; e0 V) d% K- Q8 z' y5 \1 ]
         sum++;}
0 c1 {  l0 \+ b# l5 I! d. _6 J     if(sum==M-1)
) B3 S! ?% s  ?9 h5 k        break;% p# Y! W/ x+ k8 L
     p=p->next;
4 s0 f, d  c6 q; z9 C$ u! L    }9 e1 {: |* }% i8 d: B. U. a0 y
    p=
9 p4 b7 Z' _: b& l" s    head;. O/ N4 ]: d; Q7 M& D
    for(i=1;i<=M;i++)
1 p+ r; P: r) b, K- ]- j    { if(p->flag==1)& I- `& D! t- e) B' I
        printf("\t%d",p->number);
' B6 \2 @; Y5 g' G& _0 j      p=p->next;% |- O" l/ J) M( H- r, O/ ^7 |
    }4 q5 E$ y$ f* k- j9 A- i* @

6 _& ~3 v, G9 \
: Q. r7 o) U7 O7 t' O: [" q. _
+ v2 U( ~+ H& W}
: @, F) F% `) w/ l8 k
第二种方法:数组% R. G& V4 K, Q2 M2 c3 {, T
#include<stdio.h>
- l! I4 [/ W8 n0 s#define M 8
6 g8 F" b' e% v. r6 Astruct monkey
! p1 M7 o+ Q7 j& i  e% N{int number;* C" v  V& a  G* t% H8 p" c2 _
int nextp;( u4 r' z# i+ B4 g/ I4 l$ i
}link[M+1];
6 S, H9 S4 l8 {  i# W9 W' c2 H; ]  u' K1 @" ?* g! i. a4 b
void main()3 Y9 h8 I2 b& R1 V/ {$ X
{int i,count,h;- X# C* t) C/ }: u2 M
for(i=1;i<=M;i++)
0 Q$ T1 l, ]9 U6 A: Q6 p9 ^$ x{  if(i==M)" g, ^( N) X% p5 K" |$ i
   link[i].nextp=1;0 ^5 |5 s& o9 w: B
   else
7 ^( n5 o, k! v; [" A   link[i].nextp=i+1;- q' l2 D8 ]3 W+ ?( w9 v
  link[i].number=i;
  X) t2 \8 E0 P+ r- o5 Q3 I  Z}  q: O. f" `. U* G( N: w
printf("\n");
* Y" L* S/ {5 Y" w3 mcount=0;
. V4 g7 X! A$ gh=M;
4 ~; Z5 p3 {) N/ a+ N/ K; zprintf("依次退出的猴子: \n");
2 f) O: {& q" j" @8 |while(count<M-1)
/ X$ ]: Q6 f. _+ C3 K8 ]; R{i=0;0 {" i& ~1 h. `) R4 H
while(i!=3)% H5 P4 H( t) q+ d/ K3 `4 @
{ h=link[h].nextp;4 y! g$ V3 k  x  ?$ \6 S
   if(link[h].number)5 S$ H( c4 d7 E6 @6 x4 X( x
     i++;}/ W, X5 q, [) H! T* S$ G5 k& N8 r

% r3 i6 Y& A) c: R. R( N4 ?6 g: nprintf("%4d",link[h].number);
. [6 Z% t1 n" X% C" O( P( d  Ylink[h].number=0;
5 j' v/ _! p9 z8 `7 ^4 ~$ B# V% d# J5 icount++;: [7 t, R8 S, y! y  N+ ?' S; x
}
0 y5 T' Z; ^1 n
0 K" e+ n/ r& n2 y0 X7 E9 y+ Lprintf("\n大王是:");" c3 r. o; v1 ~% w/ d1 x) V
  for(i=1;i<=M;i++)! a$ t4 b+ x2 Z* x$ z) f3 H
  if(link[i].number)( @# ~- \* e# g
    printf("%3d\n",link[i].number);- l' h& ^# q% k

3 }5 i7 G, b" M, o- v8 ]9 x
% ~( i4 [2 ?5 L4 [# j- I}

% A, \  q0 \+ H+ L0 @; L第三种是普通方法for循环
3 k% z$ R- f% d9 |
#include<stdio.h>
: J$ F2 T" F; a( b# Q+ Nvoid main()
8 [) j' U8 p5 J5 |9 D( f{ int i,k,m,n,num[50],q,*p;
1 D/ M( n# s2 @+ p/ P2 k    clrscr();
" [9 e7 J! t( a$ b   printf("input number of person: n=");8 y) Q" y( b/ [2 @. _. P3 U4 P
    scanf("%d",&n);
# w; }. T. K7 Uprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只2 V* h. L  r( [) x3 ?- k0 z) L
    scanf("%d",&q);8 f2 Q0 C& n+ q0 B
   p=num;" M- A9 x+ F- y  Z- P: v4 |
  for(i=0;i<n;i++)) T4 S4 K' ~! D( f7 o  y/ G
    *(p+i)=i+1;1 @% ?! W; o5 S1 _! r2 A
   i=0;0 {, h! p5 q. f  i9 P
   k=0;- Y! d+ F2 t- i, V! D: n$ a
   m=0;: `6 J  y/ T& m$ M: L2 X
  while(m<n-1): _5 K8 J1 K8 Y/ ?# H% T4 M; Y8 ~
   {if(*(p+i)!=0) k++;- |& c( k# Q9 e! R  j
     if(k==q)) |" d. P. K% T( Z5 Y; p
      { *(p+i)=0;
0 z. @& q, |$ W7 s$ l1 v3 f        k=0;
# ?4 ~5 L; V2 `1 z0 ~9 m6 ]        m++;$ t' c& N% l( ?3 n
      }
- f2 s, a# t! ~+ l" ?5 d    i++;
' Y, m. a" l" D7 J    if(i==n)i=0;& H4 k. z1 v$ q' Q, m/ W# a$ }$ Y
   }+ W$ `5 ]1 N* y" ]/ W
  while(*p==0)p++;: `2 u$ |3 x2 j/ p# U
    printf("The last one is NO:%d\n",*p);5 Z( ~5 l& m$ s, h) `3 @; Y+ h
     getch();  g4 r& s% G& G1 A  s5 i

  X* k' r( q, J}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
5 \! u( p% q: P( b& mnamespace 又费马达又费电* z" o1 l% f/ |( _% I3 J: v) I
{5 ]# n2 s' A" v
    class Program
5 J, M8 J4 [( Z: I    {
3 [) |; z# u$ u5 U, Y7 M7 |  ]        static void Main(string[] args)
* D  V7 L% o/ A1 i, P' S% v/ U        {
* v! E+ U9 d8 d            int m, n;+ i4 s9 z* z6 X' s4 H3 M( ~9 ]- O
            Console.WriteLine("请输入数组长度");
5 ~5 a; n0 j9 S9 q            m = int.Parse(Console.ReadLine());//m为数组的大小- c) {1 m. N7 t  A4 U& Q
            Console.WriteLine("请输入要截取数字的大小");
, |) R  i) m" F- W6 O9 h- g) c            n = int.Parse(Console.ReadLine());
# `3 u; G5 L! D" ]' V% l& p7 J4 g            int [] numw=new int
# F- U6 [. {: h2 g1 R* s) k$ J
6 p! p+ I. b) R1 O6 [2 z$ z  T&shy;&shy;&shy;;& J6 B0 Y; y7 b) H
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
3 p- o& d& T+ l3 S$ Z            {. n" Z- q* C0 N( z; |! |0 ~. h" V/ s
                numw[j - 1] = j;
: |& G3 |" x4 p$ G            }
: G4 g! h% U. w  K/ i' ^* {            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!' ]2 @8 }% q  I" U4 T- u6 S( J
            while (d != m - 1)) }" i$ n2 O) K( r
            {
6 H' D* D5 r9 i- J8 L$ b' k                if (i == m && d != m - 1)
9 M/ h- O% i1 C! }3 q                {
5 I5 I; t, x  c                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!: V# G( o6 }( d3 m
                    continue;9 N$ M- d% H, a7 J
                }
. r1 i) l4 {2 ?4 g5 {* I7 r                else
  F. n! _- b- G$ b4 c: q                {
6 K* W/ k% U+ U: E9 C% o                    if (numw[i] != 0)
8 E: X! Q- G( a% d                    {- n& S, k+ a8 t
                        i++;
% \2 C. ]* E: s                        k++;
" T( H2 [* N" w) i                        if (k == n)7 y# n/ E: k1 |  {2 t% P0 O. D
                        {+ S6 E: g8 K; v
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了6 [0 w! c9 ^/ W: F6 J
                            k = 0;
* |1 u+ v% y* N. ^! }- x$ F              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1% H. A4 M' i& u/ |3 t+ U  ?
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
8 v% c% g: p5 n                        }4 d* a* l6 N* s3 F
                        else//输出暂时还没有改变数组元素的值/ e9 p$ s* I, l+ i
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);' E1 V# M$ M9 S" b- g4 O
                    }# c! S$ O' Y# v2 |) R* d, z8 p
                    else' f1 {' g4 L' m: n& _. K
                        i++;//数组元素为0,直接跳过,不计数。。。" w' g6 k& ?. d$ \
                }) V% s8 N/ d8 k- t, k( o. z

2 q" a4 s. j4 v  i# M2 H7 _( B; _  a  J
            }//结束while循环
0 D5 V) @" v, I/ @; g            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
/ o$ P& G( ]4 a             G) n* n1 x  C5 P7 ]0 O2 z
                if (numw[i] != 0)) {7 X! {1 w- B: K! X
                    Console.WriteLine(numw[i]);
1 k4 G4 A/ L8 x* Y5 W, N           * H$ w+ Z( f+ L. X) O2 V9 c
            Console.ReadLine();
7 B: z$ ]2 L1 V8 h4 J        }2 j2 v; x3 h: Q8 {4 T
    }( j, l& J0 C/ B
}: V! T9 Z7 b, ]# t! `
小甲鱼最新课程 -> 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-1-15 08:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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