鱼C论坛

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

猴子问题

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

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

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

x
大家好!
2 Y+ o" E5 x2 C这几天我在忙着编一个问题,我用了一种方法编出来!
, z, j5 l( I2 Z; A. G但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!3 }6 N' G0 x- ~; _  L
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
6 [0 g" o# h9 ?* d: O2 a
/ \  e4 `' v* z& Y/ ?$ n4 Z: S+ f0 m% m6 L& G
                            题目
  k5 Z/ [! t& d6 D! u  B* ^4 `9 m/ b山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。8 }% W* T: N- y5 E
第一种方法:利用循环链表
- t2 E$ v- k  F9 C/ B% Q4 b#include<stdio.h>3 y4 R  b7 v/ l, x- c
#include<malloc.h>
) Y* K# g: k6 l! o0 U. k#define M 8            //共有8只猴子
% _7 ~. W- e5 n9 e) ~#define N 3            //数到3只时退出第三只
3 S. N6 v/ a7 wtypedef struct monkey2 D! g$ P1 t6 Q* A' d) J" x( d
{int number;0 p) M& `; ~, Y: d0 K3 |
int flag;
- m! N, e1 {4 Z) Istruct monkey* next;& f4 J6 u! _; e5 y2 l
}MONKEY;! h/ _$ S6 {( a7 B3 c: H
main()* Y- V1 v$ a8 k1 [* ?6 n1 N
{ MONKEY *head=NULL,*p,*s;
) c. ]1 D- t: D3 z- D5 r  int i,sum=0,count=0;
) q0 x9 V9 m+ |' ~5 N. [4 Z  clrscr();              //清屏& K! r, _* d# u& _4 w& L
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存) ^( W8 a1 Z" j5 m, X$ b
  p->number=1;p->flag=1;0 n- {# z$ f; G+ a7 K" r
  p->next=head;" S8 ^5 [4 E$ N/ L) p
  head=p;' h! S& f7 @) g2 Q
  for(i=2;i<=M;i++)# z2 o# t; B+ p6 M$ X
    { s=(MONKEY *)malloc(sizeof(MONKEY));& x% q' t* I. l4 b# @8 a
     s->number=i;s->flag=1;4 A- Z- B- ]7 T+ d5 a5 d
     s->next=head;/ K# @5 i" I5 V- W
     p->next=s;p=p->next;
8 g! c% `! X# e3 ]! o    }. Y1 y, j( \4 j& ?% G! C/ L
    p=head;, M- Q2 l# p8 R& K2 d3 ~5 b
   for(;;)0 [' v& W+ g+ a
    {if(p->flag==1)
2 w, I% W* O  C, J& Z, V+ q       count++;
; V$ i: m1 @* j3 f7 F6 w4 y     if(count==N). {; S# B% u" @3 \3 y
        {p->flag=0;
* f; F: v: M$ [- F. ?7 p# @         count=0;
. K% h( g, G. I* E4 ?, w; L" W         sum++;}
7 r/ |+ h# F/ P9 Q4 a# S8 e4 `     if(sum==M-1); m5 ^* U9 u4 |9 i# O
        break;
. d6 @! ^5 U/ J8 U4 g8 n. n+ {" G5 k     p=p->next;( |8 _3 ?. r# w  m0 j$ y& c
    }/ ]( I6 w  Q8 X! H- ~
    p=
" L6 c+ S5 \( K% b$ X% @/ ?    head;1 x2 T: X5 f1 l" p- D3 y; \
    for(i=1;i<=M;i++)) r; p$ A; H6 q* S! i" q) Y% i5 x
    { if(p->flag==1)+ J" Q/ ~! J) S# L: t7 s4 I9 A
        printf("\t%d",p->number);
. `' d/ Q" P5 b; Y      p=p->next;
* K( k( x- s+ n7 d9 X    }5 o* L" D. f/ ^" d/ K0 J& D
& o* L* u* g3 B* D# i4 o

, V0 l2 B! }6 F& b7 }9 d8 H+ b- x
; X+ }# Q, N. r6 Q; |2 M: R, ~}

, U3 d' s) G0 s3 _/ [第二种方法:数组# |' U: h) ]. C  P+ x/ g
#include<stdio.h>! ]5 h" \: y- j& p8 H' t8 W; Y: f! q' F
#define M 8* D) C! Z# C. x9 S+ x5 L% u3 R$ g
struct monkey1 s  r' e" `" V4 ^' h: C
{int number;
9 s$ K3 B% w3 R( t  Y( f7 C1 L' w/ Mint nextp;2 R) g" d& v# K5 W6 L; V, c
}link[M+1];8 T4 o  w" k& G
1 y  ^4 E1 K9 B6 t' l% N6 E" _1 X
void main()
  G4 o* s9 b7 o! ]) Y* w4 u% o{int i,count,h;9 Q3 @+ X4 Z) ~- C( G; c2 f, F) m
for(i=1;i<=M;i++)+ ^) |. g0 j' H1 n) i+ a
{  if(i==M)
, _6 v' c' z9 I  m7 M+ k. S   link[i].nextp=1;; J  ~+ d0 R" p. N
   else
3 K% z, l% f0 v! X4 J! \) M( R   link[i].nextp=i+1;
+ `4 b- A6 ~4 O6 w# q  link[i].number=i;
3 Z# B$ f  Y. z}
0 L% b/ Q* Q0 O% i5 r% kprintf("\n");
0 V: N, Y+ Y7 u" m5 G- j! `$ ~count=0;1 C+ {6 q: \! a2 [
h=M;$ B% [  l# K" J# ~! m1 P
printf("依次退出的猴子: \n");8 U. Z) o% x! `- l6 w& T9 Q. x3 ^
while(count<M-1)0 \' p) F0 j' n
{i=0;- b* r" M* U, J1 X* U
while(i!=3)6 P/ h- U2 q; ?9 @. }, R
{ h=link[h].nextp;1 O% O7 F1 H+ d# N
   if(link[h].number)
) a& R8 [& a0 `( r7 S; p1 y3 U     i++;}
9 c8 T% u7 v/ C, l' g! g& E, m
5 \1 o/ L5 Q7 eprintf("%4d",link[h].number);
$ H; ~& M! h3 plink[h].number=0;
( G& R' o' J, F8 mcount++;
# S: p1 f* s# s' i8 P) B5 k}6 n# |8 q1 q$ `  f: }% c1 y# }

; r* v' x" G+ Kprintf("\n大王是:");/ X+ l% y, N9 k( t1 ^
  for(i=1;i<=M;i++)/ q! I2 b. Y" L' _
  if(link[i].number)
/ L: o% i4 v+ `6 X+ l. H$ }    printf("%3d\n",link[i].number);' k5 q9 L# `( H  j# X  Q

- y* J3 ^' E  e; X/ I8 @0 J
1 w  |8 a: B; Y2 p: a: Y* P. V' Y}
! R; a/ z- ^6 U+ e% x( X; R" S6 m
第三种是普通方法for循环

" h! v: r- p$ i4 \& ]% N0 Q#include<stdio.h>
9 \+ W- q8 `1 w( yvoid main()
% K: t# ?! F+ D$ l0 d" p" `{ int i,k,m,n,num[50],q,*p;
  y" i4 i: k8 Q  {    clrscr();
& I% Y. y9 y: _5 K; O   printf("input number of person: n=");
  \9 h" B( t. E2 F/ p9 P* f% x    scanf("%d",&n);
) P1 ^( ]7 s" R* O% Q% t0 rprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
' I6 O$ C' f3 ~* D: d$ T6 K    scanf("%d",&q);3 v; d2 ]' N5 H7 _1 U* Y
   p=num;
% B1 O" `% {+ n: ^" v) @  for(i=0;i<n;i++)
: w% v; S; t) `( s- G    *(p+i)=i+1;: l" w& m8 j# L7 Q
   i=0;
4 g5 G4 i! y$ P5 t1 j' A9 Z   k=0;' x; [, n6 Y2 m# g* d9 \8 Q
   m=0;
" n0 B+ q- Y( K# [+ ^+ p$ Y  while(m<n-1)
* W/ ?7 @8 O; G, V" \" ?) G" A9 m   {if(*(p+i)!=0) k++;
) f" E0 ?% u& Y$ A; e     if(k==q)
6 p3 I# P$ `1 w      { *(p+i)=0;+ H* t2 N8 _( Y. a' d/ P. L
        k=0;
9 G  N+ m# n8 x3 }- D$ [        m++;
9 a# M4 R. O- a8 a' P5 r      }+ l3 X0 f1 t* j) K3 e0 j/ J' Q' l
    i++;
; g0 L) a" P3 D! d7 ]/ n" T    if(i==n)i=0;2 t1 e) U3 t" J% c/ Q9 M, J% w
   }
: _) j2 D! Y# {1 m- Z  while(*p==0)p++;
* I* A; L2 z* f& y( i3 b* z. _7 P    printf("The last one is NO:%d\n",*p);3 |( S# O* G% F* E$ K
     getch();3 k  [# c  @% U8 k/ r
, n' @1 ]2 p. m# [; Y. p( \' V
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
$ ^0 N3 c! N; N9 i' l( r* Onamespace 又费马达又费电
1 h/ R6 C, O3 ~; }7 F{
% e8 q* p- P1 N    class Program
% }8 x' n) B$ q: w  B7 z- a    {
: z3 `! b8 N, n! m0 T1 M: ^" w        static void Main(string[] args)
* J. Z& O  {; J# f6 O/ f- \% p        {  \* U# W$ z5 q5 B5 L) U) n4 T. L4 v
            int m, n;% r( G2 B" {+ b- j5 c
            Console.WriteLine("请输入数组长度");
: g, d. D- X/ w* x            m = int.Parse(Console.ReadLine());//m为数组的大小
( y# V4 S( |% C0 M6 m* f            Console.WriteLine("请输入要截取数字的大小");9 B5 `$ l/ D( |
            n = int.Parse(Console.ReadLine());
: M( g* D$ Q2 j5 f+ D* \  k" {            int [] numw=new int
. w" b4 o) m, R- M" d
) f( A/ e) M  m7 }&shy;&shy;&shy;;
, R& h! T+ z- x6 x- X0 B7 C! W) {            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
/ }8 {) g. C/ [# U& E            {# p: @: E0 e7 _
                numw[j - 1] = j;% F; |. ]. C0 x* N8 Y+ {: u  |
            }
" p2 A/ Q) J* m* Y' E0 G: V            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
+ f; Q' T) p& _* G( X, `0 t- L$ D            while (d != m - 1)
& l( B- e9 K' a  Q/ `: F  T6 P0 _            {
% M% e# X! t* W2 o) k+ \0 W                if (i == m && d != m - 1)
& K! }& X7 T& }1 Z  X                {  }) j  Z* E/ Q; F- b
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!$ Z- Q" Z, N/ G: v2 B
                    continue;
; I+ E: [0 p. O                }. Y9 t2 A. g5 [3 J  P( Z4 h, x
                else
" o. [" a) H1 w; A( s5 x                {
6 }3 ~3 s# r6 n( i# u$ G7 I                    if (numw[i] != 0)# R1 r( x& N/ p
                    {% ?; t. z4 N% ]9 K& O0 S( _
                        i++;
7 V, B% L. d. f8 [( K                        k++;* |+ `  T7 y! l- U$ @& H
                        if (k == n)
* R0 Z# J9 f# {  i0 B. N                        {
. `% b+ q5 N/ B  x+ f5 t7 \                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
8 I$ O9 J4 e0 w, e                            k = 0;! E) ]- l: ]1 k, y' N* _
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
: W% O" ~, a6 j4 Q# e: n                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
  |4 W" ~1 d* |  \4 E. }- l                        }2 T4 j9 `: f$ |  P
                        else//输出暂时还没有改变数组元素的值* f) l0 q' y) V  `4 g7 a/ w: D4 N
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);5 V8 L! i! ^  S, v+ ]
                    }/ M8 n; U& d+ ^3 X9 ?
                    else
1 b: I$ @  X: p5 o                        i++;//数组元素为0,直接跳过,不计数。。。% _' ^# _4 ~& G' z" c$ c+ {+ D
                }. x2 U9 ~! H5 H. ^) `

9 e! P2 h% ?7 M
) }/ x4 P1 @2 b7 X7 ?            }//结束while循环
: @1 ~  X/ Z7 k4 l            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
2 M  Q1 `/ r) e. T8 r           , y; f, k* P- q" t& A2 {
                if (numw[i] != 0)7 F2 N2 b3 V2 p, q9 X6 P9 j
                    Console.WriteLine(numw[i]);# q! Z& C( M/ Y; h
           
- S; T$ L& N1 m' S+ W( Y            Console.ReadLine();' M. |. J3 N( F
        }0 ]/ H9 a0 i: E
    }! F, B" e, x. a8 d5 O' p
}! V  O6 E! @. M: W1 ?. U
小甲鱼最新课程 -> 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-8-9 01:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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