鱼C论坛

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

猴子问题

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

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

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

x
大家好!
7 P8 ?5 w" L# T9 @3 W1 I; n8 c+ G$ U这几天我在忙着编一个问题,我用了一种方法编出来!
0 R, o6 W7 s0 ]3 \* v0 N但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!  r" k# {# Q, |# ], J
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
3 `2 x2 L6 f2 ~' C2 R& y
/ w8 G/ I! \6 Y, l. F
. L0 [. a% ^0 b0 S
                            题目
6 M; b% @$ |: V: y3 w) c/ Y' f: P山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。  R- l/ B  b5 E8 n0 I
第一种方法:利用循环链表
4 D, ^; T- O9 p& V- O$ t6 n, q#include<stdio.h>
3 Y3 i$ x* i! m# m1 h8 {' J4 S0 b#include<malloc.h>
' B3 J2 [7 U8 ^" q  o#define M 8            //共有8只猴子
# X3 i! M6 t$ ~6 C#define N 3            //数到3只时退出第三只! V" r  H5 _& t1 h' _
typedef struct monkey
2 X5 [3 Z1 _; {; L$ s0 \. ]1 ]{int number;
; r" H) `* B: u; I0 Aint flag;( ?) [2 l# ^& L  \) H, p9 I
struct monkey* next;) z, y1 O: I/ ?* ~
}MONKEY;+ |2 A! X# b. O: X
main(). n6 g% Z# P) n. P# m
{ MONKEY *head=NULL,*p,*s;' r2 `5 q# Y; f" g' ~( p: b
  int i,sum=0,count=0;2 }1 s+ e* O$ C& C, e
  clrscr();              //清屏
' k2 j! r" _; p/ H) f1 o3 r' N  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存& m2 U2 T/ h8 e  O
  p->number=1;p->flag=1;
6 J. l! c& B( I3 X  p->next=head;& F/ }4 n7 V/ {0 B6 o
  head=p;# |$ u' h& r6 h- y- ?
  for(i=2;i<=M;i++)( H, B% Q* k. D( c9 N
    { s=(MONKEY *)malloc(sizeof(MONKEY));' Y2 z, Y" f) y0 q5 k- B4 N1 w
     s->number=i;s->flag=1;5 V8 B9 [# t5 p8 Y  A, I& x; |
     s->next=head;
$ e5 l0 O- Y. q) E/ H0 L- k+ R. Z     p->next=s;p=p->next;
5 x7 z2 f8 L4 J$ l6 r2 z    }3 k. p  B9 B4 |" J  Z9 \
    p=head;
* v9 R/ Y* Y" h6 U+ p   for(;;)
- E7 ~  r8 @6 c  L! V: p    {if(p->flag==1)
7 q9 _7 z* I6 c( s       count++;
( R8 ^0 \: j7 |: b& c% g     if(count==N)# M# D, s) y. `* ]$ i. S% `
        {p->flag=0;) n! g6 `9 |& O
         count=0;  O) p# O8 c2 x* e' |
         sum++;}8 r, N7 v! F0 d
     if(sum==M-1)
: w/ W+ X* D; g6 Z3 v        break;: j7 }1 q2 m, x! Y6 s+ i5 A! h
     p=p->next;8 g- s3 m, `9 s# i9 n/ W$ o
    }
8 ]  d4 N% ^  Q* Y    p=
; g. l* t* x! H% z$ B    head;' N, m3 `* \( x& d; E
    for(i=1;i<=M;i++). ~" N. d! k( Q+ \+ e
    { if(p->flag==1); J2 a2 x) }6 d; p- z1 `
        printf("\t%d",p->number);" n& V7 o+ i7 K2 o" w: q
      p=p->next;
+ K) L" G9 [* k: k; I0 j    }: G: ?+ r* q% _

* c1 v1 x" G% i9 n$ m6 \* _" }& W' J: n- B. h, A7 r. k/ c7 F& P

1 I$ C' l7 s0 Q: |# k}
! a  L# a& ?% ]
第二种方法:数组
& {, }) p' v- t8 }! i#include<stdio.h>7 _! t7 g& P% h
#define M 8
% ]: S" v4 H# Y' T& gstruct monkey6 H6 h; ~) m6 B
{int number;
( z& B6 K  q1 a  J' v( Aint nextp;
# h/ r, B; d; F; p! e}link[M+1];
0 p8 s9 N8 B# J( u8 H6 n7 m% A& N
. M% r& e+ H7 K2 mvoid main()* I; ~" ]3 C2 ]* I+ ^
{int i,count,h;7 g: M( \) {* |/ I8 E3 Z
for(i=1;i<=M;i++)
& j2 i0 f3 |4 H- x" z$ t- U- k{  if(i==M)* r8 E1 h; C- l; X' h
   link[i].nextp=1;5 }8 h0 N' Z) ?
   else; `4 D" R7 {" P1 H
   link[i].nextp=i+1;
( ~. D$ f; T+ z  link[i].number=i;# p' A9 h; i6 o0 p% ]/ W: Q7 K! V
}
; x7 Y" c: y9 y/ l# ]. Rprintf("\n");. G9 R8 {8 j/ P) x9 X9 x2 p5 t$ C& }; L% X
count=0;0 C4 ?0 e# G- [
h=M;
  ^1 ?0 Z+ x% Uprintf("依次退出的猴子: \n");
! v8 e: k7 A" C$ Dwhile(count<M-1)
0 t" K3 M- z0 S1 X8 {* k{i=0;
" c! j8 O3 z0 X& iwhile(i!=3)
) F& d4 v9 _7 {2 o{ h=link[h].nextp;, `  ?0 u1 t$ R, a) b+ p7 K
   if(link[h].number)- d7 u: Q9 M; A( N1 u/ Z. x
     i++;}
7 l8 ^* Z0 ~! p* g( K1 j5 F: m1 @3 H8 k0 F: I
printf("%4d",link[h].number);
% b% K  @4 S" ?1 `( k- V; r, ?link[h].number=0;# y7 }$ X3 z( V# \& s
count++;( N) m) h5 k/ u9 e! c
}8 m  A* E! [, Z

, L8 V& F. ?! \  q# u' `4 L, I- iprintf("\n大王是:");
* n' _' Y: v0 j, r  for(i=1;i<=M;i++)$ B$ w. _; }2 J* V: P* H7 a* G
  if(link[i].number)( d, z2 d7 {. s8 f
    printf("%3d\n",link[i].number);0 ^1 s: N+ x$ I" ?: ]

& H" ^! B9 @. H, S: e
7 c* d6 k% V; q: q/ d# j" H: L) O& i}

( T5 P9 T+ ?; {1 F0 E第三种是普通方法for循环

: p2 a8 @  _# ?9 l; ?8 r#include<stdio.h>( w4 J( q9 s5 w4 }1 m  c) F, i
void main()
& t! O! a( ~  X7 Z7 W' U{ int i,k,m,n,num[50],q,*p;+ h0 x+ a, b9 t4 U: ^: g
    clrscr();$ E+ c0 w4 X& m. S4 g8 Q) X% \
   printf("input number of person: n=");
6 V: o6 H0 Q9 V9 r    scanf("%d",&n);8 j+ k" _/ Y6 V1 k6 C' y
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
0 z$ L; O8 s7 M    scanf("%d",&q);
2 X! E* i6 C% h+ J0 {- [   p=num;
7 @3 K' i8 ?' Z& m  for(i=0;i<n;i++)
( e( ?5 G! E; g  ]+ f    *(p+i)=i+1;
5 o% T6 E2 b, ?9 a9 x0 x2 I   i=0;
* w; I5 N) ~. B5 p   k=0;
; j6 b% s; S. x" ^; t" j; A! F' h   m=0;
1 Y5 h! g$ F  |( N; K  while(m<n-1)# X6 h7 K7 ]5 n. B, _
   {if(*(p+i)!=0) k++;- Y  `1 a0 Q# X5 I& {) t
     if(k==q)- C( X, M. n! B- j  S% w) _) C
      { *(p+i)=0;
4 x# K5 Y" Q$ Q- J1 u& `        k=0;
) Z# S' U5 G# O0 _        m++;4 M! o# R0 i. X( n# R' l! |
      }
4 W9 K- `, d4 o! \  o$ @    i++;# q% f6 T" S- \7 N" f2 [/ L8 ?
    if(i==n)i=0;2 d; y+ `$ x' g8 C
   }$ E7 n' [# p7 u: M1 {
  while(*p==0)p++;
! Y! `# i  R. s) ~* J6 }    printf("The last one is NO:%d\n",*p);
6 u3 \# S( Z+ K& R3 ?% g; u" j     getch();  ]7 z& J$ \  Z1 ~, k, y" U

  ^% h! L# u  Y& i, ^}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;' B) {+ d, \  N/ Y: v
namespace 又费马达又费电
5 o6 f2 s' K7 t8 W: H) k: r( n{
$ O" \; U) J  D3 M) j    class Program
6 Q: Y! V* A7 K! Y. ^2 _    {
" g8 F" Z# o) C        static void Main(string[] args)
9 N6 H. w7 s0 T        {
6 i( _' z1 Z/ F            int m, n;
( o  {: B/ ]8 [9 L            Console.WriteLine("请输入数组长度");
5 w+ g& ]6 ]6 Y& ~            m = int.Parse(Console.ReadLine());//m为数组的大小
, @' L/ H* l5 f            Console.WriteLine("请输入要截取数字的大小");
9 W. ]  [+ h" ~6 D( n            n = int.Parse(Console.ReadLine());8 I$ O8 d7 e# }
            int [] numw=new int
: b' ~+ [! }; j: D& t  P8 S+ h7 O' C
&shy;&shy;&shy;;
1 K' N9 R4 M. C- D, I: y5 U            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数  [: F2 n1 W+ d- }3 ?
            {
# T5 V/ v  `8 ^' M: U9 l- E8 W                numw[j - 1] = j;4 b; J3 l: D0 d
            }
1 N# ~: F& i3 R6 _4 e7 g            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
6 \/ S6 y" |  O- ]            while (d != m - 1)
7 c" W  ^  G! U            {' k6 _9 E, `$ A4 K3 N( j% c& y
                if (i == m && d != m - 1)& F/ o/ R( Y" x8 O2 f( D9 j7 Q+ j
                {3 I5 ~8 m6 r5 Z; w+ T* m7 L
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
0 ~1 n3 S8 x2 f' u% s% D' b* J                    continue;
+ _8 n; L( `9 J0 E                }( H9 B$ x2 i& d* i- a9 N6 I% \4 n$ C
                else
2 x: K- k/ Q/ Q) x5 V0 J4 W. P                {! e0 X* _2 I$ W/ f) A
                    if (numw[i] != 0)/ K; X3 s8 D4 R) G) o
                    {( F6 S' M" z/ d8 ?* y
                        i++;1 Q: [: F% M2 g% g2 H
                        k++;
$ h, s0 y/ S4 F- u! r, {" F                        if (k == n)" D2 A# G+ @5 q7 A; |# q& `- [* e
                        {
, j" a+ ^% V1 l( W: Q4 l                            numw[i - 1] = 0;//把在n位置数组元素的值改变了$ E# K1 @0 j' H: I. R
                            k = 0;
9 E( W& h- H1 L              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
, m9 B6 w' l! d/ }& Q$ m* N                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
) u# D5 {) ^: Q5 N                        }
' S4 Z8 }0 q9 D                        else//输出暂时还没有改变数组元素的值
/ W! ^3 J3 q* i5 Q  ?                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
' ?7 d4 b+ b5 `: \: T                    }& w/ m) W# A" [& j( N2 ~7 b
                    else8 Y! g4 }( O0 c1 F
                        i++;//数组元素为0,直接跳过,不计数。。。
9 d$ F0 J5 J) i# t                }
3 m0 W) S1 c. F1 _9 c
: g0 K7 h+ I' H4 r
- r/ @: N: c8 s/ u0 M2 R            }//结束while循环: r" r7 d* ?6 x: H: U
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
+ x/ u  }" ^+ }1 ~           5 V+ ~$ }( H0 `
                if (numw[i] != 0)
9 G; v2 j: a2 V) B' a, ?! |                    Console.WriteLine(numw[i]);
" O; l/ q, w: Y! m           
% @4 s- z# S' i  v# ?2 W; Y% H            Console.ReadLine();
4 o2 B7 r% L0 s# o        }
! W* v2 m* c. }! [" T% c6 [. k+ p    }
% t9 |. X( X/ Z9 M}
3 q7 x- _# ^3 @) 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, 2026-7-3 05:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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