鱼C论坛

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

猴子问题

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

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

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

x
大家好!, @7 p/ z* c: j7 R1 y* f
这几天我在忙着编一个问题,我用了一种方法编出来!
( M) W) O/ X- p; B9 ?但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
' v) X" C9 y! t7 K( s7 N* F注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ( p- s, O5 ]: D7 i' w1 ^$ Q6 z
, U! r  F( L# Z" R" S' P
4 u. r: M. d" B( j7 B0 f5 d8 B5 q" ^& Z
                            题目
0 b# b2 i. K  i; s# q山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。4 G" e. N) E2 V
第一种方法:利用循环链表( q0 d* F* n; I# O2 x, l: a% \
#include<stdio.h>, B/ ?9 R: E% w2 R
#include<malloc.h>6 w  s0 B/ v' L
#define M 8            //共有8只猴子6 o9 y- X- Q8 H( P" m$ y2 l+ u0 D
#define N 3            //数到3只时退出第三只
, v" _' H5 z' k' g0 K) jtypedef struct monkey) {9 w% A! G/ P9 c" d
{int number;
8 ~- A+ b9 T: C7 g* }: Q8 Bint flag;
2 k# f  w$ N) p' T6 }1 o( ?& ~struct monkey* next;: m3 L7 S: Z5 F7 k
}MONKEY;0 Q: V( n' q8 E# Q% d, q. c7 _
main()( I( t5 w5 \3 k  u
{ MONKEY *head=NULL,*p,*s;
6 r. s. g7 h1 D& F  int i,sum=0,count=0;
9 \( w: r1 f3 Y3 M: }) M9 Z  clrscr();              //清屏. D  I) V) }# O: t
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存8 z. e! s( l5 y1 D, U
  p->number=1;p->flag=1;3 n9 u' f6 z# E' l/ @9 t/ c
  p->next=head;* u8 D3 |+ B1 ^+ X0 Q- z
  head=p;; \) P0 b- m" f4 j/ W9 w3 L
  for(i=2;i<=M;i++)
/ n" x; ?$ _3 t* ?    { s=(MONKEY *)malloc(sizeof(MONKEY));0 p3 y7 }/ ~* ^
     s->number=i;s->flag=1;3 P- h! F5 |& b3 y
     s->next=head;" o% T8 ^' e+ t* Y  Z" F6 M, u+ c
     p->next=s;p=p->next;
9 `. ^/ i" A6 Z    }9 Y1 l* G8 g& L; T, e
    p=head;3 o2 f2 l: m0 z5 `) ?' w3 P6 H
   for(;;)6 V+ B! P$ I7 x  l& e' X
    {if(p->flag==1)
+ ]- `: V) q$ \; U5 q) R. w: g8 m       count++;
, H% C  }! o! x1 B+ Z+ ]! v; E     if(count==N)
" R( {/ C. a2 q2 k7 p9 J  j& U        {p->flag=0;
3 j9 T0 E$ |# H$ L+ r' y" N         count=0;+ {8 e  y* {5 y
         sum++;}4 J6 O$ L% L5 l% Z3 [! ?
     if(sum==M-1)' j' i/ Y8 Q, l- {/ {2 {
        break;0 [$ s; l% g/ _* ?% a. B
     p=p->next;( N$ d5 a' t& l; r- r) y5 O
    }
" I/ K9 x) @+ M! L& x    p=# z8 f3 V: d4 I. N7 W
    head;' _8 J5 [: a. g
    for(i=1;i<=M;i++)# v5 x  W6 F0 }; c& l
    { if(p->flag==1)1 z* O& R$ D1 {' _1 q$ ^: m
        printf("\t%d",p->number);
  A- {0 t' g& A% N      p=p->next;0 z6 E1 A) u0 D/ L. }
    }& l' C7 f! W$ R5 t, \
" k& A0 `$ z+ |7 P3 c& b. {

% Z" d0 R# `3 D
$ C' z2 ~$ F$ h6 n}

. Y7 C# A- g& g/ h- |第二种方法:数组
( S  b" |( U+ h; G9 n* \#include<stdio.h>
6 b$ E8 Y% b7 U% o#define M 8
0 T& ]0 ?2 I' `& K; t  i8 sstruct monkey1 T2 u, S& H% u- j% d0 G! R4 w' u9 v
{int number;
$ N2 z' B4 U3 Iint nextp;! `/ U# v6 v) Q& v; |
}link[M+1];( a* K/ h3 C/ Y

# x( b- m/ S- p1 H5 Q. e7 M, X- ^7 Nvoid main()
- S) Z, T( x" @+ e# @7 M% J{int i,count,h;
8 }: s7 W0 V+ Z5 bfor(i=1;i<=M;i++)7 s, [+ A9 L. U: _, j: ?
{  if(i==M)
# @3 f. A& E8 E* L7 r9 t   link[i].nextp=1;
# |! x  i  x; p& S) y/ n; w  E   else
: T! h" m* b( Z7 G( {   link[i].nextp=i+1;
- d: i' |2 o; R  link[i].number=i;* u& _3 q0 f8 s5 k4 d5 |
}
; v8 \! U+ |2 J: s0 P1 zprintf("\n");
# \+ {% Z' t- N, W% J/ M( lcount=0;
1 M; h+ V$ U9 ^' {  K7 _9 w8 uh=M;3 _4 {0 b- V  U$ L
printf("依次退出的猴子: \n");, T" s$ t: t6 n0 e6 d
while(count<M-1): T& \" D3 G. G4 H' p, E5 w4 E
{i=0;
5 a! ]2 d3 O" S. Q: H$ |while(i!=3)
: o; G2 M3 c+ m! b+ X2 f{ h=link[h].nextp;
0 Q7 P) _- U9 E9 D* D( h7 Y9 r6 H   if(link[h].number)
& _9 K- \1 I3 G; h" |- o     i++;}" h  P1 T! T; R; K7 W, ]

# m$ }' J: r2 w, `' u# Tprintf("%4d",link[h].number);
$ _' Y- N; K4 ?7 _0 d! b4 [link[h].number=0;
8 N, E3 P+ n; p8 Q# Wcount++;
* R/ k  \% \6 C2 _. @3 g2 o}/ E5 Q/ `( x7 D7 v  v- H
. u- V# N) Q( @& D# f  u
printf("\n大王是:");. z6 C; t# u# j8 x
  for(i=1;i<=M;i++)
! G$ E6 k) f# C; Q  Y7 r2 q  if(link[i].number)
" l8 T: F( |# e$ V8 ~1 e, E    printf("%3d\n",link[i].number);
- o. e/ X! C  x! p: r- O- u
! b; C' T* B. w7 Z4 t' R/ n) v) n, L" b, z2 {9 c/ q( j
}
5 K) R7 f) K0 p8 Z2 e
第三种是普通方法for循环
( R6 P3 l) o  I6 o3 K
#include<stdio.h>) R9 N. I# R3 I4 D
void main(); {+ s6 {# D+ C
{ int i,k,m,n,num[50],q,*p;
: I5 \( x+ P. m    clrscr();  V0 Y8 G6 J8 s% Y! T- r$ k! \+ W
   printf("input number of person: n=");
/ t( \4 ~9 ~/ k/ p7 e0 H- `    scanf("%d",&n);1 H4 T( Y" b# e3 ~, W0 p9 ?
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只# ?; c: m8 ~; H5 {/ v( }% Y
    scanf("%d",&q);4 E, U1 |6 }5 y5 k9 Q6 c; U
   p=num;  m6 ?4 p! P, W" m* S
  for(i=0;i<n;i++)9 B' q$ h; X* Z9 D( a  l! X8 S
    *(p+i)=i+1;
7 x' [8 w. f  D5 e   i=0;
2 D$ K5 P7 \- l- N* F1 y: B+ a! C   k=0;
* Q) P% B* ]. b7 |! G# }' k   m=0;
  l* Q; O+ j" t  while(m<n-1)
( \' x( v2 c8 M3 ]   {if(*(p+i)!=0) k++;4 W; f6 t4 @# V$ M3 g
     if(k==q)
; y$ y' @: S( W      { *(p+i)=0;1 r+ q  n( p" W" `' C) _# L
        k=0;8 H. g2 b) d- v7 v" Y
        m++;
/ N+ G: f+ L# |      }  }' P. I; W- C* ]8 b
    i++;
$ ~# k" h! c: d. c. \" p    if(i==n)i=0;: ?. ~! `- |' @& t1 ]! [! Y
   }: z6 X) T' ^/ F; K
  while(*p==0)p++;
