鱼C论坛

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

猴子问题

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

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

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

x
大家好!4 e$ y% i8 c# ]: P' `
这几天我在忙着编一个问题,我用了一种方法编出来!3 s5 r* V3 P& g& j/ Z" x- q: `2 A
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!" N! d1 C3 t' T4 x3 }4 |- P
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
# V, P8 g) z; Z( F, A' ^
) w: l; ]* b/ K% [$ g5 l  E- S# C. N
" Y( L9 t! s3 d) t& }
                            题目  E( O" V" [$ |/ {+ {. j
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
0 [$ j% J2 x6 O第一种方法:利用循环链表3 J3 B! D/ S, a2 O, S
#include<stdio.h>+ k; P  g, o) e# q
#include<malloc.h>
! R6 O) E: G' C6 ~* |#define M 8            //共有8只猴子
7 ]- M/ d8 B' ^% T8 ~0 F, I* c#define N 3            //数到3只时退出第三只
/ U% G: D+ p, ~1 H. C( mtypedef struct monkey+ w) ^% b, G7 R" E* r- |- M
{int number;
' E0 J. h. T" S0 o& `  o% Rint flag;
. T9 u4 h4 z1 A" v; Pstruct monkey* next;
  \9 O) g$ o8 Q, V5 x, Q+ ~* ]}MONKEY;
2 [8 ]. O5 j- C* C4 L$ }/ _main(): U# r8 v: d! r
{ MONKEY *head=NULL,*p,*s;
: \5 U  H& F" Y! C$ I. R1 |" Z  int i,sum=0,count=0;; S/ @9 [2 L9 m4 @) r
  clrscr();              //清屏
$ V" d7 @" H9 H8 U  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存  O& T/ @, n* h$ _$ _
  p->number=1;p->flag=1;9 w. j; l7 S% v- [& g; M6 X
  p->next=head;
/ T, v7 n2 b2 O  head=p;3 d+ ^; D7 b& W8 Y
  for(i=2;i<=M;i++)) x5 k! S9 n0 _7 Y" v0 s
    { s=(MONKEY *)malloc(sizeof(MONKEY));
- \( M! F6 S5 q/ m0 h  S/ K5 x  [     s->number=i;s->flag=1;
& }% {2 R& S. D) m, i) I0 Z     s->next=head;
+ s2 P% d$ V' ~+ z     p->next=s;p=p->next;
8 A" E/ ^1 b4 `5 z# g    }
4 O: `  A) m( @4 n' m: j    p=head;8 T5 E: ]5 c& G
   for(;;)
; ?' n( U* N& G    {if(p->flag==1)
$ x. j3 F& q' y9 I2 i; h! x       count++;
. c# I9 B% j0 r" ^: i# }     if(count==N)6 `) y. l% G/ u/ d5 V" S
        {p->flag=0;8 L* _  S( @; d1 v3 ~8 ]0 o' l
         count=0;
1 y, l5 ]- k5 E( ~2 [         sum++;}
. W2 o; ]3 c( `; O* M, Y( \     if(sum==M-1)
/ i4 O3 ]+ g  v2 y$ _        break;1 x- _1 I" v1 T
     p=p->next;
: u1 R) T% Q" }5 i% h/ r( h    }# L7 B. _2 o, y  b
    p=
: c$ D& J$ k5 a3 j1 o! I    head;
# A5 d+ |3 X4 c    for(i=1;i<=M;i++)( n1 y8 D& f3 P5 V
    { if(p->flag==1)
( l4 H2 B/ _" X" ~9 T        printf("\t%d",p->number);
; r4 _2 s* B  s0 Q      p=p->next;$ ]0 `+ e, j% I% F8 p1 L( U, p& a
    }
: ?' q" k" N5 i% e& _* A" U( ~
  n6 `9 b3 [) l0 X; J3 \
# t5 V% u2 h9 P. F( w1 f
1 d. |! v. U  l; w0 A}
, G# t) D3 j% V1 |
第二种方法:数组
( R( N5 {% }. a9 ?6 w0 e#include<stdio.h>8 g  o9 |9 i! Y1 j& K2 r7 ]
#define M 8
; n3 S( {- B" r  S- G# [struct monkey
* ^( L$ b1 H* e- I) F4 [{int number;
; s- \4 [7 {; L+ o: J" `" Lint nextp;$ u! H5 Q9 X$ {  k" A* ?
}link[M+1];- L9 R+ S% b# ^0 j. \
+ K2 h) E9 a6 c/ s
void main()$ g& y7 r1 Z& Q9 ?
{int i,count,h;8 y- t. H* z/ u1 X5 h
for(i=1;i<=M;i++)
, ]% m' s" i. |0 \6 d; L% a, D. e{  if(i==M)
& @( h* p1 ~. P   link[i].nextp=1;
  d9 h# T( r  ?   else
: }2 H7 i  c. @   link[i].nextp=i+1;8 d# @& y- S4 N' Z# ]
  link[i].number=i;
/ k! d$ E5 i  }# p}7 T, {+ \. m* o9 w2 d+ P
printf("\n");
. X6 y! A7 P9 o, @/ z  Rcount=0;
6 v. \' u, m  Jh=M;
0 D% {6 R5 P7 J: S8 }printf("依次退出的猴子: \n");/ G6 @/ V' U/ r
while(count<M-1)7 x3 z$ ~( b& Z2 m# j  C( O# v$ S4 g
{i=0;
" C9 ~3 X$ s  Z. V; G+ v9 \while(i!=3)8 [. k4 J7 s( V0 w3 b9 U
{ h=link[h].nextp;
/ H5 k1 J% a; b0 @; {   if(link[h].number)$ e2 s1 Z6 i2 T/ R) E& ]4 ^
     i++;}
  }& P+ e0 r2 h
