鱼C论坛

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

猴子问题

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

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

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

x
大家好!
5 |& z( x$ M9 e7 H这几天我在忙着编一个问题,我用了一种方法编出来!* J0 X) o4 U; E3 X6 q
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!6 T% l1 F8 X$ ?6 V8 o
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ( [/ O; H; c4 x9 c

- j5 d  Y& d: _: |) Y7 H
+ |0 u: P) x# ~
                            题目  f0 I3 t# Y/ ?- L& r
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
6 `- e1 t7 C8 o& V1 u4 q. F1 x第一种方法:利用循环链表% B9 R3 n$ t6 e) O: t3 U* L
#include<stdio.h>% M1 S( l9 s) i; r3 c  M- s$ l' Y
#include<malloc.h>$ N, ?- c" _3 F3 d5 ]3 ~
#define M 8            //共有8只猴子
: P- ~1 Q1 g9 m8 ~#define N 3            //数到3只时退出第三只$ j2 f2 P+ G. `
typedef struct monkey
/ Z3 V/ B; B5 O{int number;, J$ o% f" S2 J5 a
int flag;
5 |! q; B/ l( s+ ~6 Gstruct monkey* next;7 d/ _5 j" |6 d# |
}MONKEY;4 N- ]* s: V  t$ I" k9 b; r
main()
' @1 f: f; y% Z! g$ j5 V{ MONKEY *head=NULL,*p,*s;: x. u( E& t9 ]' C9 D, V
  int i,sum=0,count=0;' n4 b- `5 f" V( A+ z9 u/ O
  clrscr();              //清屏
- R/ Q& h+ i: r/ A2 r/ z2 K9 E  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存6 h, w; o3 o' J# I* J. E
  p->number=1;p->flag=1;1 K, r! U7 w  B3 h7 R9 y
  p->next=head;' F5 @0 ?: U+ c( ^8 H& l
  head=p;
8 u; _2 K  |$ {3 }' e! L  for(i=2;i<=M;i++)
# o1 H5 p9 @( Q+ d$ ~    { s=(MONKEY *)malloc(sizeof(MONKEY));
2 ~& \6 z: \. U8 F4 h+ b     s->number=i;s->flag=1;5 S' Z: d( D" @/ e1 Z
     s->next=head;
! U8 b! j$ R% B$ i( w( {- p     p->next=s;p=p->next;8 Y$ F, ^8 p! v, H* s0 S0 s
    }
. w4 z& ?" L) Z& T! Z- P* ?" \9 Y; Q    p=head;4 S+ @- V6 k( B& u
   for(;;)6 C* V: m( D; C$ y' [3 Y( V
    {if(p->flag==1). ~5 U" e4 W) q6 S- T) U# q; e
       count++;
& b# q' t9 L" {' x  Z' f3 r     if(count==N)! F& s( [* _# h: ~+ v+ m
        {p->flag=0;
3 P: p- R) ]) y; S+ ^* Q' Z         count=0;
0 h% h7 h) d9 A* n5 S) O8 p& X         sum++;}
& K. H2 u! \/ p3 P$ V$ F1 S9 w7 J% t     if(sum==M-1)) y0 ^* n( D$ [, r
        break;/ J$ B- j* S3 u# c( F
     p=p->next;. ~8 x3 v/ d/ \1 L0 O
    }1 c5 }# E% v1 j7 \
    p=
9 X& G/ v4 d$ s! E$ I    head;
# e# o* [# \: U( ?4 B* w    for(i=1;i<=M;i++)( [$ W1 K& u& n
    { if(p->flag==1)
+ V+ ^0 v+ x+ M8 ?& F        printf("\t%d",p->number);
0 ^6 P& F' s9 E* N      p=p->next;
# P$ J4 O: K- f+ L6 c    }! P) Q& B& A0 h$ }0 \$ T, }* i/ I

1 W1 V; o4 x4 H) M, K' c& n% d8 R" y3 z& a  z' B
# i2 c9 M: C) i, v9 U0 w: M
}

