鱼C论坛

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

猴子问题

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

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

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

x
大家好!
2 _" Q, I7 g6 ^  `! N这几天我在忙着编一个问题,我用了一种方法编出来!2 f6 [2 D, d! M2 v7 x- Y* Z. Q! @
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
8 p- u+ w2 y: J! L注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 - `% z3 e9 e! O4 t6 w
) j" i$ e. C3 k

3 w4 p. Z. Y5 }6 u
                            题目( r* |1 k7 v+ k" G# C6 O/ g" g
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。4 r( i: j1 D0 M6 W
第一种方法:利用循环链表
. a* `- h' Z% f7 q2 I#include<stdio.h>
5 J1 F2 N/ ~2 d" J. j: E: t#include<malloc.h>7 i3 g( R: P1 R
#define M 8            //共有8只猴子7 p( m& d3 y0 s- a( s) y3 J
#define N 3            //数到3只时退出第三只/ Q; N& k  ]% r& P6 ~
typedef struct monkey
, L: j, w6 \. \{int number;8 J8 |1 `- D! B) q- K, h
int flag;
% T+ \% j; h1 a% {" qstruct monkey* next;0 o1 r/ |) N9 }' w7 p/ p
}MONKEY;9 ?/ H8 ^- w& k9 g
main()
  k! a# e1 E% J6 O" r0 t{ MONKEY *head=NULL,*p,*s;
' t5 {; Q1 l* T( J4 S" X  int i,sum=0,count=0;
  ]* U5 C0 E) D  clrscr();              //清屏* f) x+ M3 n: |
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
7 E1 |9 J+ S* M3 [0 B0 T, k  p->number=1;p->flag=1;
6 O/ u) t8 J4 Q  p->next=head;
( K4 @) f. N3 g* Q. t* d1 G% E, J" w" e  head=p;% {3 m; U; o, m' k% ~
  for(i=2;i<=M;i++)
4 c1 D& K4 Q( o: f" {. b, `    { s=(MONKEY *)malloc(sizeof(MONKEY));2 z+ ^1 e0 j% s! ]9 O! A
     s->number=i;s->flag=1;
0 O- A% s; d2 q- \8 R8 A1 n     s->next=head;! ]# w$ j) t( H& v! T+ x
     p->next=s;p=p->next;
8 a1 m, \# K7 G* W7 m- @    }
$ Z% ?9 Y2 O; @8 w' B    p=head;+ E6 {* ^4 R& X) W+ j
   for(;;)
, S6 C4 d0 |0 T& A# P/ P9 l    {if(p->flag==1)$ p6 ^* e& N, D) e, @, |
       count++;
; g; u% P' f& j0 G7 |9 X( e; o     if(count==N)
) V6 _, t- I. f! D% w; \4 o% \        {p->flag=0;
. \, H) H! e0 R9 l* ?; G' T         count=0;) m. q% T. S3 B0 m
         sum++;}
