鱼C论坛

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

猴子问题

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

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

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

x
大家好!1 v# C5 g' X6 B# i! v
这几天我在忙着编一个问题,我用了一种方法编出来!
  D6 [$ E6 ^# J9 ^) ?# y2 [但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!6 K. A' T$ q( |% K7 L" v7 c( [* t
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
5 }3 ?1 V) J. z, b$ d- C; e- d+ n- @: w# n

% H! x; w- v- Y: |
                            题目" k$ v4 w. |- K2 v2 W
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
3 e% Z! E# W+ h第一种方法:利用循环链表
# b! F9 @% M+ N#include<stdio.h>
: A8 M/ f- Q/ v#include<malloc.h>
* ^; p. T) |; C1 @# a#define M 8            //共有8只猴子
, c8 e+ `; r1 u; [1 T#define N 3            //数到3只时退出第三只
. ]. d1 L* J; q/ C' E7 F/ ?typedef struct monkey
9 t' c* T+ e" O# a0 r& t{int number;
) U: D( u6 L( Sint flag;
# P. P, K7 Q% A% Cstruct monkey* next;
1 Y. C0 ^# [+ m1 \1 v}MONKEY;& y6 ?2 F, C0 M) x7 z
main()- Z7 j* G! y! K
{ MONKEY *head=NULL,*p,*s;
: @  \  I# W! ]7 k1 U- Q8 K  int i,sum=0,count=0;* U$ T! b/ Y. ^3 h
  clrscr();              //清屏
1 k$ y  ]# ~4 a) x8 E+ A9 |  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
, i) T5 A$ o* y: E# J2 S2 S' {4 q; e0 V  p->number=1;p->flag=1;1 l, U( B. {6 r2 U
  p->next=head;7 }! Q4 B6 x* C+ {& t9 b2 V) ?+ G
  head=p;
/ U: V6 B" o5 r- S/ C' d  for(i=2;i<=M;i++)' }' a( u2 a- o/ p
    { s=(MONKEY *)malloc(sizeof(MONKEY));0 f4 ^; s% Q0 o! y8 u- V0 x+ T
     s->number=i;s->flag=1;
% p5 C0 h2 r+ b9 B" U1 m     s->next=head;
8 t6 M( L5 q0 J% d     p->next=s;p=p->next;. L7 X0 U4 V/ T2 o2 k
    }2 U; o* _+ H  g
    p=head;; \8 }7 B, N; f" o3 e
   for(;;)
2 T$ J6 g/ \& D$ }    {if(p->flag==1)" V( z$ V$ c% W! r
       count++;
' t: |4 y" J# D$ H$ A/ r6 z1 k     if(count==N)
6 `6 Q. v, c" S4 H        {p->flag=0;
$ n3 d" f' A& w3 t& D3 m         count=0;
8 o5 A" D8 k! v" ^- F/ o6 x         sum++;}8 l. T$ v, r8 Y
     if(sum==M-1)
8 d5 A: D; E7 U% X, v6 {# f        break;
3 S5 A" J% q6 E3 ?9 ^" j: U. J     p=p->next;$ O9 ^/ t/ G$ k7 B* m
    }; m/ G  Y2 B3 n3 ~4 p  f2 ]2 O
    p=
  X  z; Q' S( y1 y# G) q    head;
