鱼C论坛

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

猴子问题

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

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

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

x
大家好!
$ V. R8 V* [$ ~1 q4 X* g6 p! Q这几天我在忙着编一个问题,我用了一种方法编出来!9 }( G4 X6 R: E' {! S
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!5 ?  T' r/ x* U8 ]. z7 D0 V* P. L
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ' n6 ~1 x) B/ F; L7 A1 p. f
* k5 |/ {% T9 e" r/ Y* j: k
& ]5 X" L+ I; n3 G; ?
                            题目
1 r  [% ?6 r0 E3 }/ V山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。- A2 @: P, D1 ^2 c2 v
第一种方法:利用循环链表( L0 n. B& n8 B( X: ?: \
#include<stdio.h>" x0 x& h$ q1 o. J" T" j% K
#include<malloc.h>( l3 d! z+ ~8 Q% V* Z' t0 z
#define M 8            //共有8只猴子3 v5 H, Q0 a' k6 O
#define N 3            //数到3只时退出第三只1 Q* w5 o$ p) k3 L4 H7 j' F
typedef struct monkey
: ?% q8 \/ O4 g4 h1 c{int number;* F. h. g! B1 n
int flag;1 t4 g: E+ M6 ~1 ]2 b
struct monkey* next;
. ~3 M* R7 ^" B2 l}MONKEY;! f# g- C; g( E4 u, k
main()
5 C- O: ^$ j; e5 Q+ ^/ F2 }+ f& r{ MONKEY *head=NULL,*p,*s;$ J' W- _3 {( J% R; F; ~2 P& E
  int i,sum=0,count=0;( n. h! e% b  U0 J* A4 b" s
  clrscr();              //清屏2 c" S  J3 N1 ]$ l) n# n2 @1 C
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
+ K! e! V5 E1 f/ z4 l! m  p->number=1;p->flag=1;/ N( E: }" M1 F2 ]7 b/ N
  p->next=head;
/ l8 `% V7 y( u2 i( f  head=p;# ^+ q, R" G+ z4 j- M3 S
  for(i=2;i<=M;i++)2 v+ f1 @$ Q7 z5 g
    { s=(MONKEY *)malloc(sizeof(MONKEY));& x+ @' }. v7 o# [
     s->number=i;s->flag=1;
2 f2 e' k1 B6 U) g2 T     s->next=head;
: y! a/ s$ U% U. y% r     p->next=s;p=p->next;
8 T& O; ?% u, ]9 Y: S0 F0 x    }$ A* q2 u8 X5 X
    p=head;4 A$ E9 e$ F/ m/ E5 {
   for(;;)
6 J+ ^' o  e2 C# N1 ^* H( p    {if(p->flag==1)+ ?% R4 h! U! E2 T! M
       count++;
1 R' M. G& `. f4 F4 \7 L6 u     if(count==N)
. H: q: ]  e* e; `        {p->flag=0;0 b$ V  G: V+ ~/ L9 d5 @# _# W
         count=0;' G3 n  M# @) l+ O& z( N" Z: g
         sum++;}- j6 m- N# c/ ]/ O% T, u5 y+ X
     if(sum==M-1), w6 q- [2 v* Y$ A. `: A/ f
        break;
  D% k' Z/ L( i; T" j9 g3 ?+ E     p=p->next;5 v/ F7 d/ \/ q
    }
9 A7 q) q, `" q& i( D1 _' m    p=
4 h* |2 Y8 Z$ a! W& k% [    head;
% k+ d/ s3 y& v  _% l  S& W    for(i=1;i<=M;i++)
8 P4 r) F6 d! f    { if(p->flag==1)
0 G- p2 G9 M* y6 d8 Q% o& _        printf("\t%d",p->number);
% Y/ g/ Q2 J0 m) o8 p. V, z      p=p->next;% t+ E; H& I$ \0 M6 N  i- w
    }
& v# L  A3 o! P' g0 Z8 T8 d" h$ A8 ?: _: ?$ ]) q* a4 T# c

/ ^5 T1 ]3 |; @
8 r! I* A( N0 u5 Q8 z# s}

  j6 ^! X* j$ @/ S; g$ h6 ?, P第二种方法:数组* u6 e$ }3 ]5 }# d; O, \, Q
#include<stdio.h>% M. B+ h7 r" i! Q# U
#define M 8$ s2 f, A2 x7 j" Q3 \) g  i/ B
struct monkey
  A: i& [: H$ Q0 Z1 y{int number;
7 P' b: L2 H$ j5 E1 Pint nextp;# Y0 C. K3 \4 d7 k' g$ j4 t
}link[M+1];1 q! ~8 P! k1 ~* Q4 U" I0 f+ ]

: j6 K8 n5 O7 [7 O: ]! }void main()+ W+ p( N. v0 ?$ u# F7 s& i
{int i,count,h;: y0 I' |# i7 [& M7 Y
for(i=1;i<=M;i++)+ e% Q) K, z1 H( t
{  if(i==M)
. A. y7 m' G+ J" Q  l# p' r, P; \   link[i].nextp=1;$ L+ q2 D) u) z3 L% ~4 o7 j: E
   else
/ z' V5 j* y# R2 X+ k* u& }   link[i].nextp=i+1;
# e. g: b3 C' p  link[i].number=i;) ^4 Q; O, m/ L' {; |4 O
}
. \% H5 `: p8 U1 e) s, B9 iprintf("\n");
' Z4 |. M* I8 Q7 r# dcount=0;3 n! R+ ?, {# @4 ~1 W
h=M;
8 H2 m/ l- y* m( M' Oprintf("依次退出的猴子: \n");
% N0 T" z! N7 j9 Nwhile(count<M-1)
( ?6 y) g0 V, G+ p. z! I' ?3 x{i=0;
7 c, ]$ a7 M! ?! zwhile(i!=3)3 S- l' O3 A2 |6 M0 U
{ h=link[h].nextp;* D: O+ L( A+ L- `, f7 f
   if(link[h].number)& P9 h; z+ k0 N" I5 ^* K4 y
     i++;}0 l) b2 x! j* K2 G( C
; |" }4 y2 |; i( b4 R! K, U- V
printf("%4d",link[h].number);
/ q! y* u& f2 w; olink[h].number=0;
9 E) J, c" n3 wcount++;
8 ]2 H$ m, z3 B) ^5 _. t}& |# E) ]1 g- t2 U/ \5 \

: @8 f6 a0 G0 m$ j" K4 l* P( @printf("\n大王是:");( t: i- G8 x/ f
  for(i=1;i<=M;i++)' `/ U+ p2 ~0 o) N2 D8 c+ }5 P
  if(link[i].number)
