鱼C论坛

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

猴子问题

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

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

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

x
大家好!
4 W. @* ^5 }( u7 z4 ]2 r这几天我在忙着编一个问题,我用了一种方法编出来!
& c1 }, K" H3 L4 d6 J但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!6 _. E% P+ ?% [1 o
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ) m/ }# S# n' |$ @5 L

' V0 M+ g6 g6 U( D7 E, ~' C
9 L( z7 B' B/ _8 m7 a, }  B8 t+ A( T
                            题目/ }8 {. [# m: E5 d  x6 j+ D
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。0 K7 ?  {  Y' J7 w- ]0 M- y0 u
第一种方法:利用循环链表" n5 r1 ~: {3 Z! o7 b6 P8 ^
#include<stdio.h>% p. ?) W& e/ G3 N. o" J  _) M
#include<malloc.h>, q1 t/ @1 M# t8 \1 |6 _
#define M 8            //共有8只猴子) ^1 Z+ h: W  _$ O0 S( G
#define N 3            //数到3只时退出第三只) E, d0 y8 n& @/ t9 [' R- v, E' }( k! B
typedef struct monkey
9 S2 d; k" e+ n# }! K: M1 N{int number;
  a, H6 Z0 d' \% }) ]3 @- Bint flag;! e) R' {" l0 n9 f+ _
struct monkey* next;
9 `- \% ~$ b  Q/ K7 {& k0 M! r5 I}MONKEY;9 I' q0 }" c0 E, Z& u9 n
main()
- B" j9 C9 g( v. b7 z! T4 O{ MONKEY *head=NULL,*p,*s;
  \2 R$ y/ d% }4 Z' g  int i,sum=0,count=0;* m. h6 x# x0 |; Z7 G( R/ y) A
  clrscr();              //清屏
2 i* l( O8 S2 ]& L* o  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
' O# R: b- Z0 w! |4 G: R( d( ~  p->number=1;p->flag=1;0 s2 f9 M6 O* b" Q7 I7 \3 q, v
  p->next=head;
0 G! O" C: J+ D2 `% b9 @5 |  head=p;
5 |4 e: G) Z6 L  for(i=2;i<=M;i++)
8 B3 A2 \' Z( c3 @) F+ {    { s=(MONKEY *)malloc(sizeof(MONKEY));
" F( v  @% m+ M     s->number=i;s->flag=1;
/ l0 H* i0 k- T8 Z6 g     s->next=head;
- [) K! J* D& v$ R2 r% x     p->next=s;p=p->next;, f: T/ j8 X9 ^( V8 Q8 G* _; p
    }! g. ]. i& @# [* n3 ?+ c# N
    p=head;5 }" V* N" e3 u, n. Z
   for(;;)6 f& a$ X4 a, ^
    {if(p->flag==1)# w" G+ o# d( R) _
       count++;
3 J: k, [& s5 F7 S( e1 J     if(count==N)
6 u6 u& R* F! m' t8 m/ r        {p->flag=0;
( p# h3 M! Q1 [) h- L! z' [" P) j0 @         count=0;
4 e! R; J) i0 Y* z1 }9 Z( F         sum++;}
3 [# ]3 X( Y# q" ^3 ?+ a4 w     if(sum==M-1)
% R3 q( J, ^8 y! O  N% ^        break;
; H: I  a5 J$ |6 Q' [/ k$ i& w     p=p->next;
/ q/ y8 u" o% N4 _( i    }/ l7 o" Y! K- O1 c% ~2 v  B9 A
    p=' D4 S7 p6 Z6 H  c2 X% {/ R2 a
    head;& k$ m8 Q* |9 G4 I- C- s0 ?$ P3 |
    for(i=1;i<=M;i++)0 F: o$ q0 ]/ f1 u0 w
    { if(p->flag==1)0 \& r9 \2 m: a; w# M. I/ D& V
        printf("\t%d",p->number);
% l5 Z) o- m8 O9 J* H9 H      p=p->next;
" L8 x1 p( Y9 S/ U) J+ k    }2 _+ Q$ C! R$ |4 C2 f

& b1 ?  ~0 b# }) ^! O, _: f5 T, _0 U4 v1 |1 ]5 \

7 Q+ a4 P6 U1 D$ V* O6 C! g- u}
* ~8 ^: N; n% z) n$ f) w
第二种方法:数组
8 K% y( Q- K5 b# J4 g3 F#include<stdio.h>
" d9 L/ x2 F' O; b  o  U#define M 8+ N- ]! F8 @5 M" z& ~% R  r
struct monkey2 e' z5 C2 g' a+ n
{int number;
9 M* R" ?5 E6 K( X1 pint nextp;( s2 ?) U: b: T$ ^' \' L+ @
}link[M+1];( C9 z# t% s! m7 Z5 D

3 t9 J2 ]7 z8 J% ^void main()
" v- f# s, b- b5 f- P* F{int i,count,h;
8 ]  W6 p2 H5 j: T8 w! z5 N9 afor(i=1;i<=M;i++)
4 b' Q- Z( K0 d{  if(i==M)* _6 W$ Q1 ^2 U* ]- G! s8 `
   link[i].nextp=1;4 @/ |- ?5 c/ [
   else: N9 {: N0 ?; A5 i8 w
   link[i].nextp=i+1;& S4 n' u, X4 g: V3 B. p8 Y
  link[i].number=i;" R4 H) t* f' Y4 W& j6 G! I
}
+ F3 k+ X: {, U$ T) wprintf("\n");
2 N' S$ k# O+ {! K4 V$ Z$ Y7 gcount=0;1 X1 k4 H  e& t) o. P# N+ D
h=M;
, |# w& K+ f! B6 mprintf("依次退出的猴子: \n");
5 H! x# X3 P8 T2 Zwhile(count<M-1)
5 G+ x. Y! \' q( W. J# [{i=0;0 l( f7 n* A* a( d4 Z
while(i!=3)& J! o$ @% I" V
{ h=link[h].nextp;
7 }. E9 I' M6 R   if(link[h].number)% N7 H% Y+ p) K7 L  Y7 T
     i++;}* }9 F, O" T. _2 c- i" N( Z
1 i( U0 _5 N$ }1 h9 Z
printf("%4d",link[h].number);
) y* w: V9 F4 j' F! |link[h].number=0;/ @$ u6 Z+ k2 a  o) f
count++;
9 ?  r* \9 B/ V" n8 k, @& a. A5 j}
0 v5 ]' `3 n) b5 ]" N( m& a( D. \: ^. |( d0 {5 |% O* N
printf("\n大王是:");" J+ h" t) M7 V+ F: c
  for(i=1;i<=M;i++)
