鱼C论坛

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

猴子问题

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

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

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

x
大家好!
- R+ D8 F9 a9 k4 h9 I, y  C5 |这几天我在忙着编一个问题,我用了一种方法编出来!
7 {: y) ]) o2 R- D+ r但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!4 S1 @5 I* c" j# \: E: }4 g0 c$ |
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 0 W+ r7 `: N* z4 c# l6 i

3 I. W) _6 }9 N4 b
% |) F9 c) D& ~6 P3 |# K
                            题目
* r" F9 J1 Q6 g% k山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。% @2 `8 Q1 m1 U  W7 K+ ^" M
第一种方法:利用循环链表
' ]- {7 |% k- y#include<stdio.h>
2 V9 r5 J. f. J$ d#include<malloc.h>
  v) e3 q1 t( D#define M 8            //共有8只猴子
2 o! C* Y3 D8 |% _1 W# {' o#define N 3            //数到3只时退出第三只
6 t  ?5 x: p" i2 x5 @% @! H% o- P) J9 @typedef struct monkey
6 o, k6 ?) }/ x; G+ ?# w{int number;
0 o( Q! G8 g6 t$ \! |- m( Xint flag;
* B' _8 i+ o- \3 q4 F1 }struct monkey* next;7 B+ q3 t- i( V* S- [! @. x
}MONKEY;& B0 z7 Q* ]3 C9 T( S
main(), h6 s& T2 g6 [7 y' x) o
{ MONKEY *head=NULL,*p,*s;
( t7 W2 h" r2 \. @3 E  int i,sum=0,count=0;
7 w/ t% O0 ~) d1 R/ _- E5 W! ]  clrscr();              //清屏5 T" |$ T4 \" S$ j9 O! B
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
- V* @/ y4 |3 t, ~# b2 ?  p->number=1;p->flag=1;# t: U2 \* Q5 s. I5 g/ ?. _
  p->next=head;  Z9 i4 I' z( l/ \: [5 M- y
  head=p;9 ?8 T5 A+ Y7 O* J0 m9 Q1 ~
  for(i=2;i<=M;i++)1 M3 g/ m) Q. v) G
    { s=(MONKEY *)malloc(sizeof(MONKEY));, \. i* P5 U2 B4 u
     s->number=i;s->flag=1;
! l+ z9 H3 p& [  |% d" W0 g     s->next=head;) E* Y6 ^3 J( J8 R6 y! M4 _. w3 C
     p->next=s;p=p->next;- `9 B+ {4 r2 w  @0 S
    }
7 I3 p' x1 `( \1 B0 g9 h    p=head;
1 w: Y) @  s' O0 l   for(;;)
+ U3 l4 M0 `! e0 V: z% U    {if(p->flag==1)
) R8 D$ F  i5 x+ A8 p3 G( @$ f       count++;9 ]4 c2 d7 v4 f, P; j# I8 a0 p
     if(count==N)0 q& W  \; C# t, l' ^  f8 b! D+ T
        {p->flag=0;
$ [6 c6 f+ [3 ]/ I% p         count=0;/ g7 H/ {% h7 d
         sum++;}
  ?# v1 G, e0 d2 K: {' Q     if(sum==M-1)1 z  T, j* {0 Z4 `( `. L3 O. Z
        break;
) m! F. `5 G/ A     p=p->next;
* p0 D- z% }7 }+ a) M. T, L    }
& R. Q. ~6 _6 i8 ]$ \, ]2 v    p=# D# s( o6 |* y- I  H
    head;" [% ~3 p" d2 A1 V+ F. O* x
    for(i=1;i<=M;i++)
/ \& T" Q/ X6 t9 {! q6 W    { if(p->flag==1)+ i) F, p' j* U, z% X8 I
        printf("\t%d",p->number);
