鱼C论坛

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

猴子问题

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

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

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

x
大家好!
9 S. ?4 A: N7 X9 j" ]5 j8 `1 V这几天我在忙着编一个问题,我用了一种方法编出来!
8 g) B$ e% m0 P, g" n但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
8 ~7 w6 Z  [/ k" [0 `# }& |4 O注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 - b/ q9 l1 M. I7 @4 M, U% b( B

# L! d& m7 v1 x7 h  ^; l. o; ]/ p9 ^/ `; A& F6 L
                            题目
6 [( ?7 H4 a) |! m! c山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。4 b9 u5 w8 b8 o: c4 K
第一种方法:利用循环链表
& y! \+ t7 p) |/ ?2 c3 e5 Q  l- M" J#include<stdio.h>
7 j0 E7 v5 N& F! e2 G7 K#include<malloc.h>
  J% b4 \3 K" F. K9 V#define M 8            //共有8只猴子& ?( {$ C( [6 v! s+ n
#define N 3            //数到3只时退出第三只" @. B; e3 m3 L% f& f$ m
typedef struct monkey! l5 }7 N# e( D  L. ^# X& c/ f
{int number;
7 A$ N$ [8 l3 u4 `- A3 h5 Zint flag;
$ Q' w2 t3 l. G9 |+ }+ z5 Q, |4 Estruct monkey* next;
, Z2 r, E. c; w7 Q}MONKEY;/ e& D# Q( t: ~8 r
main()
) t# b* N1 P2 e/ I- d7 z2 H{ MONKEY *head=NULL,*p,*s;
8 H1 M" x/ ^: i  int i,sum=0,count=0;
% \7 \# Y9 q& C, J% M. |  clrscr();              //清屏
: |4 A) R  E' ]  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存# Y5 Z9 j) a5 }! E; F
  p->number=1;p->flag=1;' L3 J4 i- @7 [6 t* X
  p->next=head;
, `  G3 Y* U" K: a  D% N  head=p;( @+ m) U! \+ W
  for(i=2;i<=M;i++)
, @! \9 A- Z. p1 J2 j    { s=(MONKEY *)malloc(sizeof(MONKEY));) A# b  b+ ~; R# r9 ^
     s->number=i;s->flag=1;' d+ ^8 N9 {4 y
     s->next=head;
* x8 ]4 {5 J% A; U! X' \     p->next=s;p=p->next;' E* q3 p" G# X# t  g
    }
9 n- F. a9 F' T# g    p=head;5 t4 m1 j( ]9 K; c/ Q% I
   for(;;)+ V! T/ U* k3 ?
    {if(p->flag==1)
" t8 @5 G/ a4 ?       count++;. G6 Z1 l( B( d0 g& ~# }
     if(count==N)( p6 o, x0 w& I# f% u
        {p->flag=0;$ C$ W9 Q. S- P8 ~! H* B: O' T, i
         count=0;- I8 i6 t# v$ }# T/ K
         sum++;}
7 [. S; [- ?- A. Q7 i' b  h8 n  Y     if(sum==M-1)
7 _$ p. P/ |" B/ M6 `        break;
9 K0 a2 C! b7 X* F7 i     p=p->next;4 x8 G8 p1 ?* |5 P
    }  I$ {& ]: ~  \! ~9 Y( D1 z
    p=) C; Q# T, S( Y$ x! l
    head;; c2 s3 O. v0 M' K
    for(i=1;i<=M;i++)& s; f( s. p- O1 _+ V
    { if(p->flag==1). p) y5 v9 d) g
        printf("\t%d",p->number);
2 p4 `1 M2 J7 v3 ]  \; U& y- T      p=p->next;
6 s9 v2 y1 ]: L/ a' u/ W  F4 M# f4 b    }5 \/ ^5 ]* U2 n# [5 a7 @; |  N0 z

/ `, y4 o2 w1 A) u* S+ y7 I6 D3 O0 A* U: k- t9 E5 g9 F9 b3 F

3 E/ U( y- W$ U}
6 }$ j+ x9 s" g3 M( q! W4 t- R
第二种方法:数组
( u6 A, b9 h: S) j3 s/ b#include<stdio.h>
" q* N, Y2 |) T5 }5 W$ m/ Q#define M 8
5 |8 m  Q! i; l0 zstruct monkey
: X# _3 Y9 }. T1 W" h& S# B{int number;0 n; B7 s$ Q. M& w
int nextp;+ {* j7 f0 G2 Z9 V4 `3 p0 }6 G8 r. k
}link[M+1];
8 B% s+ Y9 H; z3 n, d8 b+ i% `( }  {& P0 {* `0 u# H! [( L
void main()
$ ~- {3 D. X( Q{int i,count,h;
3 d- R% W6 n6 M' Ufor(i=1;i<=M;i++)
3 o# n0 o- x! t- o; z1 Y+ m{  if(i==M)
1 T3 t8 t: l$ X/ G* Z# U. l8 w   link[i].nextp=1;1 }8 n6 B$ r$ t0 e* p  Y
   else
* l' X- ]8 u, b: N3 Z- ~0 s   link[i].nextp=i+1;: j0 x2 y! u& R) P: H
  link[i].number=i;! {, A9 I7 ~7 h  @: ~7 ?: }# J2 j
}% \: N2 Z$ L( W* e) r5 s
printf("\n");" T( o* }( T. u( B' Y
count=0;
5 D2 N( T/ H3 X$ K% f' _" rh=M;( V( c8 h! A: o2 ^
printf("依次退出的猴子: \n");
9 i. a5 w5 h0 N) \$ D3 Cwhile(count<M-1)7 J2 s  k* q2 n$ _4 I$ W
{i=0;
5 O, @1 k$ I" N6 e. B# Twhile(i!=3)# i$ R! [' H0 q8 z8 S
{ h=link[h].nextp;
3 C2 w: p0 X" X   if(link[h].number)5 ^3 }( K1 x! N( M) p+ ]( s
     i++;}
/ z+ P7 s4 X$ {  M" A# D. |7 a2 l# R* t& l2 W5 @1 y) Q
printf("%4d",link[h].number);
! [8 ^9 n% p) Z( O  Q  @$ klink[h].number=0;
7 G$ i& F6 F9 {4 G& ucount++;
# \% e* C2 S4 i; W# Y9 A4 Y& f4 }& i}# B* N8 K. M" V) X! a9 ^7 u& I" W

& Y, T2 t% e9 l) xprintf("\n大王是:");
& h8 R: A+ g2 T. V# F; s  for(i=1;i<=M;i++)
& |$ |2 J+ o( Q  if(link[i].number). @) ?2 G; }/ B, m' g. ~
    printf("%3d\n",link[i].number);
7 B% Q" S4 @% e$ k+ p( s( u
8 H, Q- f& ?/ @
0 L: ~0 _- W* K5 w( X% h}
, l) \. A$ }, D& a$ Y
第三种是普通方法for循环

. C, W( s3 A* |+ c' F#include<stdio.h>
1 |3 Y$ V1 ?* N- s* I* G& V5 ]9 Tvoid main()
$ v8 S$ K( l$ S* B{ int i,k,m,n,num[50],q,*p;8 W1 ~% D) [) ^; @& m
    clrscr();
& U" |! D" e, P4 u5 p   printf("input number of person: n=");
5 U0 e( H# m5 U$ b/ Y    scanf("%d",&n);" _) |/ t# Q& R1 f/ O, \% A1 z1 U
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只) H+ O* C! n; f  w
    scanf("%d",&q);' a- w# v; g  u. b) j% f) L
   p=num;
; u: ?" ~0 r+ E( k% j  for(i=0;i<n;i++)
. C, _! ]! w' v1 A9 e    *(p+i)=i+1;
5 q: E8 ?/ [9 S6 }! h, y" h3 E' X, o   i=0;+ R- ^6 Q) e7 K
   k=0;/ `. ?+ V$ r  u$ }, K! \
   m=0;( m9 d) f7 L! j# d
  while(m<n-1)$ v8 y" w" Z( r% M
   {if(*(p+i)!=0) k++;
' P% Z0 f) X4 c4 L4 k$ x     if(k==q)
- Q, m% }& ]5 z1 Z2 j* E      { *(p+i)=0;
& B, T' v- z- U) M$ C8 C& Z        k=0;
& b' q2 w$ ]) O        m++;
  A9 M; L. `: `0 u8 x& W      }
( F8 o4 E- G* O. a- H% {, ]  B    i++;: g( w% y( Q. h) _5 {' A
    if(i==n)i=0;6 ~' `& ]1 [& ?+ ]& e% n
   }
1 z, M% ?8 e1 q$ r. l1 Y  while(*p==0)p++;" `9 _+ \* i1 B
    printf("The last one is NO:%d\n",*p);
' A( }0 n, y6 _$ U- z' G5 X( r' J  c     getch();
/ R! O5 _9 l6 A& T5 F* W7 O" i3 y; x: {1 o! J  F
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;7 `+ n' z! c7 s8 w; I# P. u
namespace 又费马达又费电
# o+ f' D3 f  d! J( r3 L, d{- m' q) u& r7 f5 H6 B* |& N
    class Program
6 k7 |% M  @" [    {% q2 [  R) B1 U; @+ _8 a* }
        static void Main(string[] args); O  Y) d8 v( m# E) P, S
        {
( `% q* k  l6 B& o- f7 c$ l            int m, n;
1 x1 W) j7 L5 Z7 X            Console.WriteLine("请输入数组长度");* U# W6 M- h) g1 A  Y- k
            m = int.Parse(Console.ReadLine());//m为数组的大小% m# E7 f4 z( n* X' E1 m. J
            Console.WriteLine("请输入要截取数字的大小");+ Z2 w6 U, l+ Y7 N
            n = int.Parse(Console.ReadLine());+ X; r$ {- Q0 J+ h
            int [] numw=new int/ z8 ~8 \! Z+ y5 f3 U1 ]
. J) \, `9 O  }: _# A
&shy;&shy;&shy;;2 F' ?5 D% x' O! Z9 f
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数0 l- p: _% {; V% H4 X2 f8 O# Y
            {
8 j1 G5 q4 ]2 b) d$ x6 i                numw[j - 1] = j;9 U9 I0 K2 |! m# ?, _/ S
            }6 p3 X+ T4 {4 }; E0 R# K
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
7 Y( l0 K1 P/ L' {/ A' P            while (d != m - 1), k6 L0 Y/ F: Q# Y8 {9 |: V2 i$ Q
            {
# W/ |1 ?5 r( x; y6 J                if (i == m && d != m - 1)
0 e7 x' t9 w# S% B3 m+ Z                {3 x. v6 K7 ^+ h( y" [5 o9 k- W& {: s
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!) F3 t& k' D4 Y" e# ?
                    continue;
( X' k" A/ y% o! u* b4 k                }
1 y+ s4 L: E- o% g; c; \" c                else5 u  W  F: @( Y+ U; K" ~  q# \0 M) |( g
                {
8 }. R# i8 t: X& \                    if (numw[i] != 0)
- @/ c- o, P; v% @' e7 X: ^3 E                    {0 d* l3 O8 \% |4 ^* m9 H* u
                        i++;
7 x6 \0 [3 j) V6 {& P" w: s                        k++;
( ]6 t3 K! r- e& G: c+ o                        if (k == n)
8 q* h+ i3 h3 W# ^/ K. Z6 |/ c5 Y                        {
& @$ I# C8 o5 m' y( m# L6 t* L: i                            numw[i - 1] = 0;//把在n位置数组元素的值改变了1 B" B% f3 O* ?- f9 U
                            k = 0;* b+ [7 T6 U4 W( J
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
7 X0 S- D# n' u8 R& C0 {: |# }+ Z                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
. _7 M7 P! B6 p- w- Q& I9 u) ~& S# S                        }
7 c: W7 F/ F" v# J0 C; J                        else//输出暂时还没有改变数组元素的值& ?. X  R" n/ Q
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
- k) i" l: U( w9 |1 m                    }
0 {, Z* X3 ]/ ?3 u1 V1 \                    else( \. K9 g1 Q# \
                        i++;//数组元素为0,直接跳过,不计数。。。2 _. @$ z2 ~4 _/ _
                }" }  u" T: j2 V' e: y  _
6 v$ k2 N8 ]+ ^" w0 t2 F7 y

6 O8 K* T  Z) `0 s8 Y4 e$ |            }//结束while循环( a! j0 G$ i0 r8 Q1 F
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦8 |: o0 i0 K  d. A, N& @
           
' @, p! @* s  Z0 Y& F' |" m& i1 o                if (numw[i] != 0)
* a1 W# c; L- |5 i" L                    Console.WriteLine(numw[i]);1 g; y- r+ @1 ?0 Q' b
           " S$ x9 B( x( {/ G
            Console.ReadLine();
! D1 E% h8 a$ l. _4 o        }: H6 }7 o1 N/ D6 d0 Y8 g" K- U4 H
    }" |: o6 D1 M, S- z4 i  E- o
}6 x* P: c3 H: ^/ H4 {+ j5 S; t
小甲鱼最新课程 -> 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-4-19 11:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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