鱼C论坛

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

猴子问题

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

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

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

x
大家好!* [" H( I0 G1 x3 ~3 f
这几天我在忙着编一个问题,我用了一种方法编出来!
) g- l  \5 y, t1 I: z) ]但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
# j3 K. n! |: ?" q注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
8 d" V4 y& _- H3 U* I; L) _  Z* Y7 A  q1 F) @7 g
% Q. X9 X  O( y( N; M
                            题目* R% }  f! ~6 F. E4 v1 J
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
6 V/ t: w  c7 p; L+ e第一种方法:利用循环链表
, P$ n  B9 z5 m#include<stdio.h>
3 O  e9 |) |0 G1 v, k0 C#include<malloc.h>
# p( @% Q6 y+ q( E5 e. P$ w* [9 \#define M 8            //共有8只猴子
4 h8 p0 ?$ H& Q" y  R# c; d9 o#define N 3            //数到3只时退出第三只, X0 z4 x. x6 W8 ?) s0 U# ~
typedef struct monkey
. g: l; y6 t! R% }& y9 l. K0 @{int number;8 m# l1 F: ]0 g% z5 g2 b- I
int flag;
( M) a# Q6 n: s+ P" bstruct monkey* next;) l6 X9 u! t( m# P. Y
}MONKEY;
9 S/ H3 p( z! ?& j5 l+ a6 s7 G0 jmain()& Q: L% p9 r7 R  O. C8 ~$ o
{ MONKEY *head=NULL,*p,*s;0 X& L. ?7 f% X$ z6 j
  int i,sum=0,count=0;  p, ?4 d# f6 F5 U: o
  clrscr();              //清屏
: Y3 Z5 R1 y% T  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
( m+ y$ p5 s2 p4 K3 P  p->number=1;p->flag=1;6 Z; \" W/ B  O, _  E! P5 d( j
  p->next=head;
( U  J$ ?% W" X: t5 O; X  head=p;
- N6 B) H( R: c- Q" Q$ u6 i  for(i=2;i<=M;i++)
. A5 ]$ D. q; y, a8 v* w; d    { s=(MONKEY *)malloc(sizeof(MONKEY));
( G2 p  d9 {2 f+ P* o8 ~2 u     s->number=i;s->flag=1;& x* L  M) f3 I& c: V. a) ?
     s->next=head;
, t) g+ I3 P' E9 o& R     p->next=s;p=p->next;
5 x3 M$ {, L0 j; F    }, B9 p# @' N4 x. {/ {3 _9 V1 A
    p=head;
- v$ ~* W* ^' E- n7 J3 q3 E   for(;;)
3 C1 W" g! r! |    {if(p->flag==1)
6 H0 p& e! \9 k; r3 ?! f) D       count++;
* R- e( a! O! g$ d! A- d     if(count==N)
8 T0 c7 ~: r/ V/ V0 ~        {p->flag=0;( z7 A+ Q3 z+ k- {" e# S
         count=0;6 {$ b+ B* a- m8 ~
         sum++;}3 ^$ P5 [9 b' `) X5 ?/ g! D
     if(sum==M-1)
" B! K! f/ I- V9 N        break;
% _/ N% J/ p; J1 t+ y* y3 V7 H8 s     p=p->next;0 ~: E$ Y2 P# q8 ]
    }
0 O2 w% `, U& n- n% l: ]% _    p=
+ x  x+ W# n& }! m    head;8 R8 {8 E( Z9 F# c; O0 H7 z9 Z& m3 ^5 i" i
    for(i=1;i<=M;i++), @3 H5 p9 }% `# N& E* e$ o
    { if(p->flag==1)
: e6 \8 k- ^+ E7 u; u( B6 A$ P        printf("\t%d",p->number);
& f3 `- I( c+ C. e- F% ^      p=p->next;
) n* W" E7 W8 f/ [2 x    }
7 h$ P1 G# g& d$ G6 h4 d$ Y2 H: E" C6 e1 }
7 S7 b( ?5 g* V/ B) o6 V+ N8 ^1 g

( x8 g. j$ b$ K}
) L8 }4 g$ V& V1 R8 `( m  O8 K
第二种方法:数组
9 _0 y% a" z) f" E2 i$ r4 R#include<stdio.h>9 m4 A, q4 S9 h* L) q
#define M 8
/ r" w7 S. i5 d! A% y: ~$ wstruct monkey
- J' I0 I) m6 w& s3 @4 _{int number;
9 x5 O/ B0 U8 i+ Z: lint nextp;
- P% @8 f: H  k& W8 F' _0 `}link[M+1];; J, A* V+ G# E# p% ]; R6 ~
  V+ ]/ ]0 g: n  Z; i
void main(). p- ?* L. ]6 w4 D
{int i,count,h;) ~* O& l# y1 ~8 e: p" Z) K8 k
for(i=1;i<=M;i++)5 F3 K: B8 ^" j. S
{  if(i==M)7 d3 j4 d! O  {7 S) {, c0 w
   link[i].nextp=1;
  e# N. P% m  f& m   else
0 ?! f- r) _( Y   link[i].nextp=i+1;' m* M' D4 \9 N! p4 N7 Y, ^9 E5 M1 |# {
  link[i].number=i;" O3 h/ t1 Z9 r! H" ~' v' Z9 m
}# m; K/ x+ Q. V
printf("\n");5 F7 ^: _9 m; F3 n! f
count=0;
! `$ D9 z/ O/ o) ?3 yh=M;; K  [  n& a/ A& f$ ?
printf("依次退出的猴子: \n");; [+ k- N  W- b
while(count<M-1)
4 a! A& W8 d9 B( B1 s4 p' b{i=0;+ m9 Q- n" \5 b: N4 |' K4 S
while(i!=3), v3 N  @9 ]+ u7 |" |" ^) O
{ h=link[h].nextp;. W: ~' o) |) Z
   if(link[h].number)
9 i: g3 I. P4 j& f1 h     i++;}
. }% W% k4 f/ E9 [& `6 |3 K+ U+ l& E/ O( h3 f
printf("%4d",link[h].number);
8 v2 O1 K9 n$ E: s. wlink[h].number=0;( @9 g; c, u6 }% K
count++;; t( {1 v7 g$ a# f  `3 @& B; p7 W, ^
}
7 o3 z: B' L* ]0 o$ Y6 g  e9 Q9 I7 J& X: _
printf("\n大王是:");
5 y" [( s' T7 C6 v  for(i=1;i<=M;i++): M, R* ^3 V7 H0 H  W; l: g
  if(link[i].number)- _: V; }6 N; f$ h
    printf("%3d\n",link[i].number);/ k( C/ n% e) U

# r. }( M2 o7 d% G  q2 H; }( \% y( i' R6 d0 R9 P  _9 f
}

$ ~" g5 l7 `) V/ T# \: g# @* v3 F第三种是普通方法for循环

+ W- h' k: ~! g#include<stdio.h>
+ Y& O% ~* R2 s1 y3 N. \" R+ m# jvoid main(). L2 L) ~. O( o5 V3 Q2 u+ Z3 f
{ int i,k,m,n,num[50],q,*p;9 L# e# }' v6 h
    clrscr();
- B% Z. K+ A3 v* y7 r   printf("input number of person: n=");
5 b1 @( i% ~% d% t4 a    scanf("%d",&n);
) t- V" k8 I  b- t" P( q/ k6 Dprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只5 P( h0 m- M" R+ C0 o! F( {
    scanf("%d",&q);5 L' U: r( S  G  ?0 U; l
   p=num;) @; f- v5 B( k; N: n3 \1 |9 ]4 S
  for(i=0;i<n;i++)
3 Q) f" M( [0 e+ ~    *(p+i)=i+1;( n( s6 a4 I! U! k3 B0 M. K
   i=0;+ M* m* X( G7 p7 |
   k=0;( I$ h; G. W' U; C# t
   m=0;
/ T. g" {) O9 s  while(m<n-1)5 Q) B+ I1 g- V" I. ]7 t5 J6 r
   {if(*(p+i)!=0) k++;
  t( H3 K; n, b0 x1 k     if(k==q)' P; `, n5 q0 F4 l1 Y
      { *(p+i)=0;
% _) q  E1 r2 r3 U# C        k=0;3 y8 H! s- W1 X0 W$ E; F) j
        m++;
4 R% q& l2 s, Z      }
  {, X% F! Y+ N1 K; H/ o    i++;( Y9 o- i$ }: e" y
    if(i==n)i=0;
6 L4 }, W. X  A# C+ e   }. O! c3 x/ [1 T& r: \! ?, ~, I
  while(*p==0)p++;
2 m! B: o( O( e' d    printf("The last one is NO:%d\n",*p);; I) @( |8 ^2 w5 }3 E0 Q5 ?" O) e
     getch();( k+ U9 ~1 W: ^5 w8 l9 z
$ E/ q  j2 Y7 M, Q9 {" x9 G: b
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
! ~3 I0 _% |$ G+ ^# nnamespace 又费马达又费电% d* _2 L9 z7 P  d3 x: C
{
( i' m* O4 p* r' D4 N# h' Z    class Program2 K' X3 P/ ^& f* s2 _# B0 H9 q
    {
3 S0 `( F: y# e( _6 |! _# R0 L0 H        static void Main(string[] args)
8 Y. \" v& t4 `$ a5 k# `9 b        {( C% H2 Y' q, d
            int m, n;# E& B& N/ C% a6 C# s2 N
            Console.WriteLine("请输入数组长度");
0 t9 R5 i( j1 d4 A6 p            m = int.Parse(Console.ReadLine());//m为数组的大小. b, j  B: {. e1 b% {+ e: P" t
            Console.WriteLine("请输入要截取数字的大小");
& N; y# N% ^5 H' n' y            n = int.Parse(Console.ReadLine());7 }( h9 F) z+ m8 h6 \" n* ?$ c
            int [] numw=new int
7 I( Y# S6 r7 M% f, \* M4 b# J
4 W  X/ B4 g. x# T&shy;&shy;&shy;;
- m# h* b: @/ {. c6 Y9 z8 o( O  D            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数" E8 O$ Y' `( E9 j( Z- [3 b# s0 H
            {
& U9 d: r2 r' w* t$ R2 S5 v  l5 ^                numw[j - 1] = j;& u6 m7 a! ?! B0 p" w+ R
            }
9 v! E0 Q3 @% ?; B, x            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!8 Z, `2 g: A' _6 J9 _6 C4 G
            while (d != m - 1). G4 G) C1 U) Y# z5 l( d
            {
5 @9 T) N; Z1 w/ U, t                if (i == m && d != m - 1)) e. o7 S0 [5 Y
                {5 T5 d6 j' \' u8 o3 }8 j5 J& l) p
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!, Z' E( Y& L+ M! A; s
                    continue;
. l6 Q! H2 J3 i/ l% N! j' v" z                }
! x" [0 t# B. h$ D: z                else
' g5 F3 }" T# O0 y. F                {4 h: {) c0 b1 h! k- p% W
                    if (numw[i] != 0)# x* V, L; F3 [* Q9 c# f: f
                    {
: x3 O1 ?2 H  k$ M! y) c* ^- Y                        i++;
2 i* c2 o5 J) M% u" n                        k++;; K! n1 v% ~$ S5 h& c+ e, ?6 ~$ R- Y
                        if (k == n)
: y% A6 D4 I! S9 `$ O8 I- n) ^' u                        {
9 x, H8 q* C5 `; M                            numw[i - 1] = 0;//把在n位置数组元素的值改变了, [; f- Q4 u  c9 C
                            k = 0;. x; N: o3 T& I) Y! v; M! w: q
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
+ ?2 o0 E$ j6 W& ]5 k, ]) r                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
9 ?! I* I/ ^, h9 W3 {                        }
8 U# Q  q4 ~' q* X- n                        else//输出暂时还没有改变数组元素的值. o" Y/ U$ H% X4 U8 h4 A
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);9 K  ]( X! L+ E7 J  d
                    }
) L+ D$ p0 c# B* ]8 T0 l                    else
+ t( k8 ?/ v; x, n) }                        i++;//数组元素为0,直接跳过,不计数。。。2 X% |* `! d3 w7 I- m
                }/ R. ]2 q; W7 H5 K. C' {% z+ @6 v
: X) ]( @6 m+ [
: |& v9 z6 D8 t" y3 b
            }//结束while循环. z' y, N  l$ K7 h6 R0 u! E. u8 ^
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
; E! z2 ^! h! H. f+ b% H           
$ Y; i5 U1 a0 \                if (numw[i] != 0)4 \2 R; D) e! J. J0 Z% t
                    Console.WriteLine(numw[i]);. L, ]' `) Q  _- a- d5 u5 A0 h
           1 }9 v& J9 C; W3 s7 \
            Console.ReadLine();
. E2 [; E7 w; g9 O        }, S- K6 K& |" A( O. Z0 h3 K+ D! D
    }
3 G) p& w; Z. |}- q1 D# C+ V8 j( B0 X/ M
小甲鱼最新课程 -> 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-2-15 19:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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