! O8 G& g& @( p! |1 k1 W5 l      p=p->next;
; U# V0 |  }3 @: |& {    }- |- l* j( }: d

: [& T" g8 p" [3 E+ Y! N7 V9 U$ D* ^
3 S, l5 o; _. [+ [: g" w
}
+ w; N5 l- E" D# s
第二种方法:数组
. A$ p! d& t& i# n! G#include<stdio.h>
3 n% z* M. k/ D3 Y/ M#define M 88 a5 O2 ~1 t5 ^7 y; n5 z$ A" G
struct monkey
) A, P3 ~" O5 b' N' q" Z{int number;
8 g1 Z/ u# J# s1 v/ s" |int nextp;
) M- M; }& Z$ ^* J& }$ _7 p7 i}link[M+1];
8 k; y# _+ W6 Q$ ^) E4 s
" u2 M2 j1 `, W5 T' L. Svoid main()4 ?! \6 A3 w8 e
{int i,count,h;
5 {' ^' K7 n: M4 V* B2 ^" cfor(i=1;i<=M;i++)( c0 f$ t  J, z; ]6 H
{  if(i==M)/ Q" s3 v4 V+ {/ u2 [: a; {
   link[i].nextp=1;+ m( R! d5 I/ c  [4 h' G* B
   else# `. i3 A; T# o* X5 B( F) }
   link[i].nextp=i+1;9 a8 P5 K6 |' K% q8 {$ J
  link[i].number=i;
( A+ J- j7 J; |) ^; v}  `* Y/ K, }3 r" ^% M7 r3 X
printf("\n");& G5 W! Z. f9 z. c7 {) Q0 m
count=0;! a$ U  `9 {# u4 I8 A7 l$ z
h=M;
6 t9 P' a& x$ H" R+ _printf("依次退出的猴子: \n");
" ?" i* z( L! }& Wwhile(count<M-1)
# B) L! D. ]/ y. o* h3 i{i=0;
' \3 V8 l3 l4 Q( v! |while(i!=3)4 M- Z+ F- X! A9 G# ]9 j
{ h=link[h].nextp;
2 i- G; a1 S1 C/ _# h   if(link[h].number), Q+ G9 E4 ^9 E8 e: w1 ^/ `
     i++;}" M1 k* s2 A% h( v# P) x9 h/ @

" f' e9 e4 S$ g7 C0 c' ]printf("%4d",link[h].number);' i# Y3 l0 p9 M( V: |$ V
link[h].number=0;2 r/ Z( {& \/ N: ]1 c" h& O
count++;
3 J/ q3 J- X- R, W: V}* C% x, z. [9 c3 ^2 j" y6 q, I
) f9 O, r/ @0 H4 I2 Z* v) O* F
printf("\n大王是:");0 ?) t. {. S- B, Z! X# T3 y
  for(i=1;i<=M;i++)
  I4 T1 w$ [) g) N' _0 e7 S( E0 Q2 N. \  if(link[i].number)
7 ~" X  g+ ~& z, U, t. F/ X; M    printf("%3d\n",link[i].number);3 G; ?0 {6 W8 Z$ a' D( {, K  K
# P0 P+ a2 }9 D  M& B, ~# A+ ^

7 E( R) Q- y3 u" C}
8 p: U* ]8 B( ^
第三种是普通方法for循环

: D' D; U* Y; ^#include<stdio.h>( C: i  G, p& o5 Q1 b' y
void main()4 _* k+ \" ?3 y6 x6 r5 i  P
{ int i,k,m,n,num[50],q,*p;
; b9 {8 D. O6 u* s0 V7 ~    clrscr();: v0 ]) c' _% g, |- v7 N( E- o
   printf("input number of person: n=");) A, Y. j& N3 H/ L6 w5 y7 i
    scanf("%d",&n);; q$ o4 a% J8 H, ~5 e9 L
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只- h/ [/ g4 \. N% A9 q" [& `
    scanf("%d",&q);* l4 `  P3 A& {$ B' y8 p
   p=num;
! \# ^# o& w0 [7 ?+ z  for(i=0;i<n;i++)" i1 ~; B$ `$ g% v) c
    *(p+i)=i+1;# E7 P2 P3 y2 _; l" `
   i=0;. j' d6 W) N& }8 F# R
   k=0;
/ G+ B5 W% ~8 U   m=0;
& O9 P' W# o5 g' a  while(m<n-1)
: R- z, L' p0 _. `6 e' K9 `2 ~   {if(*(p+i)!=0) k++;
9 j6 @' B( J9 m$ f: \     if(k==q), k4 d/ y  U; b2 [
      { *(p+i)=0;! T0 I  p/ m9 f/ b1 e2 `5 b
        k=0;
7 W* G0 m1 ~" I        m++;
6 ^& v( |( u  C9 k; b7 W2 o      }
( p6 O& S0 W( _: k1 g) }2 u# w    i++;2 y: h1 C, W- w4 c8 g
    if(i==n)i=0;6 s4 s' _! M! G& R0 y2 e
   }
. N7 e! q( J0 L, r* ~" I: `! a/ {7 s  while(*p==0)p++;4 m) ]" C6 J" b, O
    printf("The last one is NO:%d\n",*p);
! M* d& E; m# h% R' w# T$ D     getch();
  L. |( p+ Z. y
* W5 x$ f& z; I0 S" v}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
0 [- h- n9 K" Y$ L- M0 k1 w/ Enamespace 又费马达又费电
4 I- m1 t+ Z  @# \' f; C{5 H) ~3 R8 O. Z7 b; h
    class Program
1 h: B; I2 }) X  K    {
' P7 |& ?# g& z  n1 g& E, r        static void Main(string[] args)
& L& I: b+ l* E! J        {
* O$ ?7 Z& x2 s- G' L3 H" h) G7 @            int m, n;
. w3 b5 H  }# o            Console.WriteLine("请输入数组长度");8 a9 b' H  U& P# K2 c
            m = int.Parse(Console.ReadLine());//m为数组的大小
$ i1 G3 A: s, K! z1 a0 f% J            Console.WriteLine("请输入要截取数字的大小");
0 l9 @, L9 ?* M5 R' G. H- ]            n = int.Parse(Console.ReadLine());
& y0 v* }* o3 f% g0 ], e" R            int [] numw=new int- L6 o, R* ?, W, y& J
) \; _( B2 Q4 S/ A3 n2 t. Q
&shy;&shy;&shy;;! d8 k' x8 N  I8 k/ ~5 ^
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数- T* g$ Z$ {$ z8 p7 {
            {" J; D; X3 @) H" T' ~
                numw[j - 1] = j;
$ C4 a% l; _! I8 E/ I  r0 h            }3 G! y8 j( H0 Y! V- b, x
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!  J& j9 `0 ~$ k" B$ f0 b* h
            while (d != m - 1)( P0 J+ l$ o5 J' F% \# _
            {
: b! I% V$ K$ `+ g& L                if (i == m && d != m - 1)& R: b0 L& }% J* H
                {, l/ y. n7 `9 a
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!$ {1 @/ d. H% J2 W. c3 G
                    continue;
0 h- b. |0 M. {5 z                }
3 P- R! X3 `4 g                else7 m( m% `8 m/ A* [; p" u: R
                {
5 `- C& v# z2 }8 a( b/ {  C                    if (numw[i] != 0): G7 r9 _" ?  Q) `
                    {
* n1 J  }8 m+ ^5 s                        i++;
/ _5 Q  N- ~+ i, l! M) L                        k++;. t: [; l! N0 _! S3 U
                        if (k == n)  p5 x& Z0 c& G+ C. x
                        {  @# J3 H/ i" }9 E6 l9 g
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
# D1 E6 t2 A- B+ r7 o5 c: l4 e2 }  C                            k = 0;
* `% N+ Z, q) s$ P! ^6 t              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
' H8 w$ U, W# g" r4 W                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);* |! g2 [( m. Z) f  S) Y) v
                        }
7 m) `# m: z( x! m: V3 N9 t                        else//输出暂时还没有改变数组元素的值
5 l) M* O3 ?$ F. q  ^4 J* d( b  x                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);. {  @% Y6 U' n0 W$ d6 z
                    }
4 F! I4 D9 V: S  P, j                    else
9 u0 I1 U, J- g6 `" M: j5 d                        i++;//数组元素为0,直接跳过,不计数。。。
" N7 ?2 B+ _, m( ~                }' @1 H( a9 I+ z8 I
& Z$ y2 l  Q0 x" f6 B+ V

; K5 p4 V, H1 v/ I2 c            }//结束while循环4 v6 j. W) c5 L; e% X/ s& x
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
' G" H5 S! X3 u+ _/ N           
% k6 j8 `+ }$ X( h, z9 F                if (numw[i] != 0)* H( O5 i# P! B7 t# W9 d
                    Console.WriteLine(numw[i]);2 G2 j3 B4 ?: a; L$ c# _! I% n
           
# o5 x, u4 S$ f) t( o( b, f9 ]9 ?            Console.ReadLine();' u' E1 |7 d% w8 S
        }
" W. D! p9 y& t, r& Q7 w$ v4 X1 D    }( S2 _. F, T. Y' ^
}
1 O5 S) ?5 G5 C7 e
小甲鱼最新课程 -> 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-31 19:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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