鱼C论坛

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

猴子问题

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

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

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

x
大家好!, R; |' j1 c- y
这几天我在忙着编一个问题,我用了一种方法编出来!
) Z, r/ ^3 S7 o但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!- S) d2 o8 J4 C, W' i7 f: b4 R& h$ {
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
/ k: P  n1 T- W* S' M
6 y3 j; s0 X8 u5 ^" H& y( d, s0 g2 I$ j5 [1 n+ ]! M8 D  Q
                            题目+ c9 x+ w: V; Z$ u4 A, _: K& h
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
$ n4 F% x; h0 g3 e8 j% A; ~* A第一种方法:利用循环链表
! U# A  Y0 t7 D; v. y; i#include<stdio.h>
  I* R- ^# J6 @#include<malloc.h>  T6 e& g. j1 C0 C+ r' B8 T+ ^
#define M 8            //共有8只猴子. h+ Z# p! ~5 }9 g* g0 D2 u
#define N 3            //数到3只时退出第三只
' x/ F* |; _. H% m- ]/ `typedef struct monkey
+ L% g/ T6 ]& u: S2 g# `{int number;
4 y0 x# b) S5 r+ Rint flag;
2 x, ]9 ~5 W. Z+ J; @- kstruct monkey* next;
0 P& @" O) }$ ~& a" R* T5 C- H}MONKEY;
2 w1 }# q7 p  s4 B0 w# Omain()0 m; Q! {  S; i& b8 a
{ MONKEY *head=NULL,*p,*s;/ h6 r( G5 ^1 G& r; V* R
  int i,sum=0,count=0;& `, U8 u4 _# v  v- z2 z
  clrscr();              //清屏
, @! @% ^: @5 r9 G; C2 b! V6 U  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存* |% @+ [) _2 Z0 Q
  p->number=1;p->flag=1;0 E" j: q4 d; k0 u% F
  p->next=head;
6 o; q# S, C- K3 _: k  head=p;9 A4 S% M  m9 a+ K6 Y
  for(i=2;i<=M;i++)
1 w2 q4 B' p/ }/ D' w$ X    { s=(MONKEY *)malloc(sizeof(MONKEY));7 ]" v. k- @! Y
     s->number=i;s->flag=1;' z2 z. J% }% D. T% w
     s->next=head;
  O( t7 }: W. ?3 S8 ]! ~. A. a$ L2 T     p->next=s;p=p->next;
4 s( I6 q5 i" v( j    }! o2 p9 _4 R+ g
    p=head;) ^1 j' b$ n9 Y5 [) O, B' Y2 t* L
   for(;;)% x* n+ E  o* X: f9 K9 q8 G/ B' V2 V
    {if(p->flag==1)0 f1 O+ L3 m& ?8 S. u4 \$ ?
       count++;/ z( y5 U. E' E& {" F$ G, F
     if(count==N)! m; j3 x5 `3 N
        {p->flag=0;2 t1 D/ b) ^  _# o- O
         count=0;
$ I' R- J: @: f& Q" Z/ z         sum++;}) x' z1 g: K, v, K1 O- k% `
     if(sum==M-1)- w2 ?) C  X+ L' R. C' [8 ~9 e0 a
        break;
% u& W5 X8 n6 X; W" z     p=p->next;
) G$ l- L& x3 g. ^' q    }
3 x5 ~7 Q* e5 m6 T8 d    p=
) y( N; t0 i1 @/ v5 K    head;1 S# `. l9 V) G3 s5 V' t/ c. \/ @
    for(i=1;i<=M;i++)" |* O# Y4 [% _, M! [2 e7 ?
    { if(p->flag==1)
' t; k1 R: J4 ?9 y- @8 C; p        printf("\t%d",p->number);: j5 @. [1 S* I3 i
      p=p->next;
% X; u7 w. b# [1 N8 L- x5 G( ]    }
$ X$ l' J/ C5 @% ?8 [+ F# {7 B9 v( c& ]/ z0 @

9 {. l% N; H  ?) C$ y3 V$ x, m+ z" \$ y
}

3 \. N( C/ Y5 N7 e6 R3 t第二种方法:数组
2 n# \8 @: l/ Y* P; X# y% A#include<stdio.h>
( m( {4 K, S) u, J8 Q+ B4 b. @#define M 8) f! ?9 f( q& ~0 R  K5 y% U! m
struct monkey  m- Y( V% J& k. m1 F% _; R3 ~
{int number;
. E) [+ a* F7 x) w  S# M% P# Jint nextp;# e+ b, c2 |1 S: {3 t; [
}link[M+1];& B6 T+ x) l+ G" s/ b& t

, T$ }: L* Y, Q/ t3 s+ Ivoid main()
3 p' x- U) E& H; p* t" o, V{int i,count,h;8 h) t" [# B5 }) e6 X
for(i=1;i<=M;i++)- ]1 Y9 h" [! P& |
{  if(i==M)
  B& z' ?+ `8 ?   link[i].nextp=1;8 ^" h3 `/ @4 W! I7 i. K' w
   else
0 I$ x( y: s5 s   link[i].nextp=i+1;
4 U4 ~4 w, ~0 J1 k( \0 y+ M  link[i].number=i;
# {  a$ c/ M4 F1 i7 h0 ^}
' @6 p2 a+ R& }' g) K) g7 W% ]2 U6 vprintf("\n");
( }- l! o, {0 s& V7 @/ z& i  jcount=0;+ _% X6 |, M3 z2 D
h=M;( X; M. C4 ^; ?! H& e5 N
printf("依次退出的猴子: \n");
/ u$ ~8 M2 k" t0 G0 ewhile(count<M-1)7 N6 Q5 j9 _9 Y
{i=0;
5 U! {, w; b* v6 K' i0 F5 Ewhile(i!=3)
$ E3 U1 U6 C, I6 \! G( [( p5 C{ h=link[h].nextp;
4 [* D( z! [/ F: {   if(link[h].number)
% q7 M- h5 F  T. N* G8 ?     i++;}
' ]2 I' |* H' e8 z7 v
+ ]; D+ N5 W/ T+ h( K6 t& Hprintf("%4d",link[h].number);0 Y* _( ?3 F5 K! n& x$ u
link[h].number=0;
. |" S5 \) P, i; L$ X1 Gcount++;$ r2 B3 U3 }. ~; W' Z
}) q: M% B9 x+ R' W9 |+ r( n4 r

5 b9 m& Z! e. F( Q* p5 v  Wprintf("\n大王是:");
0 ~' n( [+ z* Z" o  for(i=1;i<=M;i++)/ E$ E1 M. l$ s, u
  if(link[i].number)
# W2 Q! ?$ U( C1 q; u. l/ M$ |    printf("%3d\n",link[i].number);9 }- b/ K0 O4 \, X5 f8 {$ M- G. z

1 }  L7 e3 }' A- i% C1 M, t3 D6 D0 N6 N7 Q; r7 A- a
}

% C. O& b$ x& w$ S4 c第三种是普通方法for循环

4 a; q/ ^( y, B8 v+ @. F#include<stdio.h>4 r" f5 O9 g$ w) @9 P
void main()8 p0 M- P4 k3 K8 G1 T; E, s
{ int i,k,m,n,num[50],q,*p;$ K9 k- Z! z* T: `% O5 y  ~; a
    clrscr();
6 j% a  n+ e' K  M0 s7 x   printf("input number of person: n=");8 }/ K0 g& ]/ |; l
    scanf("%d",&n);
/ i, c* n  g+ X  o2 A$ p& n# cprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
$ l+ p- A! X3 f. @7 e8 c& A    scanf("%d",&q);2 ^: M' _+ J: e0 J1 T; t: @+ t$ n
   p=num;
! J* N2 V# N: T  for(i=0;i<n;i++)
& [' P! L* G( [    *(p+i)=i+1;
9 u& d" I) h9 @: F4 C   i=0;( N( r2 j/ ~: j2 o/ n2 [
   k=0;5 S( W, D) N% g3 D. L! ?2 ?/ ~
   m=0;
6 w% l0 r' B+ b" j7 j  while(m<n-1)8 l. P# ~! M: R2 H( e" W+ k
   {if(*(p+i)!=0) k++;+ E0 m! a- `1 x* \8 d
     if(k==q)
& e3 V3 I, |4 b' A2 S0 B2 S/ U% Q      { *(p+i)=0;% H) q  T  o8 I6 z5 v/ N" D5 U) r
        k=0;
. t+ m# f5 P& w9 k) i/ k        m++;
* E$ k; t4 T, H/ e2 c8 T      }
4 w( _3 c. f; M  f1 b    i++;
. Y" Y  g3 g. }) ^+ T8 x5 O    if(i==n)i=0;
9 b* a% k+ ]8 a' |6 P. ~6 ]6 m4 L   }
& c  ?( I, X) f! q& U! M  while(*p==0)p++;- j. R2 g! Y3 w+ p
    printf("The last one is NO:%d\n",*p);
! M4 H/ E0 T" n* A! ?     getch();  Y9 i. v/ T$ r9 F. L# b

2 ]4 N$ Y, E! R' m1 `/ f}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;( k: s: s7 {, U1 k5 K9 L4 p
namespace 又费马达又费电; A& m, b1 c+ Y4 `: Y4 \
{
9 Z/ h, @% m2 ~8 P/ p    class Program
2 o5 Y0 D0 [# t' e5 E    {
( D3 G7 r; o8 ?; ]" q) {        static void Main(string[] args)9 [- R5 v' J5 R/ w3 @' U2 [9 ?! I
        {: Q8 I3 _! S7 \9 O2 J; c& {) O
            int m, n;6 W) W4 D! a- F! _
            Console.WriteLine("请输入数组长度");8 {6 P# m0 T$ T/ f
            m = int.Parse(Console.ReadLine());//m为数组的大小+ Q2 P+ J' Q) P2 I  X
            Console.WriteLine("请输入要截取数字的大小");
/ X9 |( ^. f- n- d) \/ Q' ]( d            n = int.Parse(Console.ReadLine());
+ g3 y, p+ r! A            int [] numw=new int
9 R% {" ?4 t( V! E# [* |* p# h; _9 A* C
&shy;&shy;&shy;;
5 p) X4 P& j1 C            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数2 W* E  `6 a2 t
            {- @. w3 b0 v* U# p
                numw[j - 1] = j;/ g4 k- W/ i/ H% v$ ~
            }
( g, X9 n3 G  @  R1 G3 N            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!2 U0 o- e5 ^0 U$ p4 j7 o
            while (d != m - 1)$ w6 k) c9 F, |, p
            {% G' m# ^, \2 w
                if (i == m && d != m - 1)
9 O7 |2 Y; ?% T% Q                {
$ S5 ^6 u* ~! l! V5 }                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
1 F8 |" u: r( w( C  X; p7 n                    continue;0 v% c, P2 T. @+ U& {
                }4 w7 y/ f; F4 L4 u* d
                else
& ?9 H2 l& \$ D3 }' n5 B. }                {; y9 F7 z1 v4 T2 y1 Q9 t
                    if (numw[i] != 0)
+ ]) O; y( ?  c" U                    {+ s8 u- `" ?% H* J. N& H; Q
                        i++;
5 t. A0 G/ t7 M0 g, Q  S                        k++;
4 i* _5 T' a8 G) k0 P                        if (k == n)
( w" Q: X0 J. C* E                        {
. w# [4 j, j9 @1 T/ @1 y                            numw[i - 1] = 0;//把在n位置数组元素的值改变了. l9 l5 B2 p1 x$ y; I
                            k = 0;+ Q. l. @! A( h9 m5 ~; k
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
/ ?: N+ K  y* b1 j/ v6 k                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
/ X. v8 f( }- a3 \! ~                        }0 Y' \, L; `& q+ k1 d$ B) m: R
                        else//输出暂时还没有改变数组元素的值
( T! u& `% ~9 r2 j" Y                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; h0 z1 U' B, l; x  W8 g                    }
9 N! ?* i7 r6 e, s" U                    else
$ g$ f5 ~: I# M. S+ |7 ]                        i++;//数组元素为0,直接跳过,不计数。。。: P7 O. R; N- s2 J  k- e& j
                }
7 W2 W1 y( F+ B" U ' G, M: C1 |9 r, x6 w; n" m5 H5 {

: E* Q7 p/ ^, h2 L            }//结束while循环
3 R' \7 e" |. x# S3 D; M" @            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦3 k: d' Q, s6 g& l
           4 A0 ]5 u/ k9 r; S4 |" {1 Y" t
                if (numw[i] != 0)
' {0 i# p# d; ]' X# Q                    Console.WriteLine(numw[i]);; i( j- |5 A2 ^, P/ S( E6 v
           8 I4 b$ Y. E# D
            Console.ReadLine();
2 l+ f& o$ z+ x6 p! `        }
) ?6 o' G' Z  B2 y2 e- U' n- c7 U    }/ r5 `; m# ^' a  j. ~6 X7 j
}
$ `) Q/ E! i8 B
小甲鱼最新课程 -> 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-13 16:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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