鱼C论坛

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

猴子问题

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

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

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

x
大家好!
# o6 v) U1 `7 w7 o! }" G- x, T; o; \这几天我在忙着编一个问题,我用了一种方法编出来!
1 H/ W! {0 H) m) G3 ]# ^, t但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
" b; W# b/ H9 Y3 l注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ' m* H! F5 V* s
* t! D2 z  S0 T" I, e
, F% q: p8 r) ]3 b& M  j( j; k; N
                            题目
- ?7 H, p! q' z# s  F2 t- @山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。. z; W% W% B' G  K8 l6 q, A6 h& ]
第一种方法:利用循环链表
  G8 P) O+ y0 ^8 ?) d, d#include<stdio.h>
* o8 j9 H2 x0 `  c# h: j7 Z#include<malloc.h>
1 V# m$ i* l$ \#define M 8            //共有8只猴子
  ?5 B7 o; m; r8 r( j& J: Q+ O5 f#define N 3            //数到3只时退出第三只
! O6 O! m, @) Itypedef struct monkey" h' e) j1 J, x
{int number;
9 j6 V0 W' ~2 B" [( y" Rint flag;/ [8 F2 p+ {  G7 d+ P3 C1 n, l
struct monkey* next;+ L. [/ t5 T( ?% J9 c2 R% Z
}MONKEY;
/ C" `% r- D: _' Q/ f8 j3 Fmain(): G9 w% P1 w9 W2 B; H
{ MONKEY *head=NULL,*p,*s;5 ?+ x) v9 w+ s' F. H( E. x
  int i,sum=0,count=0;
5 A" P$ D) r5 ]7 A3 l& ~) W$ b  clrscr();              //清屏" x8 F5 P9 ?. k2 ?
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
9 q9 \: q1 G1 l" y7 ?4 m  p->number=1;p->flag=1;
6 x$ ?8 G( h3 Z* s3 L+ B8 S( Y1 H  p->next=head;
2 o. x/ P+ ^" L  _  head=p;! r1 |0 X& e8 |* ^# z& {. O
  for(i=2;i<=M;i++)
, Y) w9 V. |8 G" G    { s=(MONKEY *)malloc(sizeof(MONKEY));$ y* D* M8 f9 S$ y8 o$ V. o
     s->number=i;s->flag=1;
4 j* d, m3 J3 t! F7 p- s8 j7 f9 Q' y' y     s->next=head;! D! m$ ]# A- }- Y
     p->next=s;p=p->next;9 k9 Q( ?4 c/ [# R8 \4 l
    }
7 f3 {0 M& O' t7 @1 {' m2 _& @, W    p=head;. @8 q* Y( v0 u
   for(;;)
0 F2 z/ O& U, \; U: d: B! C9 s    {if(p->flag==1)( ~8 b; L* O: W# D1 h: `" d5 I
       count++;: Q2 v4 R1 n. J4 S- `- N
     if(count==N)% ?  d  J  K7 e! K! J
        {p->flag=0;
9 x7 d2 W! m; w$ l+ M         count=0;
+ Y; s$ `7 o# A4 x, D         sum++;}' A, i6 l' b- e4 c0 C
     if(sum==M-1)! H/ _: S8 d0 {& x* J! ]3 |1 X
        break;( d9 `4 J# R  r! ?: p
     p=p->next;
0 l" q" L& V& T+ {    }1 Z" n4 u: d3 e* X$ g9 j/ I" g
    p=
- P; L1 m" n* j0 z! |    head;
9 Q3 h! [4 k- d8 A    for(i=1;i<=M;i++)6 p+ S3 G- e) R  N. C6 d
    { if(p->flag==1)
% V2 g9 k. h2 b) L0 U8 l        printf("\t%d",p->number);' K9 D, V3 U( y1 z5 [& k% `, K6 d
      p=p->next;
* v+ E8 {( O+ f2 b2 ~: t; I5 d    }  j  l; ]0 y$ f0 j+ w8 o
% ^) P3 S8 ?3 F" h
+ E1 p0 g  s4 R& w) X2 \( z8 T

; [' P: a$ s# u5 U' B$ F+ y}
- m/ Q- B" S$ ]1 X% z9 K: |
第二种方法:数组4 ^! C# H/ L2 Z( t/ C- m. f" }% \& p6 A
#include<stdio.h>- O" \* ^$ R0 h" D% B- C
#define M 8
0 [: C* i4 `* k9 c# u2 o7 Y# y0 Qstruct monkey& e6 C9 |! N: L7 g# Y
{int number;
3 x2 H+ z* a: G0 f5 ]- j( t- Iint nextp;, ], a* x7 H7 s& P
}link[M+1];) K, J! q5 V& a& P

$ c2 {8 D) q4 ?7 j- ]void main()+ t# q& h% j: X- B4 `, z
{int i,count,h;7 Y$ t! E; T2 C& ^$ a, @
for(i=1;i<=M;i++)
% W5 o  E# t; ~7 `* D+ T1 o. H" r{  if(i==M)
2 X, Y  V# B# l! j   link[i].nextp=1;
* S  I" }0 l6 f1 H5 ^  Z0 [4 Q   else* j( s3 S) ]7 F5 W+ X7 S6 P8 I' t" y) q. u5 c
   link[i].nextp=i+1;3 t/ \0 O" j- W5 K& r1 Z
  link[i].number=i;# Q# }5 d! @) |
}
% }2 ^7 b; n2 a/ \printf("\n");
+ ^7 D- |  l8 W+ G4 I7 i8 icount=0;
$ g) S$ v5 m) M. @" fh=M;
- F5 f  M: d- Gprintf("依次退出的猴子: \n");
; T9 @; K* c: t* x1 Qwhile(count<M-1); l) ^$ f- i/ d# Y8 u! ~
{i=0;/ O( X  O8 |* Q0 t1 T3 {8 r' Y
while(i!=3)
# z+ z! _; f( _2 C4 ^/ s, l$ U. ?{ h=link[h].nextp;
7 h; i9 Z+ F1 }6 X/ s; q% B* l   if(link[h].number)5 }" f8 H5 M7 q; ^! s6 Y
     i++;}7 t( ?) J6 m# A* o$ u" r

7 |% F  S* }: m+ cprintf("%4d",link[h].number);1 i, c, c2 Y3 C6 C! Q/ s
link[h].number=0;, a7 G6 [1 ?- m9 R' c- Q4 e; D9 c* A
count++;% Q  A* U  E9 }* d" [! N6 J
}
' w9 ?4 M) j/ d% _3 I# f& U
; I* \* Y- u! k9 E  @printf("\n大王是:");- J+ t7 Z% @8 N
  for(i=1;i<=M;i++)