2 y6 D% c' w) Q8 c    for(i=1;i<=M;i++)
5 {) i% I- T+ F! ?3 v! @1 F    { if(p->flag==1). d) f+ q6 j4 d, R( t+ g; v
        printf("\t%d",p->number);/ }( [' b% R7 {  m1 {
      p=p->next;+ P9 f* w# `4 x& ]& h+ D* }2 O
    }
# {6 g: m% `6 S, K1 P6 W' D" A( L; y1 z6 ]2 @, D) K7 t5 b4 C

( u$ p% S; o0 \! _
' i* z0 G; D4 K+ {* Y7 ?! I9 w  R}

" b2 ?) g5 `0 f6 p; i第二种方法:数组
, z! O: g( P- o2 k6 r+ r#include<stdio.h>: Y2 \3 Z# g. k! c- L; f
#define M 8
) C4 d( K3 u( [& C7 ^/ Pstruct monkey
" x$ I( p6 N7 R/ t" F3 M{int number;
6 T- q; q: K( r! l# M: B. vint nextp;0 D3 m+ o0 i! i- f& W
}link[M+1];
& H9 }9 M% Q1 I3 O8 }/ J5 y! o: j: b" t* N6 `1 K, k: g4 T! W5 `0 W
void main()
% e; W& S+ E" |: y3 z{int i,count,h;+ f% W: F4 w* T, o. e# p
for(i=1;i<=M;i++); T+ R! H3 q9 i% u1 i0 o3 ]( e
{  if(i==M)2 M3 |) M9 e! T3 e: t
   link[i].nextp=1;& Z; }+ y0 h) I+ R& K* m9 \% O
   else- ^% U" m6 M! R8 G% d9 r0 ^  \3 f8 H
   link[i].nextp=i+1;
0 g, o, z2 G- N5 N6 E5 w  link[i].number=i;
# V, ~8 |1 y) u1 K% x7 I+ ^}( [# s# D4 P7 \4 B2 o# H& A
printf("\n");& U) Q8 p; e% _% x& ]
count=0;5 L5 ]; H9 Z1 G
h=M;
% t) x$ U& l; @printf("依次退出的猴子: \n");' [7 S4 a; {4 P/ v
while(count<M-1)" X8 x" d/ ~" {4 H. s1 y$ n
{i=0;, q. O1 s% k9 R4 n3 C
while(i!=3)2 J7 T' g) @9 f8 p
{ h=link[h].nextp;
$ ^. F; K8 E  I) W7 R5 @   if(link[h].number)
5 K# u7 w6 ^; U. d7 k' }; Q+ s     i++;}
4 f% O) i% C* w9 o' c3 Z
3 t4 H7 g/ H8 z- v! T: vprintf("%4d",link[h].number);
8 v# x" j- A$ V2 ^link[h].number=0;
& Q8 Q9 q  E$ W5 Y8 Kcount++;0 \. A' M# M0 D( U6 u/ A( f" m# s
}2 B" {7 ?$ B5 k+ }, b/ W
& M0 d0 h& R# v7 ?& M% |9 A
printf("\n大王是:");0 L3 h7 T) O. g6 v& D& S4 ]
  for(i=1;i<=M;i++)
- @7 k) w' C& ?" s4 |  if(link[i].number)
: o, ?0 E3 ]5 l% z/ A    printf("%3d\n",link[i].number);
& {9 \+ f) [4 i8 _$ f
! v. c$ V+ f, ?, u) B- X: R4 O6 t
; n# ^+ A7 ]( ^, @' D3 h4 J}
* n* d$ h; J9 {5 _
第三种是普通方法for循环

" ?6 `/ Y$ I4 b8 M! u0 C/ ~#include<stdio.h>2 ^) [& H, I  E' \# U2 L1 ~2 r
void main()
# J. {' o# [3 A2 Z; ^6 Y) U{ int i,k,m,n,num[50],q,*p;
! \, r5 R+ ^, k7 ]% B6 p. C. v    clrscr();
  e$ z0 S+ x. @* k; u   printf("input number of person: n=");) k( J! \6 i2 d
    scanf("%d",&n);% ^1 A" q$ v. ?. \" _4 E
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只0 C& K! N7 Z% c: ^
    scanf("%d",&q);
# t- W6 t4 ?3 z0 @   p=num;& ~1 c+ v: P- [6 w( P) x( r3 y/ v" U
  for(i=0;i<n;i++)
9 r0 M' l$ N& T* A* C# D    *(p+i)=i+1;7 w' g5 n/ l! b/ V& N- p/ `3 q1 J
   i=0;
# O  g0 g1 m  _5 o   k=0;5 [  u5 o/ C' S3 ?9 R( A* e- o
   m=0;
$ f; e1 J1 g! s2 {. @! q  while(m<n-1)
$ I$ Q" ~+ i3 G9 ~" I+ }5 d& r* S   {if(*(p+i)!=0) k++;% `" f3 h( [. E. R6 i
     if(k==q)* o. H- u6 j' u' [% m5 |% p
      { *(p+i)=0;2 T" u  ~4 Q2 y. u
        k=0;
* e0 D# e! s0 f/ o8 o! E        m++;" j& k( S0 T8 W$ n) y  T
      }
& g1 `  M- c# l. m    i++;9 `) ^9 W0 C- o4 I9 |4 Y
    if(i==n)i=0;
* D6 m+ z8 A5 C4 B; o3 D, h   }" f0 m% V# i# A: d) A3 w; W
  while(*p==0)p++;