( V5 L5 F1 E2 A$ u: P" E& y  X第二种方法:数组) y6 h+ N4 }2 |2 E8 |
#include<stdio.h>8 V# r  N! J& y6 B5 `. ^
#define M 8( P7 U. ]- R' J4 ~: T6 h$ B" T
struct monkey# M; t; C2 W6 A0 b; _
{int number;
/ s1 W6 C% d- |int nextp;! y8 \6 J0 g# v
}link[M+1];6 c1 n( _. l( E- d

' G  a1 r$ n8 wvoid main()
  E2 s6 @* }/ e* j{int i,count,h;
* f" t9 c9 v9 y. L" ^# c+ Sfor(i=1;i<=M;i++)( d/ |' {2 S, L. z
{  if(i==M)% q: p! T) B( Q$ e. m9 O8 b
   link[i].nextp=1;
  q2 P. o# m9 Z; m! Y4 N5 S2 a   else) }/ J$ J2 o( K$ `/ D* v
   link[i].nextp=i+1;/ Y, \; g7 z6 }7 s
  link[i].number=i;
9 o; l# J# y7 t3 v- A; M1 C% t}
$ k3 e* p& d* b! p) y/ hprintf("\n");
4 ~7 Z- Z6 w7 q& |' Acount=0;1 L: w/ J) u- d3 J) ^" m1 |
h=M;
5 H0 g  H  I' F. lprintf("依次退出的猴子: \n");
7 N' [0 z) w1 G, D( p% q  ]while(count<M-1)
" W4 l/ }4 x' c: U+ L$ @{i=0;, N+ y% k- V4 r) U" Z8 \! e- L
while(i!=3)
* w, B/ w- {: j! ^, ~$ Q{ h=link[h].nextp;
8 p4 c" V5 F9 l$ l5 ]) R   if(link[h].number)/ g4 a1 ]2 q1 H$ `3 w- k
     i++;}, |! r" w3 E# }6 d2 H2 J1 q

% U0 r" U* Q% d8 k. S4 Rprintf("%4d",link[h].number);1 ^6 g3 f  B+ Z  X
link[h].number=0;' S6 q, ~5 m- \" X" o7 y9 c
count++;
) s1 \) ]* L1 o1 E9 P5 _}$ _7 w- O/ \4 B& U4 w* g1 b/ y

# n6 }% h1 {& J1 j& V+ A) Yprintf("\n大王是:");
) \) L" p: f# P  for(i=1;i<=M;i++)! O3 Y- \2 P: G( j+ o, a& H& f- a  w
  if(link[i].number)9 z# y( A6 r4 `* D1 ?; r
    printf("%3d\n",link[i].number);