" F8 P7 {+ @2 t0 Oprintf("%4d",link[h].number);
3 K( R9 Q9 L3 @link[h].number=0;+ |1 |2 K8 P7 `; u4 K
count++;# \1 i$ i- d* S) ~$ L0 o6 n4 \9 r" Q2 t
}( `" f7 B# P9 q* ]# J! |5 o) f$ [
; I6 Q1 Z. s1 m' R3 B+ @
printf("\n大王是:");" P) p6 i1 l+ S8 f
  for(i=1;i<=M;i++)
# v% M$ Q9 r$ @! C! l0 k( J5 _  if(link[i].number)
1 Y) o# L6 ]6 l# e    printf("%3d\n",link[i].number);
! O+ y9 M% C! t+ B/ o) I# p. v. E
  j7 m% X- T: _, E1 X7 S2 I8 Y) B0 Y+ ?" r5 R  o" x+ L
}
8 n9 |$ |  b; `( k
第三种是普通方法for循环
) B6 @' A" o( B. g/ V- o2 X8 ]
#include<stdio.h>& H5 v& J3 P* Q: z- E
void main()
/ M- ?, l1 E% H% l! T. B{ int i,k,m,n,num[50],q,*p;3 `, t7 F& M; k' }- o9 g
    clrscr();