" Y' _! v/ ~  R8 M2 w# D    printf("The last one is NO:%d\n",*p);
- f8 G3 j5 [# z, a0 H% o( j     getch();
/ `8 P5 \4 t3 M  N4 }) m, O9 w# M
6 |5 H) E( ]1 g! c- m6 c0 z}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;7 X3 O* \7 ?% M' I
namespace 又费马达又费电
/ d* }( h: R1 }6 S+ |2 W# |5 [* M{
9 {' U. s) `7 W% E& Q/ W    class Program2 y& g2 u2 g' w$ E$ O& a/ A
    {  x: f3 D. T, l6 J
        static void Main(string[] args)6 D1 g' @3 V  M2 t: c
        {1 q% p5 V# Y5 n+ t" b2 d
            int m, n;7 }1 J0 O6 @- k+ P4 o& w' l
            Console.WriteLine("请输入数组长度");
9 n6 z+ K; |! e            m = int.Parse(Console.ReadLine());//m为数组的大小2 s9 W+ k( Z8 q- A7 y) [
            Console.WriteLine("请输入要截取数字的大小");+ q0 B& I' U* L4 Z! `
            n = int.Parse(Console.ReadLine());9 z1 I/ _* o! N7 w+ B
            int [] numw=new int, e; X3 s/ N# b" o

' A1 m4 N1 Z# X6 w; r7 `&shy;&shy;&shy;;" D7 N$ N! _6 Z+ g) C
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
/ U; l9 K" Y2 @0 e& D9 \1 {. {            {4 M) i. D/ L6 D4 o% ?
                numw[j - 1] = j;- N% y! T4 J# }1 I
            }; [1 w2 v; O. s6 |7 y6 L+ T# T
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
- s7 `' L$ @$ n1 i% E            while (d != m - 1)5 s- a1 H0 b' t; i
            {0 @' |5 u2 l# F: \3 X8 E$ Z/ {
                if (i == m && d != m - 1)
) o& o3 y2 R/ _$ _& @                {) T9 p: Q2 m% ]: U5 B
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!7 Q7 G* b& ^( ~) O& |2 b
                    continue;5 P8 Q/ [9 P# h; B; L" V, Q
                }+ a2 Z/ N( g2 b/ v7 N! O( V
                else7 P0 t1 C3 K! ~" ?
                {4 A/ u9 P& T2 h# p' Z
                    if (numw[i] != 0)" ]0 X1 `; }: M. o+ X. Z2 E
                    {$ x# B3 }! l5 a2 ^1 U
                        i++;# Y* o+ O; F9 o9 w( |- u$ e# A
                        k++;7 f. n8 e) f  g9 B' W, [& E
                        if (k == n)* w% B7 Z, m; j  \+ ]( n! G
                        {) c& |& w  o/ Y1 X! ^1 C/ X& v, q' S
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
6 o. l7 v. b8 }$ L. {6 j$ i                            k = 0;% J. M, h+ L2 h0 ~' H- X
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1, V; ^; X' ^5 b! X+ `/ G
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
- l; y0 F- N& k, F, ^2 w" p* R5 S                        }6 K% z1 [: I! |# d$ W* o3 W8 R  Y8 n; ]
                        else//输出暂时还没有改变数组元素的值
2 i' k; Z3 p5 {1 N3 @, \                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
2 {6 b4 z5 V- c                    }1 |4 O, C! G7 h0 S% h
                    else
5 l& l; }2 v* U                        i++;//数组元素为0,直接跳过,不计数。。。
. p$ d* `( ^8 P+ k! U                }
! R; |5 ?& }* e* K
# @3 R8 j  x: V7 m
$ s  H- y: H1 v            }//结束while循环
9 Z. M- A0 {$ b! H' N2 ?            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦0 A6 w: L1 y: p/ n8 l
           
2 F; _9 b. V/ r0 \5 i* t                if (numw[i] != 0)8 l" _' c. K- V" A) X' I
                    Console.WriteLine(numw[i]);7 t0 D0 {+ p7 ~2 j9 k5 B1 R
           $ y% n+ s+ u* O+ ?' E
            Console.ReadLine();
  l( \& @* _  W: a8 w. Y( m2 U0 k        }6 Y( P: f$ T0 P- H5 b' T- S0 N
    }
, y% p( Z. e1 Q8 v6 c}
9 Z: F" }$ \: C) m/ e/ \8 L
小甲鱼最新课程 -> 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-3-22 05:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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