鱼C论坛

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

猴子问题

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

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

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

x
大家好!
' ?9 ^3 G0 r$ j/ c- M) ~0 D3 e这几天我在忙着编一个问题,我用了一种方法编出来!9 w' p5 R- O  @  ?3 q
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!0 c% c# e6 p. x' P" l1 F
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 4 c1 Y. p  F. |6 k5 G
9 d/ X" ^6 K# \

7 q" T6 H% S  l( u
                            题目
9 I- C. G- y9 g, L山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
& T( I0 @9 W  t+ Q第一种方法:利用循环链表) u7 L7 r8 T  o, S" `- h5 q
#include<stdio.h>0 f* ]8 }. ~8 }5 Y# h
#include<malloc.h>
' `/ H- c2 G( @0 n- k#define M 8            //共有8只猴子. D$ Q; P# c) I8 K9 q. m
#define N 3            //数到3只时退出第三只
, }! ^6 q" T+ ]; p4 ?1 d; G; qtypedef struct monkey
  f, s! V- I: o3 N3 V1 a3 j{int number;
! i' Q! u6 T3 q: iint flag;: c, g, C. {# @* w! d2 T
struct monkey* next;2 s' @' Q' z( _* L6 S5 s
}MONKEY;' r. V$ e% `, k! b
main()  ^" K: e3 ^3 E
{ MONKEY *head=NULL,*p,*s;* m. p1 w9 ^+ H. e
  int i,sum=0,count=0;1 F+ Z( F7 g& B( v3 ?
  clrscr();              //清屏
) {" L1 I6 a" C$ \  o# R& N; ?- Y  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
% J( \; @9 u  e, k/ D0 F) m4 x- R  p->number=1;p->flag=1;: W! o* r8 T2 L- C. M& z
  p->next=head;, L# Y- ]# q4 j* G
  head=p;1 R- G0 }. K5 {5 r; R& {1 b* o+ W
  for(i=2;i<=M;i++)
0 S; ~$ _2 x8 N/ Q) _9 p! X    { s=(MONKEY *)malloc(sizeof(MONKEY));" l( Y' A" p6 K  I0 S5 t
     s->number=i;s->flag=1;
* A2 q  s3 M: m( i     s->next=head;
# f7 V' r2 @% H! l9 a+ y0 V# i! a8 p6 h     p->next=s;p=p->next;0 ^  q) X8 e( X0 z0 p( v
    }
% h6 ~, c' m. F. ?    p=head;
/ _0 G# W" q0 T3 M5 D   for(;;)! B0 n: e* A* G& B+ @# B/ Y5 c
    {if(p->flag==1)
8 k9 E" D3 Q3 Z6 I2 c. V       count++;
8 X- h. l# c5 P0 Q5 V     if(count==N)
7 Z0 N1 J! L; Q& ]7 @7 d        {p->flag=0;& z- [3 q2 T7 M
         count=0;
, ]  j! }9 X# Q, S0 Y& V         sum++;}: H9 V: v- X2 u9 K$ Q4 U
     if(sum==M-1)
( t1 x, d8 p' ~) `        break;
( v5 O; m% X* q+ O; R6 ^7 j4 L     p=p->next;% K5 U$ }+ ?& `5 S1 V# t. n
    }/ h, j, |5 ~% a! L) v1 ~) W
    p=
" `0 |7 n* }' p7 D6 m5 w    head;
0 f, a' P+ G( M2 ]' G& ]" _$ T    for(i=1;i<=M;i++); Y6 G# o+ M4 O& z
    { if(p->flag==1)' i; r! j- R, C% @* B0 b3 _3 A. j
        printf("\t%d",p->number);9 J8 f+ V/ t5 z/ r5 d
      p=p->next;$ k" W% B* o& B6 Z
    }! ?5 Q2 D+ a: M5 p

8 u1 z: u0 v# E& v1 M
  W3 I% ]  k8 G/ q7 T4 w' y; ]4 y& T% e# d7 J, E& W  V* a' b
}

6 L2 p5 u; B4 w6 G第二种方法:数组$ l& h& _* Q5 M  ]
#include<stdio.h>$ L0 }$ n$ m1 I+ i) h- R. b! U
#define M 8
8 a2 ^6 W( }. D$ C' x" Zstruct monkey
" {6 A2 B' T& X4 z* ?{int number;
* l) b% B, v! Z6 m3 I1 uint nextp;
/ ]8 r4 _2 S3 ]' [1 ]/ [. b}link[M+1];4 H5 p3 U; \0 N/ z5 T( E; t6 Q
% F# O4 s4 H6 Y- p, i  O
void main()! I. R2 k3 @$ p4 o
{int i,count,h;
  W$ ~4 H- z1 g' xfor(i=1;i<=M;i++)
% w1 N& c+ N" ]8 r) U5 [$ L3 v{  if(i==M)3 n  {' ~3 }# F: _' ]6 E! x+ ]
   link[i].nextp=1;  x5 @% |( [, ~# P5 n
   else
8 q& X5 C% f% K0 x   link[i].nextp=i+1;
* M% g0 i& ^) ~  link[i].number=i;# A5 \5 a7 t* x- ~) \, x/ v( ^
}% ~. f; |1 d% \; o2 ?
printf("\n");% ^# h  l6 R1 }# e3 `
count=0;
  f6 m: A' g+ Qh=M;; q" z* ~% b, `! \
printf("依次退出的猴子: \n");
. P+ W6 _" Q- z: o' owhile(count<M-1)6 z  S5 L. Q, @3 ]2 B8 ?# _
{i=0;3 {: j4 {& N! \- q
while(i!=3). Z+ M- l. U$ J; P0 s$ Q$ Y
{ h=link[h].nextp;
( o  v& A7 K5 U9 N* w+ a7 @   if(link[h].number)
9 d# D: m7 p' @: {$ j2 `     i++;}
! o+ J1 ^9 A6 D8 m- e/ u, |/ E# l, g: N& }4 y, q* F
printf("%4d",link[h].number);
0 j: q+ D5 a, m. L" M& J* d6 o8 B/ _link[h].number=0;: J5 `% F+ h" u
count++;" }# Y: `6 G6 i4 e6 U, C% e2 e. W
}3 J0 S- Q( [, `7 w2 k# ^

5 F! \8 ?) }  Q9 D! s$ lprintf("\n大王是:");
+ ^# W9 K  s9 {; w  X  A0 z" w  for(i=1;i<=M;i++)$ R2 f5 ~: n' J+ D
  if(link[i].number)
' F7 c, @6 V0 p! M    printf("%3d\n",link[i].number);
7 B4 ^: C7 I' J6 X; ?+ x: ], G% i7 r" h6 d% f1 Z

, v, T& D1 x2 @6 O3 `: D2 b}

( B4 f" p7 M, X) M9 M: D6 L! I第三种是普通方法for循环
' i+ L( l! n/ P0 {; G
#include<stdio.h>6 @/ d0 C9 r. \* k1 ~8 v1 X0 F
void main()$ l# M+ o) s7 s" b* m9 L7 o8 D9 {" A
{ int i,k,m,n,num[50],q,*p;5 d' {5 N4 O. q% F8 ~- k
    clrscr();% T* A) M, J# Y% ~7 i5 u7 v7 }* K
   printf("input number of person: n=");) D5 i  @# ]' a* G1 w
    scanf("%d",&n);6 m, {& g# N' L& Z. f0 s& B
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只% l% h% n. @; ^0 P1 f! o0 K$ P, j
    scanf("%d",&q);7 n  N" m8 N2 }/ n
   p=num;
  s7 N3 X& L& o- U+ i- |% d  for(i=0;i<n;i++)
% `& C0 t" C5 V- ]" e6 r    *(p+i)=i+1;
: k) i, ~4 t: K+ p# [  W. O   i=0;4 K% N5 F8 K- r7 R0 K+ J- _! Z( S
   k=0;& h- B$ ~1 A, B/ A0 \2 m
   m=0;
$ E# N+ S1 j) l6 n& K  while(m<n-1). Z2 f9 o9 R7 |& R' t, ^. w6 l9 n
   {if(*(p+i)!=0) k++;) \: V, V3 u  Y! l; i1 l$ \0 S
     if(k==q)
/ s# Y  q. q  g      { *(p+i)=0;2 L; y; |% H" @! N0 O0 d' M
        k=0;
+ G) `: a$ f# F7 {$ c; @' c. y        m++;
. K) h; n8 T3 [$ B  Y      }
4 y2 l; o/ s/ [) ~; `    i++;7 M: B$ U4 ~2 j. K3 w" K
    if(i==n)i=0;& R8 x3 K' c) c8 v6 Q8 y
   }" J& m0 E, z: k0 y8 T( l
  while(*p==0)p++;
; Q9 [4 `% f) D  }' y: `& q    printf("The last one is NO:%d\n",*p);
3 W6 G9 U% z% G, g( D, h5 L! S     getch();( g% \9 G: o! L0 T$ P

/ O: Y6 f# n* T, H% ^% n4 K}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;$ A" w! r$ G1 S0 c- t
namespace 又费马达又费电
8 P' b# g  z/ H3 W# ]{
0 s, L" [( j# ~. X# n    class Program
6 b1 M/ v+ Y4 [* ]+ V( P9 T    {4 h1 v- `4 i/ a. I
        static void Main(string[] args)# u. K! q1 v% G5 x
        {
4 D& A1 F: K5 q+ S5 f5 E, O" B% x            int m, n;
3 E9 l) j2 W* Z9 {7 J' h( \" u            Console.WriteLine("请输入数组长度");
- h7 ~$ ]  d6 `2 I# y            m = int.Parse(Console.ReadLine());//m为数组的大小
0 c% A2 T6 w  T# `" ?            Console.WriteLine("请输入要截取数字的大小");7 g, A7 i4 l) C2 F6 P8 A
            n = int.Parse(Console.ReadLine());, m3 g/ p3 W0 e
            int [] numw=new int
+ C2 q. R4 `% c! W2 l' S3 G7 d( ^" ]+ l/ X6 l2 N! c
&shy;&shy;&shy;;6 w; o! J  m8 d
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
4 n9 R3 U- _! f; G/ U! k$ G# a            {
5 Q% S9 L  b' Y9 ~- Z                numw[j - 1] = j;7 ~# e; v, w: \. m
            }& f' a6 ~* u3 l* E, S, P
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
3 \6 @. ~) ^0 o5 c            while (d != m - 1)5 p; C. V) e3 Q' l! H
            {
8 L! P7 R( G- h1 t! l0 I$ W& A. I                if (i == m && d != m - 1)
# H7 W! v" s- G5 C8 L1 a2 H" }                {
4 V% C( q6 S: c2 m, ~/ q                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!' k$ h. N2 Q6 n6 |4 N* ?
                    continue;2 m6 T2 c4 J0 p% l( r7 T* q
                }
4 n+ J, p) ^+ c% g# q                else- d( p& \8 p) ~
                {
4 V5 F2 G& P/ P3 O8 ^9 c                    if (numw[i] != 0), c* f/ O; r% g) b& I
                    {( U  Z/ B* ^& E2 w& i2 R
                        i++;
) s" E# o* n% k& |7 I/ h/ u                        k++;4 L- k# g$ p: H% a
                        if (k == n); e, `1 G5 X/ U
                        {
8 B* s$ B' v5 t1 R1 Y                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
4 W2 d* t/ ]* K! z, a4 V1 ?                            k = 0;
* B& Q, Q9 w  ~5 Q4 ]- M              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1! {8 \* z. H5 _2 q
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; C5 ^" Q3 Z" e& k% l! t" G                        }1 d5 Y6 R+ u9 R" U
                        else//输出暂时还没有改变数组元素的值
! e. Q- s, Q2 E+ |1 _' m                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);7 P0 y% m8 d+ v; P; [
                    }
4 a* \- U+ q( C* h  @* j                    else
, `/ G1 `  {4 x7 {( `2 y                        i++;//数组元素为0,直接跳过,不计数。。。  K; j2 `5 n) p
                }
, D9 O; x  |; ~! }, p7 j' } 0 Y6 u8 G% c- N$ X1 J5 R

5 S+ _& u5 j0 G8 a            }//结束while循环
8 g( u% D7 e2 L0 d6 B& J' X            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦# c: @: E( D; a4 g
           4 O8 Q: }" Z1 H* C* B
                if (numw[i] != 0)
# J* ~7 o8 O% c0 J2 s                    Console.WriteLine(numw[i]);  D% x! E+ C4 f4 ]* M. }9 ~
           7 W! @% t  Y& E
            Console.ReadLine();
0 F% @6 q9 x2 g# s7 L        }
' S) }' j5 \3 i: \    }
' x* C4 k5 o7 V3 j6 \' g& I$ a) H}( y1 j; L. g) [
小甲鱼最新课程 -> 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-3-30 16:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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