鱼C论坛

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

猴子问题

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

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

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

x
大家好!- M% m  |8 N# l
这几天我在忙着编一个问题,我用了一种方法编出来!
/ v! h' @5 r; b9 x但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
" w& y! H+ Z2 o注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
! t3 ]+ t& ^7 O; t- |( |5 S% H
' B- G& p8 D# @0 Y5 X3 S6 f, p+ }$ H) \  R( {$ M* j
                            题目
+ [! L( s" |& w4 M4 H山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。9 ^( n2 e; T/ a! V
第一种方法:利用循环链表
$ \4 W7 @4 w0 G9 G& ^% ^+ l#include<stdio.h>
/ p# Z6 f7 `3 m8 m#include<malloc.h>% L7 r% p$ D+ w, x
#define M 8            //共有8只猴子; R0 B, d+ \: h
#define N 3            //数到3只时退出第三只
& P+ V- c  E/ w/ p% k6 jtypedef struct monkey( l! d1 O: v5 z  b" [
{int number;* ?1 |  `: F8 s: _3 l! j7 \& Y7 A
int flag;" v5 Y3 I( @0 K1 o2 V* ^
struct monkey* next;" [- T; N! o, b: h1 f
}MONKEY;
5 v' ~1 F, O4 A6 T4 D+ o9 e9 E, qmain()
2 I0 Y, I% {4 L  q0 ?1 f' m{ MONKEY *head=NULL,*p,*s;/ S' I' X( Q* X' ]  U( H( c; U6 F
  int i,sum=0,count=0;7 A: I! ~0 k" i
  clrscr();              //清屏, B+ @5 p: A3 ^2 l; ^6 q* d: ]4 _
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存- y! A9 m9 g5 v
  p->number=1;p->flag=1;
1 r; R; B/ \6 N1 C+ F4 L  p->next=head;
! N8 ?: g$ f* o5 O6 s5 A; ?  head=p;; x) Y& B8 I3 ^/ u5 y' |7 T+ L
  for(i=2;i<=M;i++)) X$ V8 E3 b; M0 R' L
    { s=(MONKEY *)malloc(sizeof(MONKEY));
8 e/ M) a, y0 e/ p& y$ N( D     s->number=i;s->flag=1;
  D  X9 ]* e" w5 d: ~# n9 |     s->next=head;0 i  |5 c6 t+ C& n, h$ }9 H
     p->next=s;p=p->next;' q3 e6 K* A2 h' l$ j
    }; R' s1 Q: v0 k) O, w% ?' G
    p=head;- ^5 \$ m4 u: J+ i. z! q: a
   for(;;)( B3 {) Q8 R8 V/ x
    {if(p->flag==1)% c# `1 J& k( G% l
       count++;
; [* ~, w  h# C+ }5 F* Y- S2 ?5 ?     if(count==N)" p& F- u* I) S, y. O7 m' x9 f4 R
        {p->flag=0;) I$ M6 S* J. [6 ?: a0 o
         count=0;3 G. z0 R# k) \% E( L. ^' [
         sum++;}
  c8 ?1 K. \) X( |- a     if(sum==M-1)! S/ R/ U- J' D/ o; _: y% a
        break;
8 t# Y. _7 J; ^1 ?6 X7 X     p=p->next;
+ X! v% h' ^( |% u' v    }0 I8 s' R) y0 v0 D7 q
    p=
! ^7 `* x& J0 q" h$ C- T; H4 Y    head;
& {0 E6 G1 E0 z4 e# t    for(i=1;i<=M;i++)
/ b$ U  b9 {5 k( s' |    { if(p->flag==1)
& r( W- Y) D1 q9 j2 s( h+ v# w        printf("\t%d",p->number);
2 F6 J/ U- F6 Q- P+ T7 @3 s! Z      p=p->next;, b: c+ H" n" {+ c0 g/ f
    }* l7 |* R1 v1 U0 |8 J3 \

2 R7 v6 l+ R/ F9 M/ L- ?" U
8 V: v9 a  _/ \" f! Y' t5 S/ ^& y6 B9 d% x7 K6 S6 D3 z5 p
}
9 U: i: g7 c7 S$ j
第二种方法:数组
3 m, x1 r# F8 z3 F#include<stdio.h>8 }$ j& Q/ l9 E
#define M 8- F# [. ~) M: N
struct monkey
) K+ g  S' r. A* J! X6 p  T{int number;
0 r3 m1 J* X. Pint nextp;
& F9 k& w4 c# O- }}link[M+1];
, c( E: |0 C  s* N& D- S) C
  ]: t- Q0 v+ L. ~% hvoid main()
8 l8 i# b0 e" V{int i,count,h;
: g9 D" y* r  n: R) qfor(i=1;i<=M;i++)/ l' O* x! f) Z7 N- V
{  if(i==M)
  G5 d% W& B- z7 s5 p0 z0 G6 a   link[i].nextp=1;
% w& i$ }( U' k% _   else: d1 Q$ @) A4 N# t+ R
   link[i].nextp=i+1;1 P# ], u; J$ i; t8 l
  link[i].number=i;
- m' w. }. _0 T. b) ~- S  p}' m$ ~; x* C' ?% t
printf("\n");
, z/ R/ P. p, Z$ g3 F( Icount=0;3 ^3 p7 c. d: Q7 H
h=M;
2 R/ _. K6 J2 G" oprintf("依次退出的猴子: \n");
1 }5 S0 b( Y3 D% m1 D3 U/ Uwhile(count<M-1)
: n* _4 z/ l% H6 W" c/ I{i=0;/ N! H$ |! W  p; G9 p
while(i!=3)" B6 B* Q: z6 J+ ~, Y" N5 P
{ h=link[h].nextp;/ h4 |7 K  A! k- n1 C4 Y' h6 B
   if(link[h].number)
  R9 K2 A/ n2 q; O$ j     i++;}6 `4 Z0 U. k0 V
, t5 i1 y5 i) B# B, Y
printf("%4d",link[h].number);* g' B& H- \8 b# a, @/ y
link[h].number=0;/ A1 w0 R. `) x& p" l# w
count++;7 L1 d! a( m8 d" R; s
}) N7 m; i; Z3 I+ D7 l; z; f8 G$ z& w8 M
. r; a7 x! Z; j+ N$ A2 n  i9 ~+ X
printf("\n大王是:");1 w( Q& G$ ^# j% @$ O7 X
  for(i=1;i<=M;i++)
+ m: G7 m% v- C$ D$ g5 }; Q9 d+ d9 v  if(link[i].number)
1 O" C: s) y1 a* Z* ^    printf("%3d\n",link[i].number);9 B8 l. }7 ^( s: ~& J5 f$ U

$ N+ D$ W) f2 k* M$ C5 B) P+ j* K
}
" _# E, g( m/ @) h4 ?1 o$ }
第三种是普通方法for循环
! w, M5 W/ e+ S, T6 n1 V5 y2 a. U
#include<stdio.h>
6 Y3 `$ o. n" T! Y4 D% bvoid main()
# u/ K  r- Q& o- `, N, u; |1 u{ int i,k,m,n,num[50],q,*p;
3 m$ Z$ j& {& S! o" Y- t) }    clrscr();& p7 F4 f! v( I- i
   printf("input number of person: n=");
8 e3 y. G. D& `) ]& c6 I: ^, L    scanf("%d",&n);
' i3 C; f. G0 Y, X$ \+ O% M, |printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只3 ~1 C+ Q- r/ k, Y5 m
    scanf("%d",&q);
) i0 D9 ^* J$ ^5 E. u   p=num;6 S& g$ y% L( @) [8 Q
  for(i=0;i<n;i++)) o$ {4 W+ s* Z5 z9 `$ d/ R/ _
    *(p+i)=i+1;# K& e, N5 R$ I0 S3 p
   i=0;
6 Y+ F8 V; H# Z5 g9 q2 y, ^0 N1 |   k=0;5 a3 a% Z: m: S5 l9 D/ p
   m=0;) p0 g0 I% ^" J) h8 L, Q% E: @
  while(m<n-1)
. Y! i. g7 i# v  L" I- n  q   {if(*(p+i)!=0) k++;
( V$ \! J$ B5 @+ b" z: J' o2 \     if(k==q), b# l) j4 ~- ]; b) }0 r4 j
      { *(p+i)=0;
$ V9 q# ^0 k9 [! ?/ z& ?( M        k=0;5 o: r, w; Z: s: x  V
        m++;' O/ ]' a8 q4 N
      }
9 `+ F1 `$ V1 |& Z) ^! v    i++;
" [) [2 v, W: b    if(i==n)i=0;
1 j4 @, Y6 T2 v   }4 F- m) N9 H4 k8 J$ X; w& G9 ^
  while(*p==0)p++;9 h4 Q6 s2 ]% t3 `+ t
    printf("The last one is NO:%d\n",*p);
2 A. B) F- {2 G7 l$ R. v$ _; J     getch();7 d. @' K2 |4 t7 n6 j
" M. I% q& {* D7 z8 a
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
6 w: b7 z- U4 {% a9 G9 Y7 l* d+ \namespace 又费马达又费电4 \+ ?9 A: x0 o, E
{
" W9 l6 ]. k" ^    class Program" X. l& U  Q% m; O
    {
( c, X0 [1 _& }+ j1 D, `        static void Main(string[] args)
/ l; E7 I/ i0 Q- y7 f. @' h        {* {9 n% X9 A( z" H! n4 R
            int m, n;
6 b$ D3 Y3 q' r% u            Console.WriteLine("请输入数组长度");
; X# z; J2 i: O3 t( }2 c; `            m = int.Parse(Console.ReadLine());//m为数组的大小
! m( t- R. a. ]' u            Console.WriteLine("请输入要截取数字的大小");
! l- t$ j: {0 T            n = int.Parse(Console.ReadLine());% u4 O/ X+ h* g3 J5 \
            int [] numw=new int) D& K8 v1 H2 u

8 |' v& m! P  h$ m&shy;&shy;&shy;;
; M5 T+ s# K; X2 }5 j& t            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数1 C( b" t! L/ q! E! i
            {
& L" q6 e  W& |  a                numw[j - 1] = j;
: f6 M$ ?7 L" R            }5 l9 i+ s. H4 D
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
7 C3 M& q- D$ s            while (d != m - 1)
6 n+ m: m) K) b' [0 u            {2 E$ x) t  }3 L# m2 |
                if (i == m && d != m - 1)* \, q! G: C1 l* M/ w! D% v6 |
                {
" Z- u2 ?% m* u. H                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!8 q! F& B& x0 j
                    continue;4 p- r: ^* }( Q, A/ r9 V4 W, j
                }, N4 ]. D% m" K( t$ i. E
                else
