鱼C论坛

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

猴子问题

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

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

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

x
大家好!2 R& p6 p2 @4 B3 T* L. R
这几天我在忙着编一个问题,我用了一种方法编出来!; p! Q0 Z3 X/ j# v
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
. P- Q! ~8 _4 v, U2 @" [6 K6 a注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
! Z7 Q% C/ F: m3 V0 ?
7 e9 Y# r, x$ |9 ~; @
9 ]8 B6 |; i2 K- w" {% e
                            题目1 V! H7 A- v# t0 Y
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。$ n0 p+ k( A( l7 r( o7 b
第一种方法:利用循环链表
' x/ l) q& C( a( I/ X2 I: |#include<stdio.h>
$ V) `: Y( A* d- S5 ]#include<malloc.h>6 o  n4 ]$ W* d1 l+ e, K% }
#define M 8            //共有8只猴子1 A: d. C8 C. `. f
#define N 3            //数到3只时退出第三只
- \0 }. O# H7 Z8 F- m& ntypedef struct monkey5 b' a: M/ L8 D3 l7 C, y
{int number;
7 y6 W! d' l- d+ p0 I+ D( Xint flag;  A& M/ J4 X& v2 j: y% {
struct monkey* next;. U) |1 k' a' M( h) b" W
}MONKEY;5 P+ l/ T7 x/ A
main()
# H- d$ m4 d1 ?# r7 L{ MONKEY *head=NULL,*p,*s;6 ]9 Z( c" D3 I6 W- V/ A( k
  int i,sum=0,count=0;* S: X! u$ L8 _2 u
  clrscr();              //清屏( r1 Z) |, b1 e
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存% R) x" N$ N2 L9 ~3 W
  p->number=1;p->flag=1;1 @9 V$ Z; c; p" {3 K. p
  p->next=head;- [( f5 _: b( H9 t
  head=p;1 P; i( K; ?8 Y" [/ |$ V
  for(i=2;i<=M;i++)6 Y& c$ i, [$ B5 F- A# t) @+ l
    { s=(MONKEY *)malloc(sizeof(MONKEY));0 _3 E  c' q" G) O! o: D( q
     s->number=i;s->flag=1;9 S! D( T% L( Q# {7 j1 {1 N  Q3 L& I. V
     s->next=head;" u6 r: v) F3 Q0 l6 P3 e5 q! U
     p->next=s;p=p->next;  q0 E- \3 n( @2 `) P4 K0 F
    }! s  E* o, `% O) T7 x) a) s2 @
    p=head;3 R1 H+ o& `# R: j7 N1 U# h
   for(;;)
& O) u4 w( n8 M1 E6 b    {if(p->flag==1)
+ g$ M, V& F; n& n       count++;4 d3 D' V8 B2 s6 v+ W
     if(count==N)
+ p, \) M* y8 ~/ w- {. O" u        {p->flag=0;/ E. \5 l2 k8 {* X1 @" J. N1 ?9 l
         count=0;
1 _  H  F' p% R% I9 G' w' o         sum++;}( G* O, G; o9 z0 Z  R: h- l
     if(sum==M-1)% G7 E( v  g' R, m( D1 _+ ~
        break;
7 M) W+ ^2 y6 `: {8 w: v3 Y     p=p->next;) u7 R7 f/ M4 v2 |: G! U# h
    }
1 F- b- F) _' H0 `% p$ p    p=
% U" i- p" t( B, y+ S/ C% l    head;- u  m3 I" F6 }% k9 z
    for(i=1;i<=M;i++)
2 ^# ^8 {- F" ~. b- \1 V. T8 M    { if(p->flag==1)
. q1 a- j; Y; f1 f& f9 c8 x! a, a        printf("\t%d",p->number);6 d/ ]; c# f8 P* C8 q5 k
      p=p->next;
3 S+ ?* j, i8 n  t( u    }& N# c! @) n0 m5 V6 z

9 W& w$ B7 R: d( l* m: o- X$ t1 W+ X5 F% @+ \+ J
: a0 _( t0 m% d; ~( {
}

( L' X$ w$ o7 t9 X. U( U第二种方法:数组
( ~& A( X' o* `" G) O# _#include<stdio.h>) z* S) N2 N: h
#define M 8$ M/ E# ~: y- s" e9 Z! O
struct monkey1 R0 d$ c9 i8 N2 ?: J, s( ~
{int number;
% }# Y7 u1 }8 R1 wint nextp;
/ f, c% b/ O( |5 Y/ S  I* ^1 p' o}link[M+1];
* y( S2 ]7 @) Y( w  V7 }$ W3 l. a! y
5 O, Z; ~7 @. |5 Pvoid main()
+ A6 A3 q# I  l( `2 V- M{int i,count,h;
% j; X3 `8 g* bfor(i=1;i<=M;i++)
! ?/ A$ l4 f2 \. y5 Y{  if(i==M)
% F- S8 a; Y. C. `7 m   link[i].nextp=1;
: `' w6 e8 K9 h. ^   else
3 I; N, g/ r; G1 o   link[i].nextp=i+1;
2 Y$ O% {/ {/ t3 Z4 h/ Q  link[i].number=i;
& I. G5 q+ U$ d9 ^}& L7 l$ a6 H3 h$ t% F5 p
printf("\n");
" J/ r* y, O+ F9 x4 m2 xcount=0;
, Y( o7 H' \' X! U! T. yh=M;& G' k; f# g! B/ _+ G& ~5 n
printf("依次退出的猴子: \n");# @- l: ~' v0 \+ b( A5 D( i
while(count<M-1)
; M( A  ~$ I7 o+ X{i=0;6 Y9 O! w2 V1 w7 R
while(i!=3)5 ~3 B- k* P9 B( E% _; l
{ h=link[h].nextp;
9 i7 Q. ^) H" i$ r. v   if(link[h].number)
- @" h6 v' x5 a' P" E* A$ X     i++;}: v# L  y: c4 t9 z$ L
4 L1 D8 T2 H) S
printf("%4d",link[h].number);
& p6 D, B0 }3 @; ylink[h].number=0;
5 v, x! R- M) t- u6 J, u; {; Jcount++;
9 c$ ^; P- t/ T# p& J$ O}
5 ^3 ^4 `- H( a7 ]  b1 T, w
+ N! z9 Q  Z5 X+ S8 W/ @* mprintf("\n大王是:");) z# I! {. u, o7 @6 k7 @* M
  for(i=1;i<=M;i++)
( A5 r  J+ m( W8 n) H$ ]  if(link[i].number)/ z/ j% T& w1 O5 p! B& P
    printf("%3d\n",link[i].number);
6 ~& c  O  J  Q; f- |* V, D& u5 r2 b% u2 w- v* @' [" }4 D7 _8 b

: T8 {+ p0 |9 {4 \}

% ]9 E. J5 }5 s3 j第三种是普通方法for循环

* `* S2 Q" B. Z* w8 {) Z#include<stdio.h>
6 _& }" Y+ K, d- v2 t7 M; v/ n  Rvoid main()
6 c& H1 g/ Z& I! A: m9 |{ int i,k,m,n,num[50],q,*p;: q3 p9 T( f% K3 n/ B: l# l
    clrscr();7 Y* c% _* g- U
   printf("input number of person: n=");, c: y+ f3 Z- f) [6 B7 u2 ~
    scanf("%d",&n);
3 x: \  h9 T  jprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
3 Y' b$ U- |; r0 }! i  a, F* _    scanf("%d",&q);0 a, l: R& c* |
   p=num;" N9 @3 `. j) b3 ^5 |, n3 W8 q$ b
  for(i=0;i<n;i++)
: S/ a" F' E! z" b  u" r  c    *(p+i)=i+1;
" h# M6 X, t+ M9 \; h) C+ F2 t) X   i=0;
7 W) U2 h* |) C   k=0;) ?& x# O- X! W# p
   m=0;
! D6 Y  \" N; H' Z- b0 ]4 c  while(m<n-1)9 L% Q% y- {' @* O6 o( C6 m; C( T$ e
   {if(*(p+i)!=0) k++;
( b- o2 @/ ]& _' J     if(k==q)# I% C# V6 M  S, w8 S' l
      { *(p+i)=0;
. w2 ]- i  H/ ]4 B3 }( Z( T2 P        k=0;
+ ]8 m8 I9 v' v! \* W. u        m++;
! n& k) m9 \% b" p      }2 K4 H7 s" S7 ?3 L' K( q+ I  {/ N
    i++;
8 j7 P: N6 z  t: F    if(i==n)i=0;4 m6 C- k0 d. w5 j, _% l- h
   }2 T; R& E2 R6 ]
  while(*p==0)p++;& J( o6 V/ U4 s8 r& F7 P8 |
    printf("The last one is NO:%d\n",*p);3 [( X' `' @. J" ]4 x2 A
     getch();* t4 {5 K8 S. S. g& o! @/ ~
- _6 N/ J' S1 m# j9 e- M7 K
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
( f  o4 s: z9 }+ _9 S" j" |namespace 又费马达又费电
- h8 b4 x4 Y5 @) U{1 r/ c5 O% e, `
    class Program
( L. X( Y+ p7 q7 ^* h& i    {6 ^( v! O2 b7 v: N- X
        static void Main(string[] args)
0 C# V: E  S$ x7 {        {
0 Q, b2 a; n' g8 g) w            int m, n;
& _3 b, S' ?6 F* T: P" J, f( c            Console.WriteLine("请输入数组长度");, D4 K. g+ C6 t: I# F
            m = int.Parse(Console.ReadLine());//m为数组的大小
& ]0 q1 p* s! ^6 y: e            Console.WriteLine("请输入要截取数字的大小");
+ }) P) P: d: K( o; @* V9 G            n = int.Parse(Console.ReadLine());
5 K4 ?& `% _% f+ ?            int [] numw=new int: ]7 Z6 q+ Z5 c; m- @
. s, b; ~5 `- Z
&shy;&shy;&shy;;4 w7 R; |! A3 B) J, \" X
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
" I: m6 l1 f# A7 J$ g$ c+ Y- ?" Q            {
" F' f9 G1 H7 O; j6 W6 L0 K' U) D                numw[j - 1] = j;
1 g/ k/ S! d# ~. v" w. p% K+ {            }$ m4 h8 k9 O/ r: Z
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
; @/ u* v0 K2 C- b- S            while (d != m - 1)1 M% y5 Q4 k& _5 R2 [
            {
7 _6 R( l' W, |- T                if (i == m && d != m - 1)3 k& I- c5 g9 U0 M9 Q( {1 K
                {6 S" Q& T: {- Y9 p6 S
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!1 c9 Y6 [8 J1 ^5 q5 a
                    continue;
5 z- O! |5 o1 {! e6 z* C/ R                }
" x+ K+ e- z" I                else
& s$ l* ~7 y! E5 Q+ x, I                {
3 ]& H( _$ z9 m4 Y                    if (numw[i] != 0)4 w: y! y9 L9 S0 s/ I8 j! z) n. ]
                    {
# m  b1 s, z2 {& h3 _4 M2 R                        i++;7 _+ B+ D$ Z" l
                        k++;
! T6 w! Y5 i; y: Y9 w) m! B$ {                        if (k == n)
% j: T1 l: q9 k                        {/ }/ {& Z$ l+ s0 u( b9 K: B
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了( m' T( C1 M0 n4 |
                            k = 0;7 j. W6 [9 j$ e: S* {
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
# S1 T- A6 f: @6 `! J3 Z                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);  G1 H. _2 F  |
                        }. J( q* B& a2 o9 X0 ?
                        else//输出暂时还没有改变数组元素的值. s* K: y; r, D
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);% r$ [. F+ t, {( U" e9 g
                    }' R. ~& C. Q7 i$ R0 ?/ O
                    else
* T4 D! k* }7 L/ ]8 @, ~+ C                        i++;//数组元素为0,直接跳过,不计数。。。0 l( f' c6 w. a4 p* ^% Y( N
                }
1 e$ N( v  }& q8 |
, M- [7 C: a7 J
$ d4 V/ J) u. i! v9 \- w            }//结束while循环* X$ l- u8 k9 }% G: h; q% ^2 s
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
" }% m5 ]8 ^! `- G" r" P2 m$ ~+ a           
( G) ?# S& b% e1 o                if (numw[i] != 0)
6 a3 i& N' V  Y: G. ]: F                    Console.WriteLine(numw[i]);
4 p+ A5 q5 ^1 f           
4 J2 ~; c9 v, }! O  A" V$ b1 ?            Console.ReadLine();
6 h$ C! x/ h4 m& l& o/ b        }
/ U/ `  B+ h* `0 f% d    }" ]9 h9 f1 ?; g3 f+ L% }, Y6 f
}
+ q) ]% [1 g& @) u1 d% ~9 J0 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-7-6 12:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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