鱼C论坛

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

猴子问题

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

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

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

x
大家好!& S$ U7 o5 ?0 _& F8 N8 }- y  k
这几天我在忙着编一个问题,我用了一种方法编出来!
% ^6 ?/ J: i8 i: H4 ^4 e但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!2 P# \2 `! x* T, e& l1 M
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 2 h5 O9 v$ I1 g2 C7 a
9 ~) m4 U3 |+ W  `8 X
+ j  _7 s5 O- f
                            题目3 T: _1 H6 v4 z- ?- F1 e0 s/ }
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
( b& r1 \0 R2 a7 o7 N: C) |第一种方法:利用循环链表3 J4 p# b! Y( L+ k; u! I7 T
#include<stdio.h>
/ I- L2 j- @# L" M#include<malloc.h>
% m, R6 X& |4 G; ?) [#define M 8            //共有8只猴子, i) ~# i8 ?1 T0 g! M7 p6 |. c
#define N 3            //数到3只时退出第三只, W) q$ o6 o5 B: d
typedef struct monkey
7 |/ G- B. h3 f$ [% A5 l{int number;" c* n; ~" |$ f& g
int flag;8 q. i" L. d/ F& Q5 C* h0 `
struct monkey* next;, [  X3 ?: I& J: P8 b6 g: D$ G
}MONKEY;; }! i9 W' x( t& h% T
main()
$ M6 \! V# P" t( F' a{ MONKEY *head=NULL,*p,*s;6 ^( S( u; v; X. I! f& Q2 w
  int i,sum=0,count=0;
% \8 _: B! n& x8 k  clrscr();              //清屏
) t3 Z- Y* a! M$ F, {, o. v- h7 Q  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
2 t1 O( M% f& Z8 S  p->number=1;p->flag=1;7 B8 k( }) U$ h0 L* s7 `
  p->next=head;
+ |( D  Y+ d+ M: D; b  Q) D  head=p;
9 @3 \* k# o: m& T* @  for(i=2;i<=M;i++)
" L. ~! b' i( K; h  k' Y    { s=(MONKEY *)malloc(sizeof(MONKEY));
. H; D- t  N* y& ^, f7 l6 X     s->number=i;s->flag=1;
% T  \3 f. |7 w& l) v$ a: q9 p     s->next=head;
3 n' h2 H7 h( E3 Y4 ~     p->next=s;p=p->next;: m' F3 ]% ~! m( k! C, B
    }
( s! F) k3 Z: D0 ^' n    p=head;. w  l% }; F* c
   for(;;)
! T: B; e/ T& w( A    {if(p->flag==1)
: o) M  t0 s* y+ I+ {       count++;
9 i$ ]0 [1 u3 z+ w! z- s, L     if(count==N)9 U/ ~1 H' A6 ?5 k
        {p->flag=0;
( u  h. p8 I  x+ [- l1 h         count=0;
4 D( U# _1 d) _1 d& ^. D         sum++;}
+ A0 n- }. l  s2 Y1 m9 Q6 T7 R     if(sum==M-1)
6 B% J$ q) }# ?& a7 o        break;
1 X# {2 b! L' S2 S- y     p=p->next;5 s  S) b4 `1 a# l: a5 k
    }5 r* a; b( n  D0 `+ `
    p=3 J& R1 H  j$ p7 G) _% |
    head;, e$ I* t! Z! ~2 p+ `: h0 p1 n
    for(i=1;i<=M;i++)
6 S1 {; i. F0 T2 Q2 a0 v0 C    { if(p->flag==1)
2 J  j: h6 c5 G5 ?  b8 \        printf("\t%d",p->number);
$ s  j  f9 r$ _7 G      p=p->next;
: @9 v  H* U( B! q* x0 J$ d, k    }
5 I% h# I+ k9 t! C4 u: h) S# ~9 `. y" O& ?) y1 D8 F