3 t$ k( J" {3 T, I    printf("%3d\n",link[i].number);1 T0 w0 f  o2 k  x

' q7 t9 P5 `+ a7 x7 B0 a% v1 E" r* w4 l. [" b) h1 Z7 g
}

4 D; }2 h0 T3 B% E1 }9 d3 ^- s第三种是普通方法for循环

& B& c* V1 T1 ^0 N$ z- y#include<stdio.h>
1 e+ q6 l7 ]7 H) Q' G4 |) a' X  Z2 ^2 @3 evoid main()
7 C' R' _$ w* `) u{ int i,k,m,n,num[50],q,*p;
; {3 i/ b( v& Z# o$ k: q    clrscr();
4 }3 H8 O: R% S' d   printf("input number of person: n=");# c: W( l# s; M/ X( S+ W7 H* r
    scanf("%d",&n);6 ~6 R) l: n. Y  Y
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
* [3 \* m* M% y: |    scanf("%d",&q);. F% v) m1 F6 i& X3 n
   p=num;
$ y  h5 d! _8 P. ~# p4 c1 s  for(i=0;i<n;i++)& b0 q/ d2 {6 T: e5 ^" h
    *(p+i)=i+1;
" n& ], }# g& t0 e/ ]7 k* V4 Z   i=0;5 D. o6 [7 W( `4 k- g$ V
   k=0;
9 w2 c( f+ e, c4 ~- m   m=0;
- n; T7 ]* l$ i; m  while(m<n-1)5 j- R* Q6 W4 g. `: N% f; @
   {if(*(p+i)!=0) k++;
' x/ t: p$ |6 [  h# {7 T     if(k==q)
* U+ P& [. l  n+ p      { *(p+i)=0;4 F# z$ b1 {0 n: h0 u, R
        k=0;4 {4 R7 m: y1 Y) ?5 \- s: @
        m++;
- C# X- K0 A3 F2 a0 F  {. C5 V      }" N! M6 h6 `2 }" P
    i++;
$ m( z' o$ \+ Y7 D) j    if(i==n)i=0;
% W- _4 A7 i' x9 R# N! e   }5 z% U( y9 D- q6 V6 y) F
  while(*p==0)p++;, }- Q* M& n; ^+ Q2 v# `' H
    printf("The last one is NO:%d\n",*p);
