鱼C论坛

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

猴子问题

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

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

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

x
大家好!
/ r# G) f0 ?3 ?0 e这几天我在忙着编一个问题,我用了一种方法编出来!7 \" D9 x6 q+ Y
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!, d2 z$ K, e* u! u1 ]/ E- ?- x
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
6 W- T. S" w; ?$ S* w! @' x
3 I4 [+ s5 b" |4 @* Q
4 k5 M; P* A0 V: q+ q) ~
                            题目
2 Z* L- l- |' A' z" m2 s& m山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
* k0 J3 u5 w1 P第一种方法:利用循环链表% o( {1 k, K6 T8 [
#include<stdio.h>+ G2 {: C' |% C
#include<malloc.h>/ ~: \, G: n# K& ^* d
#define M 8            //共有8只猴子' k. r) K: f# W5 u" m* h0 a
#define N 3            //数到3只时退出第三只
  g1 `2 m$ T/ ~/ `  l- xtypedef struct monkey
+ D2 z2 j4 V* P, Y5 q- }* j2 L{int number;
9 n6 @+ s# X# Z% q; r9 e- iint flag;0 c! M! s5 F3 a; X4 q+ K$ ?
struct monkey* next;
+ z6 x& |, k& r1 i' M, A}MONKEY;
) B% b* N* v  }2 W$ }6 T! B8 fmain()# o$ K" G" ?6 [+ x+ T, M1 Y% W
{ MONKEY *head=NULL,*p,*s;
2 B, Z/ z1 r1 z$ x8 U9 o  int i,sum=0,count=0;
# }9 P0 q  ?0 B  clrscr();              //清屏. \, A4 r* ~- c8 N/ Q+ _7 y
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存. n" E9 K; y% _7 Z* I% l
  p->number=1;p->flag=1;2 l3 D7 ~% k2 ?" {3 }' ]
  p->next=head;, O: I6 y  @8 D& y4 R6 ~7 s& y
  head=p;
8 I/ R* c9 V0 c, j  for(i=2;i<=M;i++)
2 g9 z" j" S* P2 e' W- c    { s=(MONKEY *)malloc(sizeof(MONKEY));
0 q! L% C6 D. K9 Q1 C$ T3 g     s->number=i;s->flag=1;
. ]6 H( K4 s' w4 @6 V, l     s->next=head;
( D( s& ?' O6 c% y     p->next=s;p=p->next;. `. R  `6 h" v- ]5 W3 J
    }
2 z- C. i$ Y4 A% g0 _( Y* A    p=head;; M8 d: b  ~8 O$ B' Y" S' x  j2 P- A
   for(;;)! D# W" H( p' B, _9 B$ g: r. P4 Q
    {if(p->flag==1)
5 C/ N# L. q) e0 I       count++;; ^% y) X7 W( d! n
     if(count==N)
2 I( a% G! ]1 U; w" S# X6 G        {p->flag=0;
. n6 h9 |2 \& S         count=0;
) i/ z" i5 ^* o0 j5 Z         sum++;}  c/ g$ C1 k6 b# P% Y
     if(sum==M-1)
* G  ~- Y) x* u- k. W5 u1 ]        break;
0 D4 ^' x0 i- g% j( P     p=p->next;- j1 V) N, Q# }. i5 @2 Z4 c
    }6 f! a3 q1 s: h
    p=
+ V5 ~) {+ V4 i8 n    head;' g2 O: ]) S# D
    for(i=1;i<=M;i++)# W/ _) u& v6 |1 i1 G- N/ q( v& K
    { if(p->flag==1)4 J, @# J' m+ J9 y) r% H' M7 Y
        printf("\t%d",p->number);- W$ N3 L- h  Z1 t! P0 S' K
      p=p->next;
2 ^4 E2 z! A- R, p& Z$ y    }
! ]9 G8 f5 t# m/ S, M
. I" ^7 W9 U! X0 I8 P6 y; g( P5 ^( L  w
  D+ W& O0 y  e9 N
}

