鱼C论坛

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

猴子问题

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

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

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

x
大家好!
/ T# P/ J' z  z+ r( ~这几天我在忙着编一个问题,我用了一种方法编出来!
2 `' F' A7 j4 ?  f# y1 [但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
2 N, S3 n7 a6 z: z注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
6 Y5 Z. a* C& X: ~* Q: R$ y
9 j0 K3 J. I! s5 N$ h
5 Q5 }! F. P0 [6 B% K* s9 {
                            题目
3 v' h  X# d! K" V% I) D山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
/ E/ }. S) l( |- x' U' {' @2 |. G第一种方法:利用循环链表" s1 S  }! B: _
#include<stdio.h>
% t! O% Y& `& J1 a$ O#include<malloc.h>+ t5 p) y5 ]: d5 H, P! _$ [$ @( e
#define M 8            //共有8只猴子
0 S0 p6 p7 @9 a8 b  a- \' t#define N 3            //数到3只时退出第三只; T4 f$ l4 E0 Z
typedef struct monkey, z7 t/ G+ O! G" h
{int number;
6 ]. ~3 r9 T1 L: Z& w( Sint flag;" m3 {1 ~! z9 ]9 ^1 d$ ~% M/ K
struct monkey* next;
& x/ s! O6 {6 u. n+ s2 T}MONKEY;
7 L) ^! T* u. k6 M* Wmain()6 x( T7 c8 ?) X5 Z8 }8 c
{ MONKEY *head=NULL,*p,*s;, k4 k4 o/ R. d2 E, ]  f5 w
  int i,sum=0,count=0;
