鱼C论坛

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

猴子问题

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

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

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

x
大家好!. E: ]4 X0 A, s& u0 ?& o
这几天我在忙着编一个问题,我用了一种方法编出来!0 S6 O: _1 X* i' v7 I1 t; L
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!+ B- A$ y( n4 k: n4 x9 c$ D
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 4 [; ?8 k& V3 c3 U& f! m! t, r
  G3 |* _  t1 I0 W- W" s# I0 R

# M. `+ }) J" ^' W
                            题目& K- O; d/ M6 [2 m
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
7 [; q2 x) H' g" R: L. Q7 i7 h. ?2 S第一种方法:利用循环链表& x! D4 k" o6 E3 o: K- N
#include<stdio.h>
" O2 y. {1 C! Y! }: m) U- r; `6 {#include<malloc.h>
* I# ?1 W5 C7 M- i+ F9 A! g- {" b#define M 8            //共有8只猴子" B% |6 _) ^. d/ k5 c" ~: \
#define N 3            //数到3只时退出第三只
# O0 `. b3 |9 S& xtypedef struct monkey
' y. e8 m& k; W: ~4 D* I{int number;
: w6 ~9 ?9 W/ k, l  ~* r3 Lint flag;
5 C0 G" @% }4 d! J$ Gstruct monkey* next;
2 l( N+ O8 ^7 d3 R}MONKEY;
) m6 T+ R! U1 P; c2 {4 Mmain()
, O, R; l1 n0 i' [% `# |0 q{ MONKEY *head=NULL,*p,*s;
; X, J6 t  z& l% R6 j1 t" q  int i,sum=0,count=0;
7 P- D- e" P4 n% o- z  clrscr();              //清屏4 M9 |9 f& p7 n' I2 ~' w
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
& I7 x# }  w7 B! C  p->number=1;p->flag=1;/ \. R3 Q9 n9 W' g
  p->next=head;$ A& X( K7 u" x6 w. s+ N
  head=p;
  A+ z+ Z/ e; f2 j% q. m& `: V  for(i=2;i<=M;i++)2 ?1 G, f( p/ [& o  Z
    { s=(MONKEY *)malloc(sizeof(MONKEY));# o2 i7 s/ U$ L  F9 [% `3 H
     s->number=i;s->flag=1;
5 D9 \; Y+ ]' |; N     s->next=head;' j* S7 o, P! d- Z" @$ y2 @5 f6 S
     p->next=s;p=p->next;; p: e' ~8 T, V) ^) V* J8 W
    }. q4 z, ]: ^* r: ~  W% V- `
    p=head;
8 O( ]. C' I+ t   for(;;)
/ _' {. T' i" X3 a. w- M& o  R0 g6 W    {if(p->flag==1)
' k* G/ P0 x9 Z+ u: H/ c& e       count++;
. R/ S+ |% U( f4 C% T* N4 |$ J' }4 H7 W     if(count==N)* u5 H6 C- |) y& g7 w3 U
        {p->flag=0;
& P7 B3 T  c) Z8 V+ B& C, {- I         count=0;
1 `4 I! W% v/ u+ e! H( h; |         sum++;}
) M3 Z6 U( @) p) j     if(sum==M-1)/ f0 k" l* E0 C4 \3 }/ L
        break;
8 t! S, h, l8 b6 |0 m/ k1 R     p=p->next;) \% J+ T) V2 \8 P
    }