. B  H" r" Q* q. A! F第二种方法:数组
# n) j6 P6 u; x* k: E#include<stdio.h>
3 i9 ]! d  J# x; E- \. D#define M 87 t9 v+ I2 t: R2 [9 `4 x
struct monkey- i5 r* Z& \6 Z; f  T
{int number;9 d: N. _- W; c0 S
int nextp;
7 F7 O: O; p4 s% Q9 L- f6 j) W8 O}link[M+1];. q2 N5 p) R: K3 m6 p% a
, C5 \7 D5 V% H2 T% @% A
void main()( J/ Q7 r# g! }6 b
{int i,count,h;( K6 r5 N9 k, i" m& E6 \
for(i=1;i<=M;i++)
4 r/ Z& `  ~; q$ F! V; |{  if(i==M)) i: f, v# G  N  a3 k
   link[i].nextp=1;1 c* x; t7 A  }+ L6 d5 R
   else8 N/ Q( {$ e/ K2 E/ T+ y
   link[i].nextp=i+1;
8 h( c+ z, L6 e5 F, N' w  link[i].number=i;
+ n% ~4 a* A' S% ^* n" J9 S9 a}4 [' F. T& n3 E2 `4 c+ ]- }9 J" _
printf("\n");
! y7 F9 H1 m. gcount=0;
# O) K+ }4 O& P8 ]) A; |0 Oh=M;
1 ^) s( O/ Y+ [5 Zprintf("依次退出的猴子: \n");
8 r4 q' ~2 n, k. ^while(count<M-1)1 L6 @& ?6 `, s" f
{i=0;0 j- M, P# p9 g& Y
while(i!=3)
, p, G. D1 J( d; d% H" w- T- w{ h=link[h].nextp;
$ s* y) ~2 ]! W0 \( K0 H8 L   if(link[h].number)
, L$ ]# i' l* l8 @  d     i++;}
3 m' h" g) u3 n3 x$ L) v4 N0 `+ S
8 B% D& q7 @4 Qprintf("%4d",link[h].number);1 _) ~/ S/ T( o6 [
link[h].number=0;
" L; V2 R0 d8 b/ e% y* c& Tcount++;
2 ^! z: |9 M1 n1 y}
6 K* K# J: N+ s6 R- F6 D
6 T( h  d; W2 a& D3 ^0 R9 [2 K. zprintf("\n大王是:");
3 z1 I, S) ]- T% R  for(i=1;i<=M;i++)& V& r! v( ~! @8 ?1 d+ _. v! G+ V
  if(link[i].number)' ?* ^& b/ _6 w6 I$ ~2 Y
    printf("%3d\n",link[i].number);8 n' Q# r- o6 I# y7 \5 K; f6 t

- F3 O" S6 d- J1 h3 H# S7 \3 @. i5 B7 ]  E2 s( j1 X
}

- t- G: _6 C' a) ~9 y( S+ f第三种是普通方法for循环

0 R( I8 E; @+ o3 I# y$ Q: e#include<stdio.h>
: L+ ^2 e8 g" Q' M6 X5 a- t3 R6 Fvoid main(): Z3 ?0 k9 I% Z+ @, a
{ int i,k,m,n,num[50],q,*p;
. j% k0 T6 `7 Q1 T. d    clrscr();
3 f) c6 m' D+ T# h5 O$ M   printf("input number of person: n=");- L2 ~1 m3 A; x2 M6 j6 k$ v/ r
    scanf("%d",&n);
# D$ p, i! Z/ Cprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只' e, H$ r3 W3 i- @. q4 E3 i$ |( X- o
    scanf("%d",&q);
/ c. V1 O. {0 A& p; O- Q: e   p=num;
9 E- e1 G( ^! x7 m+ [- @8 t+ ?$ S8 i  for(i=0;i<n;i++)4 j5 B/ E3 w7 |6 Z# Q) J
    *(p+i)=i+1;
9 F& _) g$ A$ w. B/ J6 q4 b+ G/ r   i=0;3 r+ H+ A9 b* u7 {3 b
   k=0;9 R7 b# f8 ?% c, A) g9 u
   m=0;
- ~. }( N2 Z; B" T% e4 V  while(m<n-1)6 t/ e9 Y! [) Z. B
   {if(*(p+i)!=0) k++;
# B% e6 y6 W: r$ g7 \' f     if(k==q)( Z. s/ D) A- |8 Z  G, G; ?
      { *(p+i)=0;
1 h* L1 m3 c5 j+ @        k=0;* Y2 F# G4 g- Q9 A
        m++;! W7 N9 D0 H( {1 S# E1 a9 w3 Z
      }" i0 O, @5 M& L2 D: p) O7 O. W6 d
    i++;
; k1 }/ z1 z# I5 \4 e  ~" _" {$ ~& D2 n    if(i==n)i=0;
# e6 N9 x$ Q4 z! n% I! L8 |7 }   }
6 E; N  Q$ y; m7 Y3 b* _' j* b$ P0 q  while(*p==0)p++;9 Z- ?2 v+ J$ W6 d% K& b
    printf("The last one is NO:%d\n",*p);
% e' c. l1 v7 p- e& P     getch();
5 h. b( W* }! i* Q. O  B' }) Q; f" ]2 v1 c
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;1 l0 D! S* Y5 m2 B  Z5 m
namespace 又费马达又费电8 S8 Z7 T" K, s; t& g% x0 V
{1 I$ T0 X% q) }1 s0 E! }  v8 B
    class Program
4 O, |0 r" R0 q  G% y, `( t    {8 B2 }# Y( |9 H( K5 N1 ~' A
        static void Main(string[] args)
. q+ o3 |+ N( B$ Y( o. O  T% b        {
$ r% k3 i$ c9 f. O            int m, n;
5 r$ P6 L: M# a( W- Q& L            Console.WriteLine("请输入数组长度");9 X/ [- i; D' i3 d
            m = int.Parse(Console.ReadLine());//m为数组的大小" T0 T6 y; M$ I, r
            Console.WriteLine("请输入要截取数字的大小");
* I# x$ y9 h% h6 b; _. }            n = int.Parse(Console.ReadLine());
, K8 g' R7 u6 v- a: i2 J            int [] numw=new int
7 F! v6 s1 ]7 ]% M7 N; q
+ y1 E: o/ N% ^: B8 z4 @) K&shy;&shy;&shy;;$ K8 W3 o9 a8 z/ k
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数. r' l. K: I* \
            {
# D+ N* t: K% Q( C1 ~, V* `  L% d                numw[j - 1] = j;- B9 X( p$ h. }8 J
            }( e! e2 t4 B: |3 l
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
+ a) L& i6 Y. ^            while (d != m - 1)8 A( @! Z$ I! w, ~: m
            {2 i. p% H8 L  ^7 U6 x3 W3 x0 q7 ?
                if (i == m && d != m - 1)
3 F7 T: d* L+ j7 C                {
+ l; c/ R! v9 A0 {6 s                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
8 W; {" u% t; |' x. W/ Y3 Q                    continue;7 f+ q7 J4 u5 t& C8 W, T6 m5 X8 E( F
                }
3 F$ G  A# r/ x8 E; V2 Q8 n                else
: H8 g/ K6 I& M! [' b/ {! i                {
( f4 l* f: D/ ]                    if (numw[i] != 0)
0 T0 K* a* R% ?3 u3 O+ C: x$ {% ?                    {
- H' ?; p3 P0 x, ]+ D                        i++;
4 S/ Y6 k3 {6 Y                        k++;
, I; o% e; n$ A; p                        if (k == n)
; n0 H& h3 t" z4 W+ w% S6 Y                        {
6 \8 J/ x+ i6 q2 q% x( l* m                            numw[i - 1] = 0;//把在n位置数组元素的值改变了2 I! O. {) Y# s: N+ B! d0 D
                            k = 0;+ g( e$ m: t  i7 M2 |4 b
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1! h4 f0 N! u1 _  z/ h8 e
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);$ C4 a& o$ T+ @5 A% J% @* g2 @
                        }
7 E0 f# d! `$ J, ~1 k! c9 ~/ s                        else//输出暂时还没有改变数组元素的值
$ z1 A: b& _; O* |, F+ D5 E' P                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
$ G4 t1 Y* L9 K* b2 a/ o& b                    }
% w3 t& `- \1 o$ [3 s$ e4 _                    else6 L, A! T, o( l9 h# G
                        i++;//数组元素为0,直接跳过,不计数。。。
, P( W8 |5 Q; x) f5 s. Q' i% D                }- ~, S! {) j2 Z/ O# N" ?
3 @4 _! `1 \* G. _5 b  z) W( w

; b* {) J8 _" ]            }//结束while循环9 Y% I( s3 z. U8 M$ o0 X7 n5 Q
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦) O) }9 S3 F( q% Q3 k5 S  ~
           
* K2 J. \- x( |9 E: I% E/ [' S5 l                if (numw[i] != 0). C& z2 @5 ?% P- x9 q+ K
                    Console.WriteLine(numw[i]);
0 l9 z* i& d" c: r0 C           ' p& b$ g( E' K, h( b# [
            Console.ReadLine();! ]. s- {! q" f8 s& e' J8 k/ r
        }3 R7 i, n; c' t' }. M8 D4 w2 L
    }% r! P. M6 h3 ~# x
}
$ {$ Q3 Z3 r% ^6 X2 K) a- U8 }3 s6 N6 j
小甲鱼最新课程 -> 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-2-8 06:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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