7 x/ F4 u& |8 q  if(link[i].number)
( K4 T  m7 g/ o- i. S( R/ ?; a    printf("%3d\n",link[i].number);
" `$ F& W2 D- t( F6 ~3 ?) r; _8 K0 S0 T% y. U; c9 D# k. h2 y

3 I- `0 V2 k8 h1 H) R}

+ h" ^% N- g, J' j2 n  ?第三种是普通方法for循环

& t2 l6 x4 p1 O  |1 e4 v+ D; S#include<stdio.h>
! ?2 l$ f- X. _# U& R3 Mvoid main()
. W5 Y) l* Y4 c{ int i,k,m,n,num[50],q,*p;
" p) T: t6 c5 f    clrscr();
* N+ z4 t  K1 |" T   printf("input number of person: n=");' J9 `8 n1 }0 a0 u4 X
    scanf("%d",&n);: h3 }) O$ z" Y, u! x+ B
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
9 A+ `1 r& ^( K% T" e0 f    scanf("%d",&q);
: _. w: V& F( M3 G9 D) n8 \, r   p=num;
7 U3 t  y- Y' J3 l8 s$ L$ ?$ n# Y  for(i=0;i<n;i++)* s: H5 ?, [0 z( s3 |) a2 |, u! |
    *(p+i)=i+1;3 q4 K4 j. R; p3 D& O; c
   i=0;
$ \9 y! t7 r2 c   k=0;$ u0 j, p% _8 O9 x
   m=0;% g2 e: P- u4 ?/ d
  while(m<n-1)
2 ^5 S2 {$ G3 q+ H! D$ [   {if(*(p+i)!=0) k++;
( `6 @1 x- a" h     if(k==q)
$ t9 v' n  T1 z4 Y! A      { *(p+i)=0;
# k4 |7 ~4 t; a        k=0;/ J. f5 t. W0 K, V+ B
        m++;