( {/ s$ B/ L; K, X- R                {- p0 c# u2 y. w2 W
                    if (numw[i] != 0)
) Y6 b2 ~: {/ y$ \                    {
) t7 H$ K; j- K/ o4 K* ?                        i++;
* v& x: Y: L1 R8 W                        k++;5 }& [" M! ^1 }8 p4 s' ^
                        if (k == n)
% o$ j3 m$ |/ ]) M+ ~                        {" w# @. M9 Q& B+ `& B
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
$ B* D4 \5 r+ d- V3 ?% \                            k = 0;
5 f1 r; }1 ?. p$ {              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1# ~. Q- |) Q, V1 {# B$ Y: @
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);* T: N  f: W* E# h3 k% R7 k
                        }
' x+ n& o2 k: n* o% x# O                        else//输出暂时还没有改变数组元素的值
9 I* e. m0 @. N) c                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);3 T# B. L' x1 ~  `( @
                    }
6 N- ]! P) T# _, s  X& U5 H                    else
$ B3 Z8 P9 H9 h6 T$ X                        i++;//数组元素为0,直接跳过,不计数。。。2 ]1 }8 S0 y1 }
                }9 ^9 a+ W$ P; G$ f$ P( ]! r

3 h0 V* H: Q0 u: X. i
0 N8 z% J: E+ ]2 I, {            }//结束while循环, G! F3 X+ D8 o& V
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
$ Q6 D8 u, T0 F/ C. t# I             J" M9 y$ N4 w5 Y
                if (numw[i] != 0)
% B) `* L8 `! E+ g                    Console.WriteLine(numw[i]);
- Q" B5 j* U! [$ {2 N  \. V) d           
; G1 h% b4 K3 n" i            Console.ReadLine();  q- x6 N$ t2 ~8 Y
        }
. m2 n1 D4 z" n! [+ T    }
; {" ^) K* t/ d1 F1 K}
6 U3 I# L4 ~4 h. ?9 r
小甲鱼最新课程 -> 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-21 12:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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