( G( ]8 S* ^8 ~  clrscr();              //清屏
# s, ?: t0 j, i4 E- f" |4 a2 G. E- p) F  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存- c9 x% A  m* P0 [: S
  p->number=1;p->flag=1;
5 P! B. \* y& _  ~+ N  p->next=head;
5 ]4 P0 r5 o+ z. x6 P4 v  head=p;
8 g6 @/ ?0 Y8 G  for(i=2;i<=M;i++); O" Q" L) i6 R- z+ z
    { s=(MONKEY *)malloc(sizeof(MONKEY));
9 a* e( l# K- R2 Z- t4 Y  p1 r  |     s->number=i;s->flag=1;8 P! p: o! x6 J3 v( d* P# q/ i
     s->next=head;
' S4 z" z/ |& ]; w     p->next=s;p=p->next;
" Z2 D& f& w- Y/ N: s, a7 b6 I2 ?    }5 l  t5 y! c* d  f1 A
    p=head;1 c' Q& r6 T0 |7 u
   for(;;)' i, P5 O0 w2 e
    {if(p->flag==1)& o/ ~# e5 E# l9 F
       count++;  y( v& X3 i8 F. R- r, F) h% B2 S; ^
     if(count==N)
& `, g) e( Z9 L        {p->flag=0;( W# d: I4 F: w% J& l$ x$ f
         count=0;: ~. q, v8 l% a7 J/ X
         sum++;}% k8 J+ x# }3 U4 \: X
     if(sum==M-1)
( S. }0 U: T) P3 @2 E% Y2 I        break;. K# q7 I& d9 k5 z- c$ Q6 ?# T/ a0 z
     p=p->next;
2 I' q2 D0 F/ h; y' G( h    }
: s: _" m& ~9 p7 B    p=- g& J1 U9 S# z, Y. O% x# ^
    head;
8 H& X* E2 z2 o( J+ ]; L    for(i=1;i<=M;i++)  O# U! U- Z5 Z; O" D: ]/ y# t
    { if(p->flag==1)
* \7 O$ i5 f" F4 C$ {        printf("\t%d",p->number);4 \5 l) {- k& C) a# B' K; {2 I# ^1 {
      p=p->next;
6 [- ^3 P. e5 b# T2 \    }
/ z/ c+ B- t7 `7 K& D9 {( C! V" s8 p% k7 _0 L4 V# P. X+ }( b

- @5 {- g; q4 v% J/ U- j0 i% t
  {* n  q, |2 A" D, }/ P1 f* e}
8 _! u* D3 x1 N- p( V, `' a
第二种方法:数组
5 ^6 M& ]/ F: `; h#include<stdio.h>4 Q! t& `4 b4 c) X
#define M 87 f: ^5 b" @9 n# X9 J/ _. j7 x
struct monkey5 f; A. T9 T# o9 f( h! G
{int number;& ^* ?5 @+ l% I% W8 ^
int nextp;
7 K7 U2 v: G" K& c+ M4 h4 b- z  q}link[M+1];# Z& L2 K1 O5 {6 u

9 h: w. G$ h+ b/ {/ y, k4 i- Q6 Y2 l; Yvoid main()3 e5 E% x& }& X; E# R
{int i,count,h;5 Z0 v' v. |- Q9 @- z
for(i=1;i<=M;i++)
" ~2 T( Z5 a7 F+ L+ S{  if(i==M)
$ x, G' b) W- R. ?2 P   link[i].nextp=1;
  R/ D+ H3 C9 \   else3 F% d2 A, g* \9 S* _3 ^
   link[i].nextp=i+1;* X: K" L% m, ~/ Q- b) y6 t
  link[i].number=i;; E; {! e% o" J1 t
}! A7 r  W9 D: A$ ~" J1 J* b
printf("\n");
+ [. u$ K1 o, gcount=0;! e* ]& C: H& h2 \( \8 k0 S
h=M;
" |- p( _& j) W* e: o6 Tprintf("依次退出的猴子: \n");
2 [5 ^, _2 e2 _0 O" v6 cwhile(count<M-1)
' p( i' C- A% O& U- N{i=0;/ ?0 l' g! {5 Y$ y+ o* E$ C* U
while(i!=3)& a% x. e  ^& _3 `1 ?3 P' _
{ h=link[h].nextp;. F& ]7 M# i8 Q
   if(link[h].number)* V8 d. Y' |, O6 s$ e4 p
     i++;}
% x* n$ [% F0 \/ Y* g9 P* s+ P$ Y+ u1 A4 C; ?
printf("%4d",link[h].number);4 ^! S6 S2 q9 ~; r/ ~
link[h].number=0;, P5 E( m- n* \/ N
count++;
2 |) T7 l0 m" @- }3 }}
1 b; Z+ f( N2 ^7 S3 p+ A3 U3 t/ e; {
printf("\n大王是:");2 U; x7 O, f$ s- n
  for(i=1;i<=M;i++)% O7 o+ r2 H$ b- L+ G: Q' z
  if(link[i].number)
. R/ O4 W  Z* j    printf("%3d\n",link[i].number);
' c  j( b/ ]: e2 r; d5 j5 g$ ]: t# K% G) g1 m

9 U8 ~4 U1 C; U5 w) P}
/ I. T" R) z8 q
第三种是普通方法for循环
" e9 J" t  J  x, }
#include<stdio.h>
( E/ s- }% ^) O& q4 u* M' E' ivoid main()
+ {  h8 y$ b! f8 h# ~  c{ int i,k,m,n,num[50],q,*p;4 E2 y1 f- n# d0 d. {/ @# c
    clrscr();
; B: H1 C! E* |8 K( P! A1 V8 X   printf("input number of person: n=");
0 d! H7 C8 S0 J# _) E( F" M3 b    scanf("%d",&n);
/ I0 h2 U" O( `" v6 U2 b/ e; i4 J  Iprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
& F# J8 G6 s" U& x/ ], w    scanf("%d",&q);
. [, B6 N! }# C3 H   p=num;$ F1 Q) K. o+ M) A5 m7 R/ R4 `
  for(i=0;i<n;i++)
) d! \6 M& ^5 D# @    *(p+i)=i+1;
$ y" F# I0 E( D5 a( z9 k: E$ q) v   i=0;
7 o2 ]2 X5 A& J9 y7 o3 X* a   k=0;( r! @- F, c4 F) }* A- F; B
   m=0;0 y# C9 R. w0 ?5 U( ^
  while(m<n-1)
' }  m( k, N: y6 k8 |5 F0 i   {if(*(p+i)!=0) k++;) c- J/ Z' k5 J# \( i
     if(k==q)
1 l, [9 }# Z/ o) H& o) d+ v; R) M3 m      { *(p+i)=0;; T3 V& N' v% Z  m
        k=0;+ |( f& s7 a3 `+ m! n0 r
        m++;8 i. l$ _+ D  K3 o7 U
      }
8 c# f+ T5 C: x- ?6 k8 e/ c    i++;3 [- d: c5 Z$ N4 R5 X
    if(i==n)i=0;
3 C0 P0 O) p0 T   }
! B1 y( ^$ h/ {! L3 S9 |  while(*p==0)p++;7 q' n3 E/ @( L, Q+ V3 d( G
    printf("The last one is NO:%d\n",*p);) ^! y- [6 }9 h) S, g7 w: q
     getch();
1 ?# k$ E: v. Q- s5 c) y6 l5 d+ m, b" |5 Y
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;- G" t3 [1 V0 ~1 x
namespace 又费马达又费电
7 L: s4 x, e! \6 z{
7 f! f" E) ^0 @* P4 |/ M4 j' G    class Program1 P7 C7 y" _: e& ?" S
    {& Q' I% x. M4 v# s  Q# _/ g
        static void Main(string[] args)  O5 B& a9 z, w: g, U  E" Q8 O5 B
        {
& a7 a. }& k& }+ U( O            int m, n;4 H% V0 e  [) h
            Console.WriteLine("请输入数组长度");
+ e: E  D. d" n* ]$ |. g7 X            m = int.Parse(Console.ReadLine());//m为数组的大小5 c, V; E+ N2 _* k. i
            Console.WriteLine("请输入要截取数字的大小");6 K1 `+ D% C* d! ^
            n = int.Parse(Console.ReadLine());6 |3 m3 W. C5 t1 F) B
            int [] numw=new int
$ X. M4 c" H8 u9 B! }* v5 ^+ N3 ?0 w1 A6 z; Z: D' d
&shy;&shy;&shy;;
# [$ b9 i" n; F5 G            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数( Z$ x* d  `2 r4 N: `
            {% A: L* Z0 O0 F
                numw[j - 1] = j;* y0 h9 n. _5 s" a% q0 Z: q
            }; W! [' e) s, A* L9 {
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!8 B6 _+ b7 V" J% S* r
            while (d != m - 1)% o$ d; |8 B3 O- H' X0 ]
            {$ z7 p- H& I  E3 I7 f$ {
                if (i == m && d != m - 1)# D2 B5 m4 A9 k* w+ w2 i" @  c
                {
$ y$ ~* C4 ^' W& w/ T6 O                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
% B. R  {& ]$ P- k                    continue;
6 F/ d% B0 {! m9 p1 o0 ~8 ?                }1 q# f$ u/ s9 k7 }
                else
( H9 g8 ^- i& f$ Q8 r8 H2 @4 E                {' V5 l. B3 T5 G0 P  `" V! `/ Q
                    if (numw[i] != 0)
5 C, ^" {6 \+ q- @; a                    {
, Y8 d  J: x3 d5 e% r; d$ F                        i++;( I: Y; j, i7 p! X: x
                        k++;
1 E, _3 a" z" c- N: x2 T; ~                        if (k == n)
& z4 P" `5 s0 x2 W                        {
7 m! \. d- X5 t; ^3 o, e8 H) I* f                            numw[i - 1] = 0;//把在n位置数组元素的值改变了6 d0 K2 L( r9 }2 t* e. J1 V
                            k = 0;
2 ~5 W# l9 p+ q              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
0 H% K. Z8 J3 ^4 I$ R6 ]$ _5 l                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
) [1 e  E. k# B- O! w                        }5 R6 e  D6 f  G2 z+ l! M! a; t; L) v$ W" Q
                        else//输出暂时还没有改变数组元素的值
8 F, j% {  h3 l7 A) s                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);: M- ^  U# R+ h5 ?; u9 u
                    }3 |# A3 K9 U8 R0 j. B
                    else
# V- v6 F% r' j; E/ j                        i++;//数组元素为0,直接跳过,不计数。。。
  ]# i) V& F" @" g! L- N4 K, H                }
& T/ a% J+ }% c2 k" n
( y8 @2 h; y1 b% G5 @% Z& q* R3 R" ~5 |/ k' l3 I/ j* l
            }//结束while循环
( L, k2 }5 |1 n$ T$ @. g, r  j            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
4 f+ O) H" F: i0 Y           
! S* n1 R+ V" Z: W, H% m: Z, v                if (numw[i] != 0)
+ v$ b# {/ u, M- N& t                    Console.WriteLine(numw[i]);$ u" D$ [; c/ i7 |( |8 e
           ( G2 W9 V+ i5 k( K- z
            Console.ReadLine();
5 W- ?0 H' w! x7 a0 T        }
: `* D6 A' ?( l0 Q! D    }8 y  u7 S- @1 U3 n. y
}
6 Q( L0 |: {. P! B. D! n
小甲鱼最新课程 -> 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-24 04:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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