6 c1 l3 |/ M; W# M
* w5 `# R( J9 Y+ C, Q+ H3 S( v  b' p4 g4 e3 T! g
}

$ L' q7 X0 v+ {4 ?' }1 R8 y第三种是普通方法for循环
  X* ^8 Y# c$ r2 c, Q! B
#include<stdio.h>
+ }0 V9 d7 W% E, F+ lvoid main()
& h3 F7 C; m2 K( G3 G% Q{ int i,k,m,n,num[50],q,*p;( Q! b; p" N0 N* W# x
    clrscr();
! t- e2 `6 D1 J+ u+ C   printf("input number of person: n=");
+ U# }4 z: z' b0 n! d; L    scanf("%d",&n);
& N6 s, [# |: K* B# Q, W6 Cprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只7 U( x& _7 K. a$ w
    scanf("%d",&q);
1 P: {3 z/ I8 r# S3 l8 P   p=num;- H9 x& @7 H# A+ Z, O1 m3 w
  for(i=0;i<n;i++)
# y7 ^+ [" Z4 w6 J    *(p+i)=i+1;& b  J8 u) j* h" _% u7 A+ }( p
   i=0;( L' W+ K! F- p5 U/ i$ p
   k=0;" l" {) A  k5 m3 E7 j
   m=0;1 o0 v7 f+ n6 Q3 _1 P( Y( I
  while(m<n-1)( [6 u& v7 B2 S+ h
   {if(*(p+i)!=0) k++;( B4 n' E" x9 u3 r4 b9 S
     if(k==q)
9 U0 |1 K; J+ V5 n# k: v      { *(p+i)=0;
, N' ^  l- o/ P        k=0;) u4 @2 R* P9 j* z. h
        m++;
% M( [5 |: `. |; [" |      }- \0 [; M5 q+ D
    i++;7 C3 U, w6 i) A7 |! `) ]0 W) ?
    if(i==n)i=0;
' l  Q5 d2 t/ d0 u0 k5 l   }& T- x" U( n- ?' Q9 d
  while(*p==0)p++;5 S) ?: j4 m5 l- i! W
    printf("The last one is NO:%d\n",*p);$ L  ?+ o( I5 ]
     getch();% ]6 O) w  m% H' g- ]& F$ r
3 v6 ]7 p& b  V* r
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;% P' x' E* P& F/ i% e
namespace 又费马达又费电: Q) ?4 W" d3 f+ a6 W9 z7 @. w4 I# O
{9 {7 [2 H' s0 t; Y% P, M3 U
    class Program# T2 T# D. S: W8 C" N
    {
8 ?' t- q- V& s4 u8 F        static void Main(string[] args)
1 L6 [7 n; Q% y* t3 V2 I        {
3 `0 M2 ?9 `; [$ E% S            int m, n;8 X9 H8 {* a& V" C/ P
            Console.WriteLine("请输入数组长度");3 ~& P9 y: r7 d* L1 |4 P
            m = int.Parse(Console.ReadLine());//m为数组的大小
4 g- v, C) M/ |" g* Y" l5 W0 C& _            Console.WriteLine("请输入要截取数字的大小");$ e3 l$ B0 e. \
            n = int.Parse(Console.ReadLine());
( U' s; {9 L$ }2 z* U            int [] numw=new int7 H5 V& @/ \4 g( h

* q7 z' M. j. }) b' R2 i* Q0 `7 ]&shy;&shy;&shy;;4 N2 R) P* J8 v6 C3 J, x  A7 O
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数  `" y7 E/ y( l& M% t( Y
            {
, e2 O* ^, a7 v0 ~, T8 p                numw[j - 1] = j;5 ?/ l( F0 M, n* g
            }
7 r3 l$ D# z0 N4 D8 ?) o            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
/ N+ J2 `6 _8 E2 d            while (d != m - 1)
( W# \2 ]$ A- K# P# ]$ \- R, j            {: c2 j! Q- l+ `8 s+ K6 b$ V0 S0 c
                if (i == m && d != m - 1)) C3 e1 y- T0 O' l
                {. L" u4 |4 A. e8 h# l
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
- \& u- u1 E' @# P( }( y* l0 V                    continue;
3 z8 A% X* X  \/ t7 l- n                }' O9 I0 E& S" r2 S, g+ d8 ?
                else4 b# W) h* ?( R& l% f
                {
8 M3 o& \; Z) U4 B                    if (numw[i] != 0)
! ?  _' R, `2 }' j; {- v                    {
* O4 M6 ^) z: V                        i++;
$ i+ ^9 }) B, m- H1 G, n8 x: A                        k++;& L# u) E. U+ E7 C
                        if (k == n)
8 ]6 e8 f; V3 Z9 ]+ U, v7 i                        {
, `7 _6 S1 i) ?5 d' M! J7 O/ P                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
4 w7 W, V7 e( s8 ]& |- K' Q6 t/ M; a+ R                            k = 0;% a# x3 O1 ~& ]8 u  N
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
6 r- Z0 C$ o2 X& ~. i9 W+ ~                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
: T* Q  B! B& I                        }
3 p7 e+ o! E' [6 X$ t1 N. i                        else//输出暂时还没有改变数组元素的值( X9 P% z  R' X/ N; `
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);. m* ?( k- X' |4 J% e" U* g
                    }
% F/ O- q$ E4 G( U0 W; U                    else
1 D5 g1 Z& M0 W                        i++;//数组元素为0,直接跳过,不计数。。。- O. z  |. C+ s# ]' E
                }
0 d9 d# b0 ]2 z5 w# F$ ]$ F
; c! H0 Z4 e2 e7 u# [
! i; b" D2 M, y* w, b$ F            }//结束while循环" ]7 P" B+ E; Z4 Y( u: Y+ J# D
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦- o  z! c3 K' ~7 C- \6 M
           
1 h* _6 o' H2 l" b" M                if (numw[i] != 0)8 l5 i& ]: Y) W
                    Console.WriteLine(numw[i]);
& i! j3 |# e; w           
9 w* N. O9 e6 e! ?1 u$ ~  ]4 }            Console.ReadLine();
4 _. P: b' g; A5 L7 c3 n0 r# t        }% k1 @4 u0 X4 \3 e( V* P' H
    }
) I" L5 {9 C" `+ s}
3 ~+ n8 W* k7 H6 y& S6 {
小甲鱼最新课程 -> 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-6-9 11:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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