7 i$ q, r7 A+ C. ?   printf("input number of person: n=");
/ k. m- N, P; E) S5 v  m+ [4 Z    scanf("%d",&n);3 V' Z/ t1 P1 A" z* u4 \
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只/ A9 G) I! C# I$ I: V5 T) _
    scanf("%d",&q);+ V# e, S4 b- M6 a0 ?
   p=num;0 A/ y' e1 g0 O+ ~* \, a+ H1 Y7 Q
  for(i=0;i<n;i++)
' z- P) C4 W/ z% ]. m2 x5 _' H    *(p+i)=i+1;
$ s. _" a: v+ s$ E   i=0;
9 W$ h# K" e' H. E   k=0;6 K# O9 s- s5 o# L* E" f
   m=0;
: l1 P# x& o- P! v/ r! [/ G5 R7 k  while(m<n-1)* \5 Q# M( T$ I+ l0 x! T! Z
   {if(*(p+i)!=0) k++;
; @2 Z' C% H. W* E* Q; A# g     if(k==q)
$ c) ~! ]9 o- f' O      { *(p+i)=0;; b' a( q  t/ b/ E, Y9 R& F
        k=0;
: E2 B0 s  E4 l- J' v" w0 m/ R        m++;
( V. T4 P1 l+ z2 h# _1 C      }, N: O) q5 F( n. [# ?
    i++;
5 l0 F: k# y: p- o    if(i==n)i=0;
4 w) _* o3 F& t) G- T3 c   }$ Y, H, `# r; J$ P4 P
  while(*p==0)p++;
1 [9 F6 k) z7 H3 d- H7 V9 z    printf("The last one is NO:%d\n",*p);* O8 j% i* V& L- p1 n3 b$ J
     getch();; H: G5 e0 u6 t9 M* ^, j9 L
/ t- W$ d( P' S
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
* n9 X6 j0 V7 X, d. Znamespace 又费马达又费电
; g8 X9 c& B3 p- J# R4 u{1 g7 l' ~6 T2 `0 A2 l1 D
    class Program, d; O( X1 F3 a; q' S8 G- ^
    {- w! [% `6 Y( L; E  |
        static void Main(string[] args)7 m8 _: v! l2 z& [9 h
        {
0 x# J3 r' H7 W            int m, n;/ `6 [0 A! H; G: j
            Console.WriteLine("请输入数组长度");4 P9 X6 S# w9 j0 c& C* g: k, C# t
            m = int.Parse(Console.ReadLine());//m为数组的大小
$ d. i$ h9 n2 y) n2 S            Console.WriteLine("请输入要截取数字的大小");9 e) x. A. T$ V- f" U2 F" {$ X1 A8 l. _
            n = int.Parse(Console.ReadLine());
0 h* E' c0 n* Z1 q. }            int [] numw=new int/ p9 Q, s3 {* n' f5 o- L
! n+ X  I: B6 S& Y% z% s7 \0 e
&shy;&shy;&shy;;
, ]" e6 o0 N3 w% K2 [  I            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
3 ^! |- c# F: r% z3 V( Q5 J            {
" a; c3 E2 z: w) }% G% H, h                numw[j - 1] = j;. e4 ~: ?7 f4 n0 F3 t& p- C
            }
8 M6 M  H, c: S- ]2 I: i" m            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
7 L* c6 h) h% A# v& O7 G0 e            while (d != m - 1)/ t4 J! \% w& K8 D
            {$ e2 z' `5 ^& P: R
                if (i == m && d != m - 1)( x6 J7 M" B0 H# Z. i- s) f
                {: Q7 m: K* b4 t
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!2 I' G( u9 w) w/ w/ s
                    continue;
7 k! h3 e0 n4 O" m# ]5 _" u                }4 I/ z, S5 `, t
                else7 h) d( D# N, P/ v( x5 R
                {
% X9 U; c$ R" D# |: y                    if (numw[i] != 0)
8 S. X* s7 e2 ]5 Q% p                    {4 m  }! Q5 f- L, ^# d" s
                        i++;
; z6 i  {; ^; t1 o+ t4 Q* m7 e" f                        k++;
- a) g  M2 l; C                        if (k == n)
2 C2 M; E3 c1 r, c) [/ h& Z+ C2 P                        {
5 n+ m, y* e' B5 O" }3 n                            numw[i - 1] = 0;//把在n位置数组元素的值改变了9 H5 V, A3 H3 w& D4 I
                            k = 0;" c3 T3 j$ _  q/ _3 O% J; I
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
1 d" `9 X; f8 s                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);, y- T2 @6 E8 ]/ l$ U
                        }
$ X  |7 O! {5 Q4 A6 v                        else//输出暂时还没有改变数组元素的值1 z: }! P! _0 t7 s7 ^2 Q9 |" ~: J2 W
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);* U1 @. H4 f/ ]2 W3 t/ Z  j  s
                    }% c6 H5 f$ J' ^. w; H
                    else7 G2 R' P. C3 a9 D
                        i++;//数组元素为0,直接跳过,不计数。。。
3 a" R& R) j8 ~0 s; K5 `  i                }
1 U7 J5 k( J! L: x5 J9 b
% f: ^' v5 |/ d* X3 a/ _1 Q9 z$ q
: i$ n' y) v! B' A, n            }//结束while循环. _; @+ A* s5 A/ \5 N6 U' f1 g
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦6 {9 K, D: k/ C! W
           % T0 H9 [# D. h1 w3 y
                if (numw[i] != 0)$ r  x! a4 E/ x6 t; ]9 a
                    Console.WriteLine(numw[i]);# z( D5 J1 W4 g- w$ c
           ' j0 o1 i, b7 W5 k9 H& E- f( N1 Z
            Console.ReadLine();# `/ f6 z7 C1 K, I$ n0 U0 d5 G
        }
; t- w0 B+ l: p8 q& W3 r; |    }
) N+ F4 ^  y0 w. A}) |  Y( S. A8 x. R$ a* S
小甲鱼最新课程 -> 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, 2025-11-15 11:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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