鱼C论坛

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

猴子问题

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

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

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

x
大家好!# ]5 x+ N6 {  P0 }* r4 u2 _
这几天我在忙着编一个问题,我用了一种方法编出来!
  j' I: M+ W7 U! ~- s1 K3 Z但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
0 K% E7 t: x. F& M; l: u7 L注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
) h. X) s. @+ w# }: \: \9 u6 C5 \$ Z
* {- g( ]2 b) m& b" k
                            题目
7 D* L6 v: @% s3 f8 N* _1 b山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
4 y3 Q1 [5 c( ]+ y7 j第一种方法:利用循环链表# _, {  w; Z% U# w9 g* {$ Q: t- [4 L
#include<stdio.h>
) p- e3 d, [7 j7 _7 P#include<malloc.h>
' v0 x0 o- E. e6 D#define M 8            //共有8只猴子
" D! w8 N- A3 I#define N 3            //数到3只时退出第三只
& Q) @( S5 J/ Y- @/ ytypedef struct monkey
, H2 N4 N4 B8 X2 o{int number;' S1 q& f5 |. I9 g$ g0 r$ n
int flag;" z% W8 |. T8 k1 {/ y0 N
struct monkey* next;$ c% G" ~* u1 X6 }7 ^
}MONKEY;
. L/ p* J; l  V! ^2 x  ]4 rmain()
2 J/ I  L$ m# w! \+ ]- O7 v: Z{ MONKEY *head=NULL,*p,*s;
, R* M' K6 l7 B! J/ i2 ?  int i,sum=0,count=0;
& R9 i" J, Q; z4 C( r( F) s. O  clrscr();              //清屏
$ g% [/ S! m2 w/ C: ?  O  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存3 e" G+ c' J7 z& R. H( Z3 E& Y4 I
  p->number=1;p->flag=1;7 k9 [+ e, N0 N  M3 ^1 o6 w
  p->next=head;
4 }9 I) R" [1 r9 z( ~4 j  head=p;
7 x* \, l0 }' A  for(i=2;i<=M;i++)9 l1 U2 A, F  `2 [$ V" g# a# z
    { s=(MONKEY *)malloc(sizeof(MONKEY));+ Q. n3 h! z6 O0 y* [
     s->number=i;s->flag=1;5 E5 j& e% r0 b0 \6 v; r, f
     s->next=head;
6 O& W0 t& g7 i  y' I3 `2 S     p->next=s;p=p->next;% w) R6 z, e1 X9 Y9 |
    }  \3 J2 F# H. e4 v! ?
    p=head;5 b) P& m- V9 T  N
   for(;;)
2 p8 `" c9 q' M7 m    {if(p->flag==1)
8 P. D! X# U" L2 W       count++;( J4 J5 ]# `: Z2 q* f" ]- X# U
     if(count==N)
; @6 `' Y2 e7 r* D        {p->flag=0;
7 X7 g/ U( s+ m- I$ `: \7 `         count=0;
  ~  R" t7 Q; W$ z: i& `3 d         sum++;}
  N8 a8 z: s& q1 w  v     if(sum==M-1)
7 B: Y- h8 |2 X9 W. w# d$ E        break;6 r$ e8 p' ], f
     p=p->next;