! N$ l$ E2 U" M# ^     if(sum==M-1)
5 I4 B/ r/ s5 S        break;
9 J( @: k; l5 n, a; f* q     p=p->next;7 n5 S* O8 t% c# \) v
    }8 Q3 t0 i) P7 x6 l( h7 _$ D# M4 ?' \
    p=" N4 q4 }$ M' r0 g6 o( I
    head;
/ @+ j; _  d+ j2 J6 G% [+ d; _    for(i=1;i<=M;i++)
# l4 c4 K5 t7 n1 D' G  A* k( n/ M    { if(p->flag==1)
3 T$ E2 A8 ?. d/ O. P' j        printf("\t%d",p->number);
8 |5 S: H- Q( m& g      p=p->next;4 r2 Y  `' C; c6 R4 d
    }
& G! P. m. J5 p& W+ l" X3 ^+ u" o1 s( n* z
% U4 c8 _( s$ t- B+ Z, |

  b$ T! c2 p4 `! y; V) ^8 ^1 J% m% a}

0 G' P) H. }+ Q, d第二种方法:数组
5 ]( B  L# j2 ?3 E#include<stdio.h>: J. p; b6 C* `+ p! v. Y! i
#define M 88 C! c+ ?# w5 Y% m4 E, T% T
struct monkey/ b3 {4 K; s: G! ?
{int number;
* o, [$ P8 ~: K6 X& l! mint nextp;
! e" V+ Y% [; Q2 n9 ?& a}link[M+1];
6 n9 t% u' n' H( l6 |& k' D& z6 Z8 [. x( w
void main()8 ~! ]2 l6 O: N5 v
{int i,count,h;
+ P6 Y3 _* H4 V7 D+ rfor(i=1;i<=M;i++)5 `+ O- U, {% V( a$ T
{  if(i==M)( a6 l5 Z+ F- Z8 \2 ^
   link[i].nextp=1;& h- y/ U$ M7 v" d
   else' k$ j( K2 V# ]
   link[i].nextp=i+1;
7 e& d/ ]& S0 N, z: p* t* p1 z  link[i].number=i;6 e& m4 n6 q3 g$ o- a! W" z4 [, d" }
}0 z  G& ?$ ^, T$ }' O
printf("\n");
; S0 T& I2 x; s4 z! Q! {, i- p; w% Xcount=0;
: j- ?5 H" ~8 x# V3 y5 |8 Bh=M;
$ d  s% M* V. Z8 |# ^5 `; p8 \9 {printf("依次退出的猴子: \n");
6 ~1 v* L8 k0 f% k8 }9 f4 ?# N8 ~while(count<M-1)
: E- X5 ?( ^6 R2 v6 K( A{i=0;; G4 y, m; r# M' r* t1 v+ P# h
while(i!=3)$ k. ?7 [4 V0 a
{ h=link[h].nextp;
% ~2 g3 B) B' j" l0 k" b   if(link[h].number)
0 s$ r+ ?7 ^+ t1 l; O2 M& J# ~8 Q0 x     i++;}# g8 W  M& r& J' Y! _
& l; ^6 T, e( o
printf("%4d",link[h].number);
& z) j$ D( ]/ i: w$ nlink[h].number=0;, d$ d* z0 e# {
count++;
/ Y8 S: {+ c% v5 ]}
" X6 ?" p# U+ v( \& X9 `+ u
0 D) i5 \1 ~( Jprintf("\n大王是:");/ w  q2 i9 E* Y; p2 L% G
  for(i=1;i<=M;i++)
- M+ e9 J7 P# E( G. j% ^# [  L( D- w  if(link[i].number)& F1 O  h1 z' [5 F4 t
    printf("%3d\n",link[i].number);' y( v+ m4 q2 x! H

# a) Z" i' f# H+ Z1 X8 ?" _- C! B
7 m% K7 T, R; `! F/ q}

6 z5 O9 g, u0 T5 V/ Z7 m第三种是普通方法for循环
3 K3 L5 J: Q6 M
#include<stdio.h>
! x' `3 K: A, {1 l1 E$ b2 O# Rvoid main()" N! m5 v7 s/ O2 j, d1 y
{ int i,k,m,n,num[50],q,*p;5 _8 K7 V- o& u$ U% }, v
    clrscr();3 r! y& ^! ^6 h# L
   printf("input number of person: n=");6 K+ o( C3 U* d" o! N
    scanf("%d",&n);
$ N; S5 p: }+ r" |printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
6 x* [; s# ]5 g/ U  J% s. @$ z* g    scanf("%d",&q);
9 \' w' p7 y* j! F/ J   p=num;
' k: _. ~$ U* G% G1 v& [1 L  for(i=0;i<n;i++)
7 y6 D2 {1 p0 b; {" J: [0 Y    *(p+i)=i+1;, ?2 o8 B' ~+ v" r7 f& P
   i=0;# W( ?) ^1 m  m$ w
   k=0;
+ I  C8 x. M: t$ Q2 g# P5 ?   m=0;6 \( C3 f$ I' S2 u* e
  while(m<n-1)- H0 h; o2 i9 w0 h: U; K
   {if(*(p+i)!=0) k++;
! K7 }( w" }1 u     if(k==q)
) X& z! @1 L* F  v      { *(p+i)=0;
) w3 x) o# B) [9 v! Q        k=0;7 H% j% n, M5 Y+ x2 |
        m++;" s3 ?4 H* s: H% ?6 s: q
      }/ @. U. R0 O( u, m. Y! m. Z
    i++;' W, O1 y# S% U
    if(i==n)i=0;9 `, y: o  v) I
   }
0 A# I) q. B& x+ D0 t  while(*p==0)p++;
  J/ s  M! _5 b3 E, E% ~    printf("The last one is NO:%d\n",*p);: n* Z9 A8 V4 C
     getch();& _4 `1 d$ Y& E$ h0 m6 r
) L' N& t/ Z1 A4 P# @8 g" K
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
( R7 C) i, b" Bnamespace 又费马达又费电
5 y4 ^% z5 Q8 w, {! v% r+ n3 s) z/ Y  l{* R5 q( S1 c! L: j% A# O* x0 s
    class Program$ q: Y) T7 ^5 }, S! U
    {2 z* `4 W  \7 ~/ k
        static void Main(string[] args)+ ?# ]" J2 S8 \$ Y- ?' [8 m. l
        {; H) S* z2 w, V8 M
            int m, n;
! u( l5 @, }$ c5 s5 D4 }  T            Console.WriteLine("请输入数组长度");' t; ^. Y6 o& `8 y9 X5 v% B7 R  ?
            m = int.Parse(Console.ReadLine());//m为数组的大小
$ p! M1 |1 d/ c* R( D0 F' k% p            Console.WriteLine("请输入要截取数字的大小");
# x4 u" z- x; Q( Q" N, c            n = int.Parse(Console.ReadLine());! h% f9 q4 c" W( O+ u0 |
            int [] numw=new int
+ a5 h" a+ k8 B: w% D4 N3 P) J$ g2 R% X1 g  G5 [6 F3 A
&shy;&shy;&shy;;- A9 \2 g' [1 ~
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
7 j9 \  L# G# t, d+ j0 ^4 t# j) W5 S            {
, j0 K4 b3 n$ X8 _$ L7 X- T                numw[j - 1] = j;
. H$ ^! J( p5 K            }  Z4 y2 s# ]2 M5 [2 {  g
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!! Y& [" u  ?$ l; A4 u" f- A
            while (d != m - 1)
1 `% N) u1 e3 p9 E            {4 W; C/ x5 o! z/ [0 P( J* ]& r
                if (i == m && d != m - 1)( X% E$ Y+ i- p! m- \4 q1 d& Z
                {$ k1 u* c) ~% |, y! E
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
+ U" F; ~: W+ x1 J# O% n1 Z# r                    continue;' _: R$ U; G* O( q/ L& T
                }
% F( U5 U: P5 ]. E                else
. G! k+ `3 N$ P1 T2 q                {
0 K# s# r! e) j$ q4 F                    if (numw[i] != 0)$ I0 r( D7 `/ g8 H
                    {) m/ A! Y2 s" B
                        i++;
7 S( j7 K% P- D) I& r9 M5 u                        k++;# i7 p% |; V! o. N
                        if (k == n)
8 L- t* \" B  X4 A& m                        {- r- c* w2 n) U- {4 M
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了4 |' z# M) [1 z4 q- Z8 g1 x- T
                            k = 0;+ i' s- s5 ?+ |1 q4 J3 F6 k7 s& R! X
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1* R% P! G: r! C8 l
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
& p8 |- B* P! W3 \5 ?                        }, Z( [! x. B. [& p8 n4 t. j
                        else//输出暂时还没有改变数组元素的值4 |! A- b2 u4 @2 q  ~$ `
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);6 O8 U; J. i! E/ D4 y) L$ ?) L, G
                    }# h9 ^  ]' O# s  ^* k. T
                    else7 b5 K- I+ O( j! {5 ?
                        i++;//数组元素为0,直接跳过,不计数。。。7 i/ M' c! h5 l! j4 y) b* M
                }
4 L+ g6 }; O; Q; q5 p' t' U) m5 U   h$ Y; U% r; f

8 X4 E. z3 b* r( ?; h            }//结束while循环
# h; @3 Q) B0 A' A5 n% g            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦. A$ t: d# t  T/ V
           
* [+ G+ E3 c4 `% |! g                if (numw[i] != 0)
! D8 y- n3 ~  R, Q2 _                    Console.WriteLine(numw[i]);
8 }8 E! K# i9 L- X           
/ b" e$ i! Y9 T! a5 W- K            Console.ReadLine();& s7 r" Z+ C. K2 W1 b6 d
        }" ~6 R8 v/ Y4 L9 ?  H5 F* f
    }& R+ K( V5 B& X/ A3 y+ c7 r
}/ ^: h5 a8 a# _7 [
小甲鱼最新课程 -> 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-11 11:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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