( w- T  {& r  A( |( k    p=2 E( s4 `0 y1 O9 C8 Z8 D* x
    head;0 ?8 ~2 B0 z6 F7 m+ z- P
    for(i=1;i<=M;i++)9 U% t. _- a4 k
    { if(p->flag==1)$ a, d6 e" L2 W: _/ y3 k* @$ m8 C, d
        printf("\t%d",p->number);
% z: N9 P/ n4 Y* X$ z6 T      p=p->next;
- m  C% z: m6 ]0 \  C: N+ h" {    }
1 U: Z$ u* d! E( ~2 m: r6 g7 }1 S) I7 j4 f5 H% W
2 j4 S1 ~( i/ ?2 @8 X- z1 Q9 Q$ y

# v  v: P6 k: Q% k8 P}

* I% I$ G5 C1 j9 {第二种方法:数组  d% I: ^! a2 ~) s
#include<stdio.h>
/ x9 x2 C/ X- @: K' W4 K5 o6 ^. h#define M 82 n1 h7 g9 |, d3 U
struct monkey+ O1 ^; P2 X, z8 e6 D- m, x" N
{int number;( c$ ]( v0 ^( k8 H, j. ~5 {1 R
int nextp;
# R  q# |! f2 i* E# @: E; I9 N* Z3 p) O}link[M+1];& Z3 F/ G1 c1 p' e! P
6 ~# w9 V9 O3 A4 c" J: w
void main(); |) v( w0 A; J% L; a) P
{int i,count,h;- q; ~  j1 b( @
for(i=1;i<=M;i++)# v5 k7 z- U8 ?' N" D8 t0 S5 P
{  if(i==M)$ l: Z' t! N, K  {) S- G
   link[i].nextp=1;
2 w9 J# v3 H8 L( {; X3 A   else: v6 p+ X4 o" a/ J! F9 K
   link[i].nextp=i+1;& }6 _& r: x$ t/ {) S! G! {- o8 Q
  link[i].number=i;( L; b, v7 H* _# z% D
}+ l, `! J' x/ o2 }  |5 T1 Y6 a/ k
printf("\n");
" A, B* H% ~  O2 g( o1 Qcount=0;" {/ W% u- G% Q7 T5 C7 W
h=M;
7 c2 `6 P# i% ^  yprintf("依次退出的猴子: \n");( i0 j# }/ v; C
while(count<M-1)
% Y- U& a3 m3 ]# Q{i=0;
/ L! {6 J% F3 _! E, Z. l# S/ Qwhile(i!=3)- X% W2 ~% t! s8 [! \
{ h=link[h].nextp;
9 q% @! Y, K' i. q3 d$ K   if(link[h].number)
! L- r0 E  Y" ]+ G     i++;}
* l7 N3 ?" r& U& L" c% }% V: |1 G0 V9 W, D1 S' S! b
printf("%4d",link[h].number);
: b8 g8 p1 A) v: r5 q4 jlink[h].number=0;
4 Z" a7 K9 w2 Y0 @* |% Ucount++;* K: Y; ]' G3 j: H, p2 H, v5 i
}, }, f8 B4 l' M/ C. d

! [* X1 i' x. B8 ?  A7 }printf("\n大王是:");4 A: c* o& j# H  g+ U) X7 l. n
  for(i=1;i<=M;i++)1 x4 w1 @6 z  B: O
  if(link[i].number)
4 {, _) X% L3 m" c: E# A' S. M    printf("%3d\n",link[i].number);
" z2 ]& b  q" M0 H1 R0 Y! O8 @4 ^* r/ j) t

& d: G/ W* P; I  M8 s}

# b% b8 {5 L6 ]! `- n* J9 B7 H第三种是普通方法for循环

# Z! {+ O+ ^- e) o9 H: ?/ G#include<stdio.h>
2 i2 \, G" R. Y# E2 T4 t2 {void main()2 M4 A, }6 S8 n4 m. g5 ]6 B+ q: \
{ int i,k,m,n,num[50],q,*p;2 O! `- O; ~: V4 h5 _9 L
    clrscr();1 K" w7 ]$ ]/ F1 d! c
   printf("input number of person: n=");+ [+ a6 h9 I3 G- z$ i3 l
    scanf("%d",&n);9 p4 Z; I7 [9 @7 `- H
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只0 h9 {) _6 Q- Z3 m0 T! }+ f0 u
    scanf("%d",&q);( D" H8 F$ L# y! ~3 E' m* A
   p=num;
1 U6 t5 z( ^7 e$ ~' ?  for(i=0;i<n;i++)/ Y* W. h+ ^! q- j
    *(p+i)=i+1;
+ B; K, g# ?# T0 p  g) T   i=0;$ M3 a2 v2 V; Y: Y
   k=0;
0 R% c  F3 X0 ~% a+ L   m=0;) n" `1 B, ~6 U" y
  while(m<n-1)6 _# ], s* K4 l% k% b2 \# G4 B
   {if(*(p+i)!=0) k++;
% S' B" [# s- H, f$ B     if(k==q), m  S1 O: O! c. G5 {
      { *(p+i)=0;
8 @4 b5 [3 o# q2 D+ G* Z0 U        k=0;
; O; ?+ b8 G& a0 U% P' G: d; J        m++;
/ @6 x/ L" |" x& J& Z1 L- P      }1 p, R" A7 \) m8 A- p( l0 Y
    i++;
) y. ]  d- o: e' T4 }& v, u3 Z    if(i==n)i=0;4 k) M$ X! r$ B; Z
   }
0 A  }1 m) Q2 C6 E/ C/ g0 y  while(*p==0)p++;7 t+ B( O5 [1 {( U( x, t9 y1 E/ i
    printf("The last one is NO:%d\n",*p);5 }" P! x8 Q4 v* |6 j  J- c! \
     getch();
1 m8 W* R& G% o/ `. E
5 ]3 O8 P) \. ]; [! A. `( Z}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;; l. L$ p* k0 U
namespace 又费马达又费电
# k- T( _  V9 O0 i) j! K5 X{
  D6 N/ l$ F* ^/ v. G) m, _    class Program
, w  n7 {( ?; y- b* a6 }& E    {- E, c4 M+ z1 h* q5 N" A" \
        static void Main(string[] args)
; k8 `: b' G. e! H        {. d3 q2 }( G4 k* O4 W+ b* v+ Z! U3 ]
            int m, n;0 O3 _" F( Y( `& |* x6 q
            Console.WriteLine("请输入数组长度");
+ A( k% O& M, j5 t            m = int.Parse(Console.ReadLine());//m为数组的大小& B5 b; Y# b+ }0 |4 V* {4 H
            Console.WriteLine("请输入要截取数字的大小");$ N: r# y5 e  z1 @7 ?7 ]
            n = int.Parse(Console.ReadLine());9 ?- h: `. I* }; N- l# p
            int [] numw=new int
( N; o4 u* T  }$ {1 F: R% B' Z+ e6 c+ m
&shy;&shy;&shy;;; X. j1 H* i5 U6 h+ ?% P+ U
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
+ b+ Z; c& V0 P  T            {
: v' i$ R$ f8 i* I+ d4 N6 C                numw[j - 1] = j;0 J6 E8 m9 O) r4 w$ B: A8 w0 f
            }  n. C2 V) D3 p
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!7 N! g( {" B( I. H
            while (d != m - 1)
& |7 b/ d5 V# M" H4 U9 W$ o* M            {# K( Y' y  t7 I% O1 c
                if (i == m && d != m - 1)
, ]. W2 u* B+ w- D' K& n/ o                {& c0 X* w6 x, o
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
& ]% e/ U: Y& Y/ I                    continue;
! A+ y5 J% S7 @3 d# z1 x2 v                }0 F: E* N6 K0 b9 G, Q
                else% v5 Y0 w. H9 A8 b
                {, W& l0 c; r- D$ U
                    if (numw[i] != 0)3 U/ e! w5 K, ^. r4 N
                    {
( F6 R2 e1 y% d, W: |5 L) k                        i++;
1 T) O* n2 y( n8 z. d                        k++;: C* q9 ?9 M5 G- x7 s; E
                        if (k == n)5 V. i" ^4 P* x* q
                        {
- D0 K- c% a) @" s. |                            numw[i - 1] = 0;//把在n位置数组元素的值改变了; \& }; v- J) x) G  E2 ]; q
                            k = 0;
; w7 T3 ~1 B% d* w              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
, q2 M/ c, M  N9 d                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);6 C& V- [2 g7 N' j- @; f
                        }
/ \: L# p+ O+ W                        else//输出暂时还没有改变数组元素的值8 a; U& U8 g' M/ r' Y4 K" \! c8 C
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
, w( Q  i2 J# }                    }
# [( U0 g0 J& ^& J# {                    else
7 p( z7 _0 L0 ^1 p0 q                        i++;//数组元素为0,直接跳过,不计数。。。
) h3 z1 X" m$ o$ G# j                }! n" ^2 T6 h) l1 X

* }) |$ w, G$ C( b
* @* ?- h$ }6 W  t2 e            }//结束while循环
' k6 b! P5 I9 u. l            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦) A& H' k9 z! X& C( E3 S( Z3 E# |& `3 J
           
* E4 H0 P* ?0 {+ F                if (numw[i] != 0)4 l& U$ C  i4 s0 |. T; p! f! l1 F
                    Console.WriteLine(numw[i]);3 d8 v. h3 \" g; O
           3 ]( |1 J* \! g/ w
            Console.ReadLine();
7 s7 V1 K# |# q2 Q3 t( X1 z- b        }
! L6 S2 d6 O# a4 J    }
: J& L/ F, |- |4 L}/ f, b" y3 d8 j! 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, 2026-6-11 14:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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