鱼C论坛

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

猴子问题

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

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

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

x
大家好!3 B0 s- c, r+ l8 x) @
这几天我在忙着编一个问题,我用了一种方法编出来!. k9 {* H" K2 J: O; o; b8 h
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
3 O5 D, U2 q( j0 D" E注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 5 T6 e' T! C' f) z7 {: w8 F

3 G1 f" Y: z. V# [! x
) Q+ U$ c5 r; a4 T7 u3 E8 a' @; _
                            题目
& }) i3 ?# o! |& ]/ O' l/ c( j1 \山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
2 M5 d% W! {8 C1 Y, f+ L6 K第一种方法:利用循环链表* E/ K1 O* ]+ ~0 C9 K" R0 B* P
#include<stdio.h>4 Q$ E' b$ X0 A1 c
#include<malloc.h>
# m- j- Q! h  L#define M 8            //共有8只猴子, Y4 ]/ y2 b  F4 Q
#define N 3            //数到3只时退出第三只" \# t' @9 Q$ ^- ?4 O/ X
typedef struct monkey
4 ], i3 F! Z5 }{int number;" A3 _2 O. |5 T4 N2 T8 X+ T# i- S
int flag;
/ L1 C& Z# I4 kstruct monkey* next;4 z4 n; M- h9 y0 A8 k6 U8 `
}MONKEY;
% X* r' `" n6 Omain()
. d# F7 G2 o$ J( q{ MONKEY *head=NULL,*p,*s;$ J2 _, S3 [- y9 w# e; U' L' u
  int i,sum=0,count=0;9 ]: a/ v4 b+ Q: L
  clrscr();              //清屏
/ A8 {; h: Z, D$ d) |  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存1 ~- N  B" n& N1 i
  p->number=1;p->flag=1;