- r  x: e, p6 @4 L    }
1 {' g1 R  m/ G( A9 ~    p=
4 @7 B. C& Q5 p: ]  S; z( ?    head;
9 m8 I( H& S9 o5 {1 @1 P    for(i=1;i<=M;i++)2 A- U; _  K) F
    { if(p->flag==1)5 J, \3 X- L  B( `
        printf("\t%d",p->number);4 r( O" v& P0 O* S' D! a! }' Y
      p=p->next;& x; `, h" E% F/ q: ~5 ]2 }, X
    }
& {- K4 j5 @+ d7 q5 X
) _2 r2 X  Y) f; l! G/ B
2 t9 {) _) Y! f9 [4 z
6 I( x9 ]% v9 E8 e. o}

# }+ X8 Y+ w5 |/ M9 E第二种方法:数组1 @9 @* o, L9 T5 d8 E1 I0 [8 l
#include<stdio.h>
3 i. S1 T1 d2 C1 ?) T9 V+ {#define M 8: |) U' j- y/ `8 l
struct monkey% `4 m7 U1 U, f, g  }$ B: m3 Y. `
{int number;
4 J" m; X" j. i2 @int nextp;2 V" o' Q9 Q) w7 D, N
}link[M+1];
. C* _/ N0 }. z0 _4 z* |
+ i2 \3 m$ {" F. e; X: Nvoid main()9 j, r, Z% R- n2 |
{int i,count,h;$ K; C4 ~+ N8 ~1 j/ s5 ]
for(i=1;i<=M;i++)
# L& `" n9 Z- x/ _# D{  if(i==M)
7 n% t7 Q) r  o1 d   link[i].nextp=1;
  m8 x$ f) J( l4 S, O   else
. v" n6 ~& f7 [2 q   link[i].nextp=i+1;4 N' Y. w# Q( o$ V! w( [
  link[i].number=i;
$ h) z: U3 Y. }! C}
- A/ ]1 V" \% k$ e! C) h) Gprintf("\n");
$ |, A3 c1 c% q5 v3 h  Hcount=0;; w8 D) b( H2 c0 }* ~
h=M;
# }6 O1 ~( K0 }8 u0 Dprintf("依次退出的猴子: \n");0 p2 l. U6 k: k( y1 b9 a0 d; u2 E6 ~
while(count<M-1)
% r3 v, M+ W0 z" o{i=0;
- K) j9 s& @+ q  B. R/ Cwhile(i!=3). h. c1 Y; b# O; C" D$ ~5 R
{ h=link[h].nextp;) I- A* T. T5 K  d
   if(link[h].number)
% ?' n* U0 C4 ]1 w     i++;}! ^( _9 W+ q6 c5 U# \2 f- e
- |' i. D* S$ b- ?
printf("%4d",link[h].number);) H( j, `- w/ c5 Z4 X5 t5 t4 ?
link[h].number=0;
9 S& I& A1 o1 \6 mcount++;
1 T7 m8 B( v% G1 k/ D7 O$ w}
0 h+ O; k; X% Y
* s" H$ P# j% A1 `printf("\n大王是:");( T( C. k$ j; G6 t5 V) J. J
  for(i=1;i<=M;i++)1 t; U% ]& E& H. R  U6 a; _- D
  if(link[i].number)& e4 j" }9 C& }% o4 M2 K
    printf("%3d\n",link[i].number);+ f% q9 F2 f( _! G
2 n2 z$ m4 ]5 |) [
1 K! ?( w4 m4 Y( T/ [( ?- L7 x
}

* F* o7 {# t( {" [第三种是普通方法for循环

9 j9 j& S; d, V7 V* H. S* y#include<stdio.h>
/ S' Z+ P  g4 e* W- Pvoid main()
1 v9 A/ x" s6 G; @0 N{ int i,k,m,n,num[50],q,*p;
% i+ C- m, s% V+ Q' z6 U* J& i    clrscr();2 ]1 c, x0 W, U. c, C9 P% z
   printf("input number of person: n=");
- y! }: d; N9 A; a    scanf("%d",&n);
$ q1 `  C1 O* [, I1 uprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只2 q# p+ g3 {. z
    scanf("%d",&q);& P9 g+ j8 e7 k, ?
   p=num;, ?. N  ?$ R  M, ]4 ^
  for(i=0;i<n;i++)
5 n. G4 A9 g; ]# T    *(p+i)=i+1;
" F- k' m9 C, m4 H. [8 z% f   i=0;
4 w7 l' u. ]  g   k=0;
2 d7 G, E) E- W; Q4 E( F( P4 L   m=0;
  [! V+ t9 B  |8 X* u: k# S7 y6 l  while(m<n-1)) h0 h" W2 j( a2 q9 v, N% X
   {if(*(p+i)!=0) k++;
$ G3 a* p; W; R& y/ C  q     if(k==q)% Q8 L; @1 w1 l7 C- D9 ]. \
      { *(p+i)=0;
8 }( @+ ^" D1 d! y0 H+ |        k=0;4 `) }% a" R7 ^5 q! u2 @7 y
        m++;9 p) ~* m% ^# V; _; {1 I. J% C
      }