; ?' |4 W4 ?8 F      }1 J% f, C; |7 ]; Z
    i++;
) c( b$ B$ C$ j% A" |& I. n    if(i==n)i=0;; P: Q! _/ G& q1 ?4 r: E
   }' ?8 F8 b. Z0 `
  while(*p==0)p++;
9 W/ r( P+ s# L1 v    printf("The last one is NO:%d\n",*p);
* o) ~7 Q: w# N     getch();/ Y0 P2 a3 V$ r& u

  V4 B9 [! V" }! G1 D+ a- `* f) P}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
& l) U, g* X2 K, _0 m. ]5 anamespace 又费马达又费电
1 J* J0 T5 k/ k{
8 f1 B. G% D/ q$ E* G+ ?    class Program
) G: \, N) y/ u$ x    {
) F: O7 q  u+ C/ ]8 p: k        static void Main(string[] args): z  b5 q- V( g3 I/ ~
        {
7 p0 a. N. Q+ s9 g7 x% A            int m, n;
0 y' W% y2 x% L! F$ P            Console.WriteLine("请输入数组长度");
+ D( j) N' l* V1 H            m = int.Parse(Console.ReadLine());//m为数组的大小- |9 H- x: N0 F% k
            Console.WriteLine("请输入要截取数字的大小");
' M4 y  P8 z+ [! p2 \; [3 E            n = int.Parse(Console.ReadLine());, s* D) {. X. X: @# @
            int [] numw=new int
4 U6 U( R% A, S2 s( Q& q1 `0 t7 r) h+ R$ Q, c) \
&shy;&shy;&shy;;& T  s. Z8 C, f. V
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
' h% t5 a4 J6 |1 t. b' v7 r            {
! ?, g* q' Z& R+ @                numw[j - 1] = j;
2 P2 M* Q# p, ~: H            }; r( _+ E3 N4 m+ B( ?& S
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
$ Z; p3 x$ i3 M. a( _            while (d != m - 1)) W; T) S0 f+ T
            {; E6 s; f% E% |; p4 k. E
                if (i == m && d != m - 1)
3 ^8 `: f; s& z. j                {
4 r# r4 {1 x2 }3 ]% L; J# k% [* w                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!" o4 ]/ L  w0 Q& g
                    continue;
+ N+ Y8 \5 X7 e% N6 P  [, E) y, j3 q                }
) x" y0 c4 V& j: f2 @2 Z                else+ Y! y# b1 n; L) h) \
                {3 D( q9 l" X5 C2 o# j; e7 B( @
                    if (numw[i] != 0), P- F# D" F7 i, n7 ?8 A* O- g
                    {) [9 ~4 a8 }, h
                        i++;; J9 n5 v6 g6 W; b
                        k++;
/ V3 Z; T, m8 i* b% M- q                        if (k == n)& C& @3 \& A# s2 B1 `( t- J
                        {
+ Z) d8 K2 s! a+ I% J                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
' R/ l9 m& J" K( _                            k = 0;* q3 s4 h5 x6 _; t' _
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
" N9 W0 `5 Y0 d; d8 \                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);7 `/ L, j+ P  ]8 B$ K) i
                        }
4 I3 z$ ?, Q7 B! c% h                        else//输出暂时还没有改变数组元素的值
( M* s2 P$ v+ A. d! V' J                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; b6 l* z% d+ \9 B                    }
/ m0 R1 l, @0 `. |  u9 x                    else8 V/ G8 v4 [7 y: r8 B
                        i++;//数组元素为0,直接跳过,不计数。。。* s; O/ w. G! u2 p4 d
                }: X+ J+ t' E7 b, R1 O6 }
, G! S/ e$ N: r7 \% ^
/ H# V  |/ [- H7 n
            }//结束while循环3 t: Y, J  T( h" i2 H% ]
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
/ |8 }- @; M. v# K9 K3 [           3 C- I8 z8 w! Q5 x$ G
                if (numw[i] != 0)
+ Z& E5 V# O$ G7 O& o7 I                    Console.WriteLine(numw[i]);
# i- J2 k, o7 I% e/ ~6 a           
! v* [. {; W3 V5 g7 [$ ], k: ^            Console.ReadLine();
3 S9 x! x* r. e  R        }
9 T& E5 A4 R/ Z! ~    }
3 j. f" e, c- y- |% [+ X* {}7 V# d1 ^& i* H! x9 R
小甲鱼最新课程 -> 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, 2025-11-12 12:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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