" C- x9 w* V- n! j$ D     getch();4 D7 H6 ~% `  @2 `, C! r

0 m) x; }3 Z" |8 y5 J; x' A}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;, O! {1 w/ B# W6 f! m! y
namespace 又费马达又费电
( h9 i1 j$ [/ S. c% G) g- G3 c{
' ^/ |! g3 `- F8 W5 Y, D7 M    class Program
* s0 @8 |6 o! m    {
0 M  \/ Y. @0 A- {' s: N( `5 ^        static void Main(string[] args)
7 S: A0 q( l: Z; V) e        {1 a( ?+ f6 Z% Q3 O0 s1 f8 v" p0 t
            int m, n;! d$ [+ o2 j5 E- s' r5 g
            Console.WriteLine("请输入数组长度");
  ?2 \/ t9 Z3 F) i! {8 t            m = int.Parse(Console.ReadLine());//m为数组的大小1 A1 ~% Y! f: H  u/ ]) w0 {
            Console.WriteLine("请输入要截取数字的大小");$ j, j, v, I9 b4 ~
            n = int.Parse(Console.ReadLine());7 e! ^) V- p. p! J; @, L& {+ ^
            int [] numw=new int: E% t- s! h* L# T& Z5 ?+ @& H
) {6 }0 L9 j- A
&shy;&shy;&shy;;  o& x. b2 @( |) m  r
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
  a+ q4 o5 E3 w5 ]            {
' I/ D2 j8 ^: n# y  [" g4 A2 \                numw[j - 1] = j;, V' \" G9 h: g8 A: ^" H
            }- n+ @) W7 j$ S% h* n  O
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
4 K& c$ F  e% H6 F5 g            while (d != m - 1)& a$ R) \' {2 A: a( z! G- g
            {
/ b* k& N* F. p                if (i == m && d != m - 1)
" X% }- k! Q8 ]( \                {) N; V5 k9 ~$ o0 K7 m: m
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
1 c5 r5 n* n0 c  k( {                    continue;% {- G4 P0 j8 x( Z; i
                }
" G4 x3 p2 D7 Y2 E+ H" ]! B! b( J9 }                else* N8 Q! P, p8 b& N
                {
. B* {. y( N! A! {7 L0 `                    if (numw[i] != 0)
/ l+ a* ?6 z9 U+ ]7 Z9 O: i+ H                    {
( D! Q2 m$ }9 q. @                        i++;4 w% |9 `1 v# E
                        k++;
" J6 X: C' Q8 k5 s& t+ y9 z9 i# c* f                        if (k == n)
8 }, n4 A& X7 J/ W                        {
3 q7 _' G+ d! r' h                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
9 |  ~: g. ?6 i% U& n: L                            k = 0;+ F* i5 C9 u; f% n5 q! t
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1% \6 E: G: j) R$ o& Z( J& Q. t# m
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
! Z6 z# Z' X" h                        }8 f& n5 o8 X7 J3 E3 X: p2 P& a
                        else//输出暂时还没有改变数组元素的值2 r4 \- }2 {6 f& {9 [$ g: f- k5 f
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
% M% g+ @4 e, E' N' R                    }2 B- s3 L( p' q' T) U
                    else4 K3 \) ?( c0 L$ ]9 D& o6 B
                        i++;//数组元素为0,直接跳过,不计数。。。; I4 W3 f$ X: X; b
                }2 r0 L* W1 w5 t; i# I8 ^/ G

/ d" x% H+ u  F& k) b+ \9 [5 A% ^
2 o6 d; d' ?* e* m( f            }//结束while循环
% n% I$ [+ m9 y$ `5 h( g% g2 Q" N, {            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦8 y. `- q( ^5 C/ }5 i( E6 H
           9 S$ S3 I" V  A( b2 H- t0 r6 ^) G
                if (numw[i] != 0)
; I0 _# |8 \% Q' H0 s( S                    Console.WriteLine(numw[i]);
0 T6 j, e. x! ?7 A. h           
6 V- ?9 {7 H0 o: G            Console.ReadLine();- H, O) e0 x/ V5 H
        }5 n! A2 [! D. v% A% g6 w  K
    }
& u+ R: t$ ]6 v' n# |2 T+ H}. I* }6 ^( e2 N# t
小甲鱼最新课程 -> 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-27 12:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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