4 }+ `! n$ z; B2 i0 c7 H/ ^
. J, t7 y* ]2 L% F, W5 n}

* Y5 t' W! K2 S第二种方法:数组
' _6 E$ y2 v0 L3 G/ B' h& ^#include<stdio.h>
# X8 `6 h, c; ^* d* C& _! H  j4 x#define M 8- A2 b9 _1 u  ~  a; Q1 Y9 Y% g
struct monkey
$ s- ]7 {  a3 e; e5 Q  Q! y{int number;
6 I  y" ?: N+ _4 Tint nextp;2 q9 l7 K  k3 [# u- I" U
}link[M+1];
, T8 S, D4 ]2 V- F1 U% ~$ K+ X( K5 x. m" Q8 _; L0 ]$ [
void main()
5 b. ?0 c" j; f, z" _. U9 z6 B' {{int i,count,h;, x, \* x5 w% V& t- a
for(i=1;i<=M;i++)
; u9 e, R, G8 [# o8 [2 D{  if(i==M)
( j2 `2 J8 G6 f4 \' C1 k   link[i].nextp=1;
7 b. x8 c) L+ q   else2 W* f( G) M/ ~0 w4 U
   link[i].nextp=i+1;
0 Z8 R+ I5 {- w5 a  c- x& R1 }$ m  link[i].number=i;: j1 C7 N+ h* u
}
- Q; I' T6 m3 U0 C+ pprintf("\n");) b; Y+ y' o( m0 ^$ d8 f
count=0;" L" h+ ^3 L9 \$ A- t; _( R8 x
h=M;* I* [0 p& T3 P( ]/ i  ~7 @7 U! c
printf("依次退出的猴子: \n");
& K8 H5 m/ c+ p! Ywhile(count<M-1)$ W$ M. T! x6 ~9 t. d+ j+ E7 A; }
{i=0;6 o2 n8 j0 Y; t8 z6 D
while(i!=3)
7 H- M1 P( y8 ~{ h=link[h].nextp;
4 X7 F2 D4 m. n* r$ f# y$ j4 y   if(link[h].number)
8 L6 j3 S+ s3 L4 ^$ D* B     i++;}
4 s' r* d( q- l0 f, z4 V: ]  ~. R; O) B* v! O7 b
printf("%4d",link[h].number);
' M/ ]! k: C8 ulink[h].number=0;& W# B' L: Y9 b$ K1 T' j. N
count++;7 T( B  F% H9 r% b" O- B" ~- m
}
& t& N+ W2 a/ ]6 A: w4 v/ Z9 O: v; J" v- R/ l/ @% z
printf("\n大王是:");1 ^  k* U" _6 d
  for(i=1;i<=M;i++)
$ q8 C: [$ e: x- D) F- i, ]  if(link[i].number)" F! J. ?+ X* T: n- X, G7 T
    printf("%3d\n",link[i].number);
4 p4 [1 ~! W7 \) k5 B/ K0 s( H
3 g- \. c) ?. G) D- e, B% y2 t6 |& ^& T. q
}
/ q7 h5 j# U4 T! I
第三种是普通方法for循环
7 h% a* P6 J2 W) y. s  B
#include<stdio.h>
* F8 G. b. [+ ?& R! s6 uvoid main()
8 [# i. u' H% T! n{ int i,k,m,n,num[50],q,*p;# n( D! ~) p5 b% i
    clrscr();
. \' o* |: W7 j! H. n6 {- E6 G/ n   printf("input number of person: n=");
, r& u% l# v% L( o% U, ~    scanf("%d",&n);$ `& A+ V: c8 n! P3 w# u+ ?
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只' D  `4 w4 U' n# K1 |9 n& L7 x7 c2 [
    scanf("%d",&q);4 }, |9 t' u& U0 L
   p=num;& Q3 u! b, `, a7 d
  for(i=0;i<n;i++)
  i* j7 B" P9 b1 |2 O3 l. y" J: ~    *(p+i)=i+1;0 [" z' Q+ T* c
   i=0;5 o, c4 Q) \4 G, N5 }
   k=0;
9 S- P9 g4 P3 D( C, D3 l! _0 }6 K: {   m=0;
1 |  p& ~% k( W, T! A  while(m<n-1)* k) s0 E+ R6 x( f3 Q  w2 I
   {if(*(p+i)!=0) k++;6 B. s: Q5 n/ e4 r4 |; d9 [
     if(k==q)+ U$ F; `: @: j/ S( `+ g/ X
      { *(p+i)=0;& W' w8 _! [6 \. r( k7 y
        k=0;
8 D, h) v8 }5 R& Y; u( x0 X        m++;( l. N; Q( o( M" I- h6 V
      }. W+ I( d% d# a4 r" s" B7 [  D% m
    i++;
$ n9 |# ]5 r0 u; c    if(i==n)i=0;7 t* ?4 d1 _" M: q# V
   }1 d7 c9 X: c& \+ z9 Z8 K* r. S
  while(*p==0)p++;
# E& H; j' z2 T% L    printf("The last one is NO:%d\n",*p);, F* Q# g0 d+ i. d0 {/ w
     getch();  p  Z' I: q7 d! e% N8 D! e" z/ S% |. S
& S9 ?' m0 T8 ^( ]
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;% Z' h; Y' ]- H- S% y+ l. S
namespace 又费马达又费电
1 d- ^: U2 H+ w, L{8 i; {2 M8 d- d: N$ p; k4 |% J
    class Program
+ _; p9 z- R6 |    {
0 E/ {. k, O( P5 f9 `) y. O8 E2 I        static void Main(string[] args)
' q# T# w( v  P3 a- r" e        {
/ y9 L" {# O( N) Y; @$ F            int m, n;" `( u  U6 n6 V  f& m3 _
            Console.WriteLine("请输入数组长度");
7 A9 h) d1 S$ n* x) K            m = int.Parse(Console.ReadLine());//m为数组的大小) l, x' y' ^, k
            Console.WriteLine("请输入要截取数字的大小");6 Q2 L0 }8 Z- z8 v" f
            n = int.Parse(Console.ReadLine());# t5 ~5 A! L( X; o" y
            int [] numw=new int
: W8 }1 o' t# U1 V; O
; @: G, m8 ?& [' S- F&shy;&shy;&shy;;+ Z, u) [! g/ b/ i
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数7 F2 v3 N" D- p5 J& t
            {8 `4 Z) b4 g1 o2 ~0 _/ D
                numw[j - 1] = j;! A1 c$ f! w# t
            }. i; r% q2 \+ M" _8 T
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!6 W1 L2 k. Z% v& X# d
            while (d != m - 1)