3 `# r; D* o( v6 B/ V  if(link[i].number)
, _( l! I. c# y7 F& P3 W$ W4 K    printf("%3d\n",link[i].number);8 D9 [! H7 W3 Q9 V5 ?/ a- j

  E0 C2 @- h6 Q* F7 ?) {7 A/ T. K- ?) J; t
}

0 g- `1 G+ ~2 b2 r, B& i第三种是普通方法for循环
2 _* X6 c5 v" Z7 [' D
#include<stdio.h>2 A( M1 Y; ]8 P: _, c3 m( q
void main()
  M' H! U) z. d5 J& m" Q$ J{ int i,k,m,n,num[50],q,*p;& W' m5 p. j9 I0 F
    clrscr();
5 R" t' M5 {, d   printf("input number of person: n=");
3 W) Y4 ?" Z2 l4 r3 M    scanf("%d",&n);' l& L; c! W( Y/ v! k# O
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
) A. ]4 }5 u2 [9 Y    scanf("%d",&q);
9 M& e/ F+ j# R$ F, B   p=num;
/ u* J/ E: \- E" K3 w  for(i=0;i<n;i++); s9 ~: f) G! X2 R9 t
    *(p+i)=i+1;/ t2 A1 ?& K9 e$ _
   i=0;
2 W  b. h/ Y/ G/ y% r0 I+ V   k=0;
* A) h! e! r" Z& P3 P9 {   m=0;
3 {  D# S' M- Q7 [  while(m<n-1)9 L: I# o* |7 X0 m
   {if(*(p+i)!=0) k++;1 S2 W, r$ X. A9 p' V
     if(k==q)4 m, X% N* q3 `% A) t
      { *(p+i)=0;
; `+ s& _: C( m; U! [$ P$ Q& q! l        k=0;& @# s+ f) [1 F4 L9 T: i- M/ _
        m++;
5 d5 R9 Q* K1 g' a0 E% V$ m' U) J      }! |: w! A/ B1 T, V1 H/ `
    i++;2 }0 [; P. z. ]/ D
    if(i==n)i=0;$ i. R& V( s# s
   }
' H+ B$ Z5 @* i. V  g" T  while(*p==0)p++;
+ q$ V! t& |4 ^    printf("The last one is NO:%d\n",*p);
/ d$ F# P% {+ }# Y0 ^; w9 N     getch();) T& C/ W& r+ a/ a
: e9 g' g8 ^: S# ]. T3 F# Y. l$ U
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
* l; w/ f4 c2 I1 Fnamespace 又费马达又费电
3 C& F# t5 v5 J! o* u{
- N- i& W9 p- \8 c2 ?$ I    class Program5 Q' _: j/ Q' K8 p4 D
    {% ^6 V: s: `4 S9 [- p8 Y9 {( B4 v2 T
        static void Main(string[] args)
3 q! N; Y2 {+ _: f& I$ B        {
! r; V1 H0 O, L1 ^  i1 n            int m, n;0 M, J: k2 r8 n* u
            Console.WriteLine("请输入数组长度");3 A( c# q- O( {6 O8 k% _
            m = int.Parse(Console.ReadLine());//m为数组的大小
, P( Q# A+ I8 [            Console.WriteLine("请输入要截取数字的大小");
8 r$ {; e5 ?5 R' z            n = int.Parse(Console.ReadLine());
5 ?% ^. U( O! m5 u; O            int [] numw=new int  m- J9 p- T6 s* D$ e. U) H

" B5 y* k, _9 Z! B) ?7 p&shy;&shy;&shy;;9 V6 ~5 ]7 z7 [& x
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数2 ?' I/ |' c* L* p, E0 J) U- S2 ]) n
            {" {7 @2 ?+ C6 M1 C3 d$ s- B0 }9 ^
                numw[j - 1] = j;8 E0 n8 w" i3 r, y9 S" I
            }, T+ X- ?. d2 k6 Z1 m" ]  ?$ N
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!4 _; Q; c4 R! H3 x4 _. n1 p
            while (d != m - 1)5 t4 z$ ]6 M7 z
            {, S+ O1 V* j0 E8 j. b6 r! |- j
                if (i == m && d != m - 1)- z3 a8 T/ u' p
                {  A* y& Y0 a$ b6 {6 ]2 o
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
( f; M" i  _5 ^% i7 X: L) [                    continue;: v; d2 y* _" m  a4 [6 [- c3 ]  I
                }' u: Z$ H) k* I( o. ?* V
                else
4 `; X6 S: ?# d                {
2 ?" G0 f  |+ h5 L. f. y                    if (numw[i] != 0)
- ~7 U2 D$ w2 U2 p5 r, @                    {$ j. g4 n# M! M2 `5 _% d
                        i++;! m& H. \4 |; n7 K* X% _7 b. U
                        k++;
: _! L( H8 R3 i                        if (k == n)/ F" P5 \/ \) h0 N. W7 v9 V- H
                        {
2 y( u. T" z6 [6 O0 Z2 E- x, W. R                            numw[i - 1] = 0;//把在n位置数组元素的值改变了; J" T- m& X6 D7 V3 L% ]5 A4 e
                            k = 0;
9 i5 y5 d/ h3 g              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
3 p7 C  S  ^( Z6 @' |# w                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);3 f& C3 i$ \- C: O9 q: D5 D
                        }
+ [; M8 t+ |4 J6 N6 I' i! L, y                        else//输出暂时还没有改变数组元素的值6 c0 K$ Y5 q; o  ^* p) k
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
$ u" e/ x  C: K1 f, I                    }5 |/ Q: o: P- `) P: r* v6 L
                    else
) L# }( ^( F$ ~$ T) J                        i++;//数组元素为0,直接跳过,不计数。。。* t4 A2 I" f3 T4 P
                }
9 V9 r+ O  T0 p8 R5 E' K
7 D' Z! D! X  A9 k8 ]( \: f2 s" K# G. s
            }//结束while循环
7 w( \) K$ E: X& q/ Q! t; o/ b            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦/ H3 g6 r, u% p. f) w; `, C
           & N' F/ |: r2 S' l! ]
                if (numw[i] != 0)
# g. v7 j- j+ B8 ~0 o, X                    Console.WriteLine(numw[i]);
" E/ _. W# T2 J4 d2 Q           
6 H) d( ]5 n4 S4 v" R. G            Console.ReadLine();
* E: m! p" C* L4 T5 C3 a        }
0 G$ z/ V8 g6 _. G    }
( f2 x. A9 d; Q# U/ U$ m}2 y0 L  e+ u5 S. Z6 s2 j6 p
小甲鱼最新课程 -> 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-5-30 02:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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