# o$ m7 p& ]- J  D. L9 u  p->next=head;
7 Z% \/ x+ z. N  head=p;$ X$ d9 t, s4 ~) ?& \+ ~' K
  for(i=2;i<=M;i++)8 ?/ e: b! u- A# u( \5 T4 d- Z: ?4 M
    { s=(MONKEY *)malloc(sizeof(MONKEY));
5 L9 B" q. ~* ~4 r     s->number=i;s->flag=1;
8 n7 D0 o/ P; q3 I& d     s->next=head;2 g  X; Z( N/ ~7 u/ X( G1 S5 \$ Y
     p->next=s;p=p->next;6 |% z5 b8 S5 j# @/ e
    }7 W* V3 t" X* D* f
    p=head;  ^  g* E/ g. o0 R
   for(;;). y0 V4 f& z8 d7 x
    {if(p->flag==1)
$ x  ?3 w, Z8 R% Y3 T, Q       count++;
( q' i( Y  j, r7 L" R) g1 v* B     if(count==N): y. A0 H" ]; E( P1 R3 Z
        {p->flag=0;
% V0 R5 k+ o' k2 W4 S         count=0;
* X: X- v0 G) B# Q: F1 F         sum++;}( c! |# M  Q' t
     if(sum==M-1)- ~& c0 y2 v* K
        break;
) e4 a( T  q1 B- Y  o     p=p->next;; V, J7 V" B/ ?7 Z. @
    }! z$ f8 o1 ^+ S1 [/ a! X+ |
    p=! ?+ z) R" T; f* r; c: I9 L  L% k
    head;0 e* d3 \, _* u: {0 H' k6 O
    for(i=1;i<=M;i++)" L! g! L* ?6 U4 u
    { if(p->flag==1)
/ G1 k7 j) T; Y5 M; e8 W  |        printf("\t%d",p->number);+ j) Q, Z$ d! d
      p=p->next;: C0 `$ k3 p8 x, a: D0 S
    }
9 R6 d: E4 K. H) Y! m3 L( {1 T7 d6 a$ ]: w3 F: i/ Q

6 g# S! O5 X9 A  j+ w6 T. a0 u$ T  b8 M3 I! K$ C/ E! Y$ v7 y
}

2 `# K7 _$ x3 k& T" X7 x5 I9 o第二种方法:数组- k9 G0 j! o8 y3 m
#include<stdio.h>
# O; H( V6 @8 N. U; x# r2 `#define M 84 a( s+ E8 I. n8 F! m
struct monkey9 Q: P* _; v' f0 V; H$ ~8 j
{int number;
  |6 c) E; u  X3 Nint nextp;7 ?% w& E2 l! R% h/ @% |
}link[M+1];& d2 m  S* B- e  A$ D; X$ b

2 j+ e% ]; a6 i) Y1 S3 s7 M( C8 d! U+ ^void main()  A/ `/ a6 c+ Q5 z& c
{int i,count,h;
% E- t; H7 |. F" h6 P7 Q+ \. ofor(i=1;i<=M;i++)& ^- @2 Q" A1 D# s+ u
{  if(i==M)
  M/ P3 @) C+ k1 u+ v   link[i].nextp=1;
9 n5 q2 W) n  G0 W$ x) O) ^   else8 O( Z9 a+ `3 ^' y, P
   link[i].nextp=i+1;4 g& y% M0 v+ h) U
  link[i].number=i;6 c) U+ {6 Y  a5 J2 l  L
}  c. b$ S; i0 f* Y" q2 F  ^
printf("\n");: y, F/ R1 q! {, `  j
count=0;
' S$ H* Z0 w7 t( j9 h5 I* |. eh=M;* N5 J/ ^* y! j  X$ x7 L/ E
printf("依次退出的猴子: \n");; |+ F$ K9 i; \( D- R3 U
while(count<M-1)
4 i$ W. F: b( t{i=0;
5 T4 u0 i& a( q8 U6 J9 S* Dwhile(i!=3)
) r  A4 M5 m& }' o4 U{ h=link[h].nextp;
$ S8 }% s" y+ w) D" J   if(link[h].number)" v- e. i! o0 |& w
     i++;}# c7 z: K/ [4 q* N% P+ Z( |
7 g1 @( `+ v; X! B" x' r
printf("%4d",link[h].number);8 ^, \3 Z: a  q2 T
link[h].number=0;* x/ P  W& B! K  a/ E
count++;
; V; |9 w! d( Q2 w}8 u  [" W8 F6 V* T3 u

2 q" S% e  A& Bprintf("\n大王是:");% ]+ q7 c7 K3 j7 O
  for(i=1;i<=M;i++). M! S! |# o- X, R" R& G
  if(link[i].number)" S' j* ^8 L; Z
    printf("%3d\n",link[i].number);
7 W. j9 E9 V' s- q! t
' t6 H: c" X) J' }
, q  Y+ Z% m( W, c) n. v& [+ h& M}
0 L8 N4 D8 _  _! x
第三种是普通方法for循环
1 B5 i( Z1 B9 |2 o, C4 }. k2 f
#include<stdio.h>
( S* G" Z7 E0 r- T* G  e, t& {+ bvoid main()  n. {3 R5 ^3 U5 O. ~! P
{ int i,k,m,n,num[50],q,*p;
2 h6 W9 ]8 L; u7 D6 n' m    clrscr();: D& M- v: O% t& S
   printf("input number of person: n=");. ^* h8 j0 U% S- @! y; q2 Z
    scanf("%d",&n);' l+ N7 k, g& K8 i7 D" g
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
. e7 m: A( l* ~! z    scanf("%d",&q);
" \+ ?3 [; L0 S. f   p=num;. U& s" `$ }* Z4 I! P' k
  for(i=0;i<n;i++)
5 I* {9 z. `2 G" V% S9 D6 h) u    *(p+i)=i+1;- S4 _, E- V! P- I7 E; c2 a2 `
   i=0;
# o6 Y- W# H9 \4 G" T   k=0;& j: x! U& Y8 p4 X; e* Y% W$ e
   m=0;3 |! J! V3 W& b9 o9 m
  while(m<n-1)) ^1 C: p( n! L; `" N1 G# @
   {if(*(p+i)!=0) k++;; ~# @+ d) p* }1 {( d) S1 M! b
     if(k==q)9 T& [- v+ e. ]2 d9 ~
      { *(p+i)=0;
$ p9 v1 u$ t4 b' N0 L: [        k=0;
1 \/ `$ U  p% b( f        m++;
1 T1 u2 }, D" U4 }) K$ h5 q      }
) o' ?  n3 ^4 w: ]    i++;
( H- }9 q+ h$ C3 T/ l( }7 ?    if(i==n)i=0;1 I$ C, \  v0 z3 l: n% k, _
   }0 U' e# |6 R. C' `! p& |. W
  while(*p==0)p++;% a. n% Q* P3 {! w" _' X6 \' V/ k$ V. J" m
    printf("The last one is NO:%d\n",*p);0 i' ~+ q" s4 r1 S
     getch();
2 o) X1 C# M9 b. `  G" ~/ z$ U1 {2 o0 a
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
3 K1 v% C7 U: J  D# ~4 @. Znamespace 又费马达又费电
8 ?7 x& X2 Y: m: n+ @4 v$ Y3 s5 f& t{
, `% e! V/ E9 X7 M! U: o. ^" l: r    class Program7 m! B: T; i/ p- F/ E) R
    {, l8 }9 C9 @! W# y! `
        static void Main(string[] args)7 ~) k/ q+ g+ U$ O& Y: L
        {; p9 ~! Q# C! c' S) l
            int m, n;
2 g0 }* v+ L7 m            Console.WriteLine("请输入数组长度");' ^/ m* ]' H  z4 r
            m = int.Parse(Console.ReadLine());//m为数组的大小% W8 R3 i7 b4 Z5 O2 u1 }
            Console.WriteLine("请输入要截取数字的大小");+ \1 E" N# i4 N. R$ ~: f
            n = int.Parse(Console.ReadLine());
; m9 I, W2 D$ j/ O) C  B            int [] numw=new int9 u# ]4 t- v" M
8 F6 v4 p4 t5 I# r2 a
&shy;&shy;&shy;;
& H( \. b+ c; \  N            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
+ ?' @7 T; a/ H9 a7 t            {( l( W8 N+ W0 A2 d- z  V! N
                numw[j - 1] = j;! Q4 m0 E! n  O9 U" w; r
            }" ]' T9 H1 u) A
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!& i$ ]2 d# S6 c8 S
            while (d != m - 1)9 z$ e) V0 A& c% P7 k7 b4 A
            {! K, f3 E  i9 e) j
                if (i == m && d != m - 1)8 r! z' S& {+ o+ t* A
                {9 w% C1 p& E; i( D/ J5 s
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
7 K* N- u/ A5 _# l  I  Z                    continue;6 w! n6 }8 p' j# m8 |: [9 Y. M
                }* G/ p$ O. A5 W9 R9 A  J: }0 J
                else