( ]( s( U6 M; O& v/ q2 o            {  d4 o  L1 ^8 l9 ~: P
                if (i == m && d != m - 1)6 n; q4 ~% x( [' }
                {
8 D3 `) i1 ?. w1 P                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!3 N" ?7 S3 C* [/ b
                    continue;
. @1 N# E; `; r6 N                }' x* L7 p3 @0 Q* h  b5 r# ]( ^  Z8 d" O" E
                else' ?1 }8 R9 u) Y3 `
                {
/ x4 d2 W3 f/ m3 F7 D% s! k                    if (numw[i] != 0)
, ], f0 g5 f3 B8 |$ N+ b: m                    {0 r2 ^' Z1 @2 u/ M8 q0 ~; n8 d
                        i++;: D$ F4 d3 V9 x/ V
                        k++;4 w! U; p9 I. x: _
                        if (k == n)1 B7 h6 ~$ B2 i8 m; d1 p' _+ {
                        {7 Q4 ~% S- A- p( K
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了! H$ X2 h% {* w) S; N
                            k = 0;
' P1 J+ c/ v) N7 u4 ^              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
' h- R& w; ]' a9 K* d                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);: x1 O) }% n: ]) D
                        }
! K" D! d' I9 v3 z% J8 K. Z                        else//输出暂时还没有改变数组元素的值6 \1 M2 f# _& u/ |/ i9 c
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);6 ]! O4 B, F$ b% p; q# P0 w. D" p7 c
                    }# E  p: z1 D  j& w& {
                    else
4 @- v, Z2 j* |* A2 Q                        i++;//数组元素为0,直接跳过,不计数。。。& e$ h- [$ ~! ^  {0 l5 ^5 d* M
                }
6 W5 p2 }1 o3 \% e+ U
# T4 f% g6 I& P) j) Q
) Y: e3 \2 K( ~* _            }//结束while循环  V0 ~! W, |( l+ z
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
: f. o. U2 J+ O           
2 }& y4 w/ b7 Z                if (numw[i] != 0)  g! e/ U8 L6 k8 B1 q7 {
                    Console.WriteLine(numw[i]);
7 e5 f$ V" ~- V9 A# U" J# |           2 ^5 i9 U* M8 B% F
            Console.ReadLine();
' D# s" G8 n  _: \) e        }
3 @0 g. z# S  d0 g" t9 q: \    }8 g( {' ~8 D0 \. `+ V& ]
}
: z; @2 F9 L! _9 v
小甲鱼最新课程 -> 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-4-27 13:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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