0 J: C+ k6 ^: y8 I, j9 X    printf("The last one is NO:%d\n",*p);9 e2 c* W% f( |# h( L9 {$ C5 n
     getch();7 F* i, c) R7 C' Z' u6 l; v" v! T
; ^' X) W9 O1 v* m: u2 [9 |% B! M
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;" g2 m, Z: z6 `& \
namespace 又费马达又费电6 M3 ]7 f# B! B) {+ @# u" \
{
4 Y% L1 ?, w" ^+ C! s% p1 z    class Program% }8 b! X% T) t- V4 _4 I9 J9 \
    {6 _/ j! R" P8 R4 O
        static void Main(string[] args)" j; @6 b4 c1 @
        {4 O7 c' o8 k; v  z) n7 a1 v
            int m, n;2 h+ j% f; Z3 |4 f4 u" @+ Y% N: a$ E
            Console.WriteLine("请输入数组长度");
" U3 a2 e' k. F5 W1 ~# \% {) n5 O            m = int.Parse(Console.ReadLine());//m为数组的大小9 ]# G8 Z( {* [  Z
            Console.WriteLine("请输入要截取数字的大小");* _# N8 @$ u- ~: G
            n = int.Parse(Console.ReadLine());
# d$ R( J# }, @: b) S1 o$ m7 p5 @            int [] numw=new int+ M; o" j+ O) T
7 W7 [( x7 K, c( W9 ?2 H- D' c# l: g
&shy;&shy;&shy;;
" G) P" z# q9 u) s            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
+ l- d( r8 f' }( s            {
! m# G/ F! T* A                numw[j - 1] = j;. u- N# T0 j% j+ K$ A
            }
$ j" Y5 f8 ]* ^( y7 A. ^! f            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
8 O: h4 L- Y# c. R4 x            while (d != m - 1)3 I+ o6 ]3 p( z5 @; i1 f( N# N* r9 h8 i
            {
" y  ?- j; J; j6 `; E, p6 X& L                if (i == m && d != m - 1)* P9 Q+ e# D1 \5 V  p
                {
+ o7 C" L7 _  t. p                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
" R' v7 _0 u3 r0 d3 ^; k                    continue;8 `1 g1 J% l, E7 i+ R
                }
9 Z& l( p7 _) `8 U$ ~7 t+ `# [6 B                else
8 t& K, f: G' N$ b+ e                {
5 \( G2 B" [0 {- e2 L2 `                    if (numw[i] != 0)7 g% \8 n; f. M* q$ e: W
                    {
8 l  d( Z& S2 v( U( B                        i++;$ \* H$ R) S( L1 ?% D
                        k++;0 S$ t: w9 Y- V; k# n+ P9 a! ^
                        if (k == n)
2 @4 B  Y2 E9 \2 t                        {9 u# k+ l5 p6 e2 D2 g
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
8 J8 E7 E1 A0 A+ E! P7 ^                            k = 0;; f$ y9 A* R; k2 l, m6 o* y. s
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1; {" Z- U  _2 r  r0 o4 Y
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
' Z: A% E' u* K7 r1 Y7 w                        }. `6 s9 W, }/ ~
                        else//输出暂时还没有改变数组元素的值
3 |6 O$ {+ ~; w5 P1 j                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);2 y6 R, `8 y5 j3 C* [: G
                    }
4 p* H$ ?$ W5 h5 N' ^) [+ \! V                    else
! e5 _6 \* U' l3 a. A                        i++;//数组元素为0,直接跳过,不计数。。。; @( [5 c. ]+ [. p* \
                }
$ a4 \" c* k% {
# ]& n- j7 N* U- G6 ]$ Y# e
% f4 Y. S: [3 p  R. X            }//结束while循环
& J7 z' x$ i* f: J( h8 ~            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦  f6 L- G! Q, G* \. u% P8 g: U
           0 O8 G0 h& q0 ]1 l* y" h* }& r# E
                if (numw[i] != 0)
- L9 Q9 _) B' G                    Console.WriteLine(numw[i]);
9 v& w3 J; p1 L4 \7 O; u           . F7 S3 ?0 |0 r! U: A. E# V  p
            Console.ReadLine();9 \( y. n2 G3 t% m
        }
2 p  }2 x; z1 {% g    }
& ]& j2 q4 @. n/ }1 g- K& v}
, w4 n" V+ I% r) D
小甲鱼最新课程 -> 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-7-22 15:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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