& M8 A" l# n" H1 @- W$ F                {
0 w& W: s+ c- g4 h                    if (numw[i] != 0)
& w7 F% Q  g1 ?( ^9 k' k1 b                    {7 ~1 C7 W" V. ~& V4 F4 ]
                        i++;! v& P6 ?! Z' k8 `6 c. L
                        k++;  t% x+ Q7 g+ W( S0 |
                        if (k == n)  C3 |/ T7 w- w! H& V  z1 Y
                        {
9 `8 z6 m. Z9 l; `                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
- ^+ p1 l3 v6 u) Q' q- c* `                            k = 0;) B3 e( s! g0 r0 Y- W5 H
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1! m6 c# v$ \+ z3 p
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);7 _$ J' h0 G8 q
                        }
3 w. p( u, e5 c; _& w/ P                        else//输出暂时还没有改变数组元素的值6 c# Y/ c4 q+ [
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
% M3 F7 F% m8 i; Q" T                    }+ a% m+ Q3 h, I& I$ @4 E! s& M5 J
                    else3 n6 n! T; w& b( d0 j0 O
                        i++;//数组元素为0,直接跳过,不计数。。。
1 J% w+ G7 |# _, i. L% `                }
% _! u+ u( l! I* V1 {: l
7 |; T; v  D% E& l! ~  J2 v7 [( s- l# N# u# f# F* v
            }//结束while循环
' ?' V, K& u# I  c            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
; Z9 F( h6 `* a; n' P" T           " r+ ]! X6 g  ]2 D+ s" N- t0 ^# a
                if (numw[i] != 0)" T' B% j4 d8 v" A( _: Z
                    Console.WriteLine(numw[i]);
/ ^2 {& `9 z1 _- p  R& d           % l$ V. M8 z- m7 T: O1 j: ~
            Console.ReadLine();
+ r* G: N. J$ q: V( T        }
7 Q1 L2 B: |; a4 A    }" ?; F, a  |6 H- w8 ^
}2 a5 k; i3 b6 D8 f# G, @6 @
小甲鱼最新课程 -> 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-5-28 10:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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