鱼C论坛

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

猴子问题

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

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

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

x
大家好!
* B) @% M  [5 s7 C; u" [这几天我在忙着编一个问题,我用了一种方法编出来!
( P8 A. d2 I; y但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!7 K- n- Y8 o+ Y& L9 p, |3 E
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
8 J6 G, x6 M. _: |, }# o% t& L) y7 z& f8 ?/ Q* w
4 D+ O, g# Z! n& T
                            题目
4 U2 [$ I; H1 P山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
$ W  [# Z" I' x' l" r% @* C第一种方法:利用循环链表
: @3 o* k6 b/ N2 y) }' B$ y#include<stdio.h>; t5 ^: {0 p8 x0 G( C0 o1 k
#include<malloc.h>
- h1 R7 O( ?8 }: o0 c#define M 8            //共有8只猴子
% q0 t# I- t% G, n) B+ r: u' J#define N 3            //数到3只时退出第三只
, \2 J0 ^: z3 q/ O% x2 \typedef struct monkey
$ c5 d0 m* |8 A- Q  i2 I2 {& k- ~{int number;% U' }6 C2 k2 M. X9 ~! [/ {6 @
int flag;
$ C7 ]- s1 j+ R5 m" `1 z" i3 `, vstruct monkey* next;( C7 S1 _# ^2 `3 N, x% O3 T; ?
}MONKEY;
1 W; T7 u3 z5 W! D$ e& Lmain()# [) q( K, i! b. [
{ MONKEY *head=NULL,*p,*s;
6 _* s  }8 q" L7 W6 r  int i,sum=0,count=0;
" ?9 G5 o- h, F" i- w" S1 E% T# M  clrscr();              //清屏" f" @# n9 J3 r
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
! Y9 J1 Y( a8 g) T9 s1 G! G  p->number=1;p->flag=1;+ `( v7 i) E9 U+ }4 R3 _. ~
  p->next=head;# [! N( ^' _% C4 d: B2 q; _# T
  head=p;
, G$ |% u' Y5 q, h  for(i=2;i<=M;i++)( G6 d! k1 u# B% f, m
    { s=(MONKEY *)malloc(sizeof(MONKEY));
& W3 z. q  y/ Z! _3 O8 \4 I     s->number=i;s->flag=1;
. t" _7 {5 L# M' S- [2 R+ Z6 e8 a  K     s->next=head;
, e( V2 ?4 g2 a  O1 b6 y- r4 X     p->next=s;p=p->next;( Q/ W& C) A# d# x8 |
    }
" t6 W; U& _; s/ z8 [" E    p=head;9 f' g$ u- V& F" I+ {
   for(;;)
% ~2 g! a2 A0 F    {if(p->flag==1)
* _3 e7 }  C4 m* y5 z1 s       count++;
1 Y3 T* h5 D4 O7 `3 W7 Q     if(count==N)9 F6 j% W3 i1 V( k
        {p->flag=0;! Z( ?0 N  X1 U2 x% V* T! W% Q
         count=0;1 k; m0 r# V; l
         sum++;}
3 j4 S7 c& t% }) C     if(sum==M-1)
4 I, s" D9 }7 ]* U        break;
( ]' v$ b3 i0 r" C. w" @: Q' g     p=p->next;
# E! a. j3 }2 W" w4 |# q! k    }1 ~* S4 n# D0 g: L& W, D# D" W' y
    p=! a4 Q/ L  }, E/ o( y
    head;
0 J, o' K0 x$ _- K2 E! i. Q3 e6 G: I    for(i=1;i<=M;i++)# d) _+ e2 T/ a" z( @' n. J/ s
    { if(p->flag==1)
! i% X+ d# R) o        printf("\t%d",p->number);
4 a4 Q2 n& w" _7 P4 S8 f      p=p->next;
9 v9 a! n* e' q* G& ]3 G6 ~    }1 k& @3 y0 x$ T; [' R

: N  ~+ Q% m( h9 c
( X) {; F) r  z
- E  F% a3 M* h6 u- P}
2 S5 d7 {, c: N- V# i& o* D7 e: E
第二种方法:数组- ?; Q' `  t' Q& ~6 y" w# \  K
#include<stdio.h>
/ y! M: E9 T3 B" A8 T7 L#define M 86 e3 J. O6 ?: P
struct monkey2 N" N/ i4 s" c+ \
{int number;+ t5 {2 y/ ~- {+ d$ ]$ b
int nextp;0 [8 ~8 O0 Q5 C& H' i
}link[M+1];
/ P2 ^/ s/ J* n' j1 E4 [' D" Y2 `" I4 o, g
void main()
# o6 @8 L8 A. t# g) w/ N{int i,count,h;5 X! M/ i! ^+ d3 o
for(i=1;i<=M;i++)2 \0 B3 t! A, m# }7 H9 Z) J; L
{  if(i==M)
: }6 {; s/ \9 P( n9 h1 b& A   link[i].nextp=1;3 |! g- o  \8 ], y, f$ n, N
   else
! z6 V+ |5 H* m: i# \: ?1 W   link[i].nextp=i+1;
3 S0 g+ ?0 t7 Y6 R% h  link[i].number=i;, v, E3 S; |9 ?. w% B. J
}9 E1 J' c1 G9 Y* l+ q
printf("\n");
' S+ ^  n) l% D4 [+ q* n1 fcount=0;
- i7 |" R/ U) u) |h=M;& n8 {+ b5 \9 G7 D5 r
printf("依次退出的猴子: \n");
1 z$ U4 q+ M' q8 N6 @, p5 Owhile(count<M-1)8 n1 V2 z. `3 c& }4 F1 _
{i=0;6 G: \, u' R7 s* |* _5 I9 [
while(i!=3). C# A# u/ t3 b. h- {8 H5 X
{ h=link[h].nextp;2 {4 {! J' d+ Y1 c
   if(link[h].number)
* R" x# D* ]8 w$ c     i++;}
2 l& W# C; u8 P& X* k+ e  K1 d
8 S7 ?9 q8 c6 P* j- s5 wprintf("%4d",link[h].number);! y: E" U; h, G) y0 ^
link[h].number=0;  j7 `) j/ E. i% e/ n( U7 b3 L
count++;" T) N5 c# J: O- @* v. \: D; {
}
+ H3 _2 U8 ~* e# |/ t  |9 i
  r& n6 B9 O# R1 n- B, Z3 Aprintf("\n大王是:");
4 L+ N9 B) K, S2 T: G1 r, R  for(i=1;i<=M;i++)
$ w' r2 P1 F+ G0 r  if(link[i].number)
  o( F2 J0 k; x+ L    printf("%3d\n",link[i].number);
) o9 d1 d' }- d. `! R5 e- g2 Y6 Z
  x! A+ k& X+ ?/ A( N# l# s9 G. e9 ^9 m6 N5 \6 @# P; g2 x# K
}
& H% e  H; Y. Q" p  n
第三种是普通方法for循环
8 r- l! f5 Z  B4 ?
#include<stdio.h>7 }4 Q. |* h% I7 m5 s7 y
void main()( Y6 N* A( H& I" G7 ~  N# H$ A* l' C8 q
{ int i,k,m,n,num[50],q,*p;/ D' Q: e8 y9 v0 [
    clrscr();
' b5 A, V- y0 F6 M   printf("input number of person: n=");' U3 s" l9 ^- Z1 p% [9 T2 e
    scanf("%d",&n);$ k% F' Y1 |/ M- y' f5 m9 }7 X
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
8 L! d- q! t# r3 _& A    scanf("%d",&q);
0 @3 v1 o' S) K; |   p=num;3 t! \. {* _5 z- ~2 N
  for(i=0;i<n;i++)- K/ p: b$ C: R$ @. A, z2 U! ?, p/ C2 P
    *(p+i)=i+1;
* n  \, k& g: j9 H0 d   i=0;
  K7 o" a. K; c' I1 \# O1 m5 l   k=0;
6 \7 {6 y7 m$ u! H$ I' L/ Q   m=0;
0 \1 W( \; h" a8 D" _; P9 ]  while(m<n-1)
7 H1 K2 z2 g% t: I   {if(*(p+i)!=0) k++;
' ?) h" G3 H0 F% R7 z0 \: }2 |     if(k==q)- U: C& K, \4 D4 z3 D$ X' c8 d
      { *(p+i)=0;
) J0 `) B, p- P) Z( b/ F) t# _        k=0;
: s) k/ M* d4 K* F' s: B        m++;0 L+ |- e3 O; X9 W
      }# ?9 N$ H# w5 b7 b+ ]
    i++;) N6 d6 Z# `. o% _" t, }
    if(i==n)i=0;: _' e+ ?; Z- t" B% [. o7 q3 m* s" J- B
   }$ ?) ]& s' l" u! l3 b! q1 s
  while(*p==0)p++;& y9 b& Q, `/ \$ o1 ~( z
    printf("The last one is NO:%d\n",*p);% S* z  k: J' }
     getch();
" O& k7 Y/ A  e7 R8 d
0 I2 Z/ g+ P+ E8 g9 d}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;9 e$ ]" p4 G9 l- h4 c5 V
namespace 又费马达又费电
9 T0 D+ y; V% |" T{/ t& y, w; {7 r. |9 N, T) z; l
    class Program
$ j1 r1 s; c' c7 m* O4 z& @    {0 n8 p2 |3 y0 b* d& ]8 d
        static void Main(string[] args)
# M' q. j1 N7 Q: `% ^        {
$ }/ V/ U: @6 i  r            int m, n;
0 p7 @8 e4 n& r- G+ v2 n. F: _            Console.WriteLine("请输入数组长度");
. C6 _) E9 Q. F, D1 C- P            m = int.Parse(Console.ReadLine());//m为数组的大小  w% D3 C% O6 `1 E& D8 H7 b
            Console.WriteLine("请输入要截取数字的大小");
4 s0 e# N1 f! l; x/ Z* u            n = int.Parse(Console.ReadLine());- G* V+ X3 @: _3 F0 {, n3 i4 z+ q
            int [] numw=new int' l) D$ |* F% h, \
0 [4 o$ W0 {+ I% r7 w: r
&shy;&shy;&shy;;& C/ G$ N7 g: O
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数8 F3 }2 R5 {& x. i
            {
+ f; n, H2 |$ d; G2 K4 S                numw[j - 1] = j;
* R% m6 [' j0 D4 X            }) N( S2 n' \2 t1 ~# V- I9 ?& E7 ~
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!5 f3 ]( Y3 c2 x
            while (d != m - 1)
* s! z: S  K$ b5 a8 K            {/ o$ R5 m% z2 Q) k
                if (i == m && d != m - 1)! O8 E$ Q/ X- F9 q  \
                {3 x: o4 {4 a. U* p8 F  s; C& }
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!& ]$ U2 P- ~" @6 \3 J+ S" X
                    continue;+ C) C% G5 a: ^2 n; G
                }1 X. w; k, T% b' `
                else
% `) b$ c2 w2 ]+ H1 _# d& Z                {8 g/ s( P& r2 Z7 g8 q
                    if (numw[i] != 0)/ X4 [& ~) o( n/ ]4 U* b/ [
                    {. ]- f0 S/ U: Y: D
                        i++;
3 n1 n  U4 K! J7 M. ~9 _$ _                        k++;" O, @- f4 d% Q! B# m7 S3 A
                        if (k == n)9 p( r% y% Z3 \# V% c% ?) m
                        {3 ]4 i; H, ~- `0 \- W
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了5 ?1 e; f% U9 J4 z- P
                            k = 0;
/ c# Y1 L5 w. v9 x+ B3 l              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
) b/ i" N" X( l7 I/ k                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);& e) `6 O3 i$ D+ @, ^
                        }5 r( ?- ]) P3 e! d3 S# ^7 @
                        else//输出暂时还没有改变数组元素的值: I9 e7 `( q( v% Y& {
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
# \# E  k( e( v) m8 \( |                    }$ y5 ?3 G; I$ S- T9 ~+ W* B3 C
                    else
# H% }4 V3 A' D0 M7 T                        i++;//数组元素为0,直接跳过,不计数。。。2 M6 P2 X* `. n6 `
                }
. ^: F9 y& N7 V7 L3 _
% @* a7 f1 y  O& _" [8 t  ]% @! X4 p# Y- R7 F) y# u+ f4 }
            }//结束while循环
3 A) K( e3 B" c7 j2 H            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦4 J+ L( n; T8 m
           
& Z; V: j( i. c1 W8 r                if (numw[i] != 0)
8 U& s* j5 Y9 W3 Z1 ^1 S                    Console.WriteLine(numw[i]);
  E; s( P0 B" X' l0 o: J5 @2 o           3 g, _: H. p3 `8 `  L& a
            Console.ReadLine();0 M& n: v. V1 A( [1 h2 p
        }+ A8 b; c& V; ^  c  m
    }
# e8 E! C# y8 ]% j/ O; G  n* A}7 U  [# R8 j$ Y2 |0 Y
小甲鱼最新课程 -> 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-3-11 06:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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