$ _) [1 E- ?. s7 W0 ^    i++;* Z: `; h! ]9 A8 ~( M) c: |
    if(i==n)i=0;% b0 y" e7 f8 p
   }
, b8 {8 w# e9 W  while(*p==0)p++;5 U1 A+ S7 u& ]# ]9 X' S- Z+ L
    printf("The last one is NO:%d\n",*p);; |0 [+ o$ B& h+ h
     getch();
/ c: v# e& X2 J3 q  J0 |! Z- \- C% e4 u# [
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
! B9 r/ X+ g; X$ L: a4 X) w: e, enamespace 又费马达又费电, N6 i, e7 q( C: d9 N7 f
{' t+ h0 Z: L5 g( @1 F% \! [
    class Program1 d5 W$ S# i0 s
    {7 t% }: [; K. N. w5 d
        static void Main(string[] args)6 F/ l% ^1 n' X- Y( }" E( ?
        {
& Q4 }; Z- e; o8 ?7 [& e            int m, n;
' E7 z8 _$ R# v$ l3 w3 o            Console.WriteLine("请输入数组长度");7 ?3 I) j( m6 y" s$ t" X, }+ I
            m = int.Parse(Console.ReadLine());//m为数组的大小
( [. o) n: n$ \" R5 X' I            Console.WriteLine("请输入要截取数字的大小");9 P5 y0 y' S" P# X' h
            n = int.Parse(Console.ReadLine());
0 Y* g+ Z7 @6 ~7 I' h; g8 L1 {            int [] numw=new int
+ c: h6 o0 X8 K! x5 h
9 y0 C0 Z9 o+ \1 z! k; d! R7 v&shy;&shy;&shy;;- r3 o/ w2 J. I* P
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
8 d  P) m; b6 m8 `* m' b            {/ C6 f: s9 J9 C4 m# I
                numw[j - 1] = j;* o1 t- v0 [) b. V  ^
            }
" \9 P' n, Z8 G; I: w, D) f            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!' c1 y8 c5 i% r, J6 s
            while (d != m - 1)9 q8 h* m7 y' n* I* d. ?" X
            {
$ |' t4 _2 |/ M. x0 o                if (i == m && d != m - 1)
" }/ ~) N! c& g- ]  P3 K                {, N7 i# @! J0 I( j% m
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
' ^7 o6 G1 I' @* ^! c1 Y                    continue;1 Z+ N7 s0 C$ E$ W, m! b
                }5 A7 I/ Y1 ~5 P% G& H3 A' W" F+ m
                else
. t; K7 G% j2 g1 d% x, m/ G                {- F! d' O' }# a+ F, B
                    if (numw[i] != 0): Y3 R+ M/ n1 F: j# g
                    {
9 e& k% W: Z' {7 @) F  v5 S" e. G                        i++;6 W( X& f. Q+ h5 z( M$ a2 V# y$ Q
                        k++;
( W$ T6 W9 s' ^' K                        if (k == n)/ u9 v8 i  }5 F+ N0 e& C
                        {2 P1 H6 W/ G1 u) i0 B2 N7 ]
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
: h; n: U" d0 B) ?. Z& l0 p, t                            k = 0;# I: j6 ~  L$ n3 p% Q' m
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
* L* Q4 q+ Y4 R                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);0 m7 K% ?9 C+ y: L4 Z$ U
                        }/ ~! ]9 |, |: c
                        else//输出暂时还没有改变数组元素的值
3 Y5 N& a6 Q7 Z: Y6 }! M" T                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
( L+ n8 }: T* z                    }5 N3 F3 T1 p; d$ c  R
                    else
* ]0 u$ s2 j! t* U/ ~7 ?8 {; Q2 M6 i                        i++;//数组元素为0,直接跳过,不计数。。。
  z6 h0 Q% t  f# p+ K+ O9 w                }
( ^& H7 X/ {% }: l' U ) \2 D( e. z. `* d$ {

1 f( R& v) `% a4 I9 Y            }//结束while循环1 O2 e' w3 r9 v0 |6 s7 c
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦: [! c/ L: A/ y" _
           8 V2 y5 ~% ?- K: F
                if (numw[i] != 0)
0 J3 }6 ]9 x% M: U& h7 P. w0 a3 P                    Console.WriteLine(numw[i]);7 @( }1 l5 _6 s0 d' j8 r5 v6 j+ @
           6 {. D  _) H( f, P! Z
            Console.ReadLine();
/ x* [/ F0 q: ]# u; S! O) }' v        }2 f. P. u5 j2 k% L+ p
    }
+ J5 X6 A' c" ~; d}, O+ A! e! b" n, H% 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, 2025-12-31 15:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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