鱼C论坛

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

猴子问题

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

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

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

x
大家好!
2 E- x9 o2 i+ P1 h6 e5 R这几天我在忙着编一个问题,我用了一种方法编出来!* w. L7 ~/ g9 b4 C4 V5 A9 K
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!" U) {  G2 S7 L& k: W
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
) M1 C7 Y7 H* o3 F# d6 n- p. ?) \. i' f+ V5 }
4 o$ g2 P* Y+ M  G
                            题目/ f/ ?/ j* c7 F7 A( x5 {
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。8 C5 ^* p8 a2 z
第一种方法:利用循环链表
- g* T  g6 `/ z% _#include<stdio.h>  y! a; n7 a* v
#include<malloc.h>8 V/ G$ D8 W0 l
#define M 8            //共有8只猴子
- R1 g1 g/ }# b$ Q$ h) w4 v#define N 3            //数到3只时退出第三只
4 h; B, @; q* mtypedef struct monkey
3 L. a, [% F9 f$ n! S6 \" M{int number;/ _' i9 m7 c" |  m
int flag;. F( M. G& m+ n' j, X
struct monkey* next;
1 F  T2 n+ T: k}MONKEY;
! Q" l# Y$ y# \) ~main()
# c" s/ s. U  Y" R{ MONKEY *head=NULL,*p,*s;# L, Q4 e# A3 T* N4 n! \" c( N% e% V
  int i,sum=0,count=0;
  ]8 M! h1 p( `8 F: [  clrscr();              //清屏
; R2 C  U' P$ o9 r  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
8 x1 e. I: [1 }! p8 _( l  x% V  p->number=1;p->flag=1;
3 e' u3 W0 K9 c- @& h% ~  p->next=head;7 M: V& P; i; o  p' Y$ W
  head=p;8 n; Y8 n/ T+ r" B5 X
  for(i=2;i<=M;i++)
) S" h9 N. }$ `! L8 }    { s=(MONKEY *)malloc(sizeof(MONKEY));+ i2 F# n2 G8 L- _
     s->number=i;s->flag=1;
+ N8 g8 h) m: V' x( ^- b5 M  S9 Y# F     s->next=head;( g3 H5 R7 {) R. ~5 P0 t* T
     p->next=s;p=p->next;& a" P! [  e. K; ~/ D: Z, z
    }
* Z) `, |2 h- c0 m/ A3 q    p=head;
7 Z7 A" ~" ]8 ^& \   for(;;)$ Q% c- u/ l' R- {
    {if(p->flag==1)
+ ]& ^# ?7 u& O; w1 Z* d! }  A6 L       count++;( Q$ h: D& v" ?
     if(count==N)
6 h% O6 O6 _7 W( D' i" e' k        {p->flag=0;. E& t, x3 r% |# l4 r7 C+ m
         count=0;' n0 ?9 S, V. a, j( F
         sum++;}+ A- l& t- g/ R( h! M
     if(sum==M-1)
6 @9 ?4 P6 p6 s. h/ h        break;  M, g6 w% {; @& H: `- }. D; p0 d$ M
     p=p->next;/ j# |% w4 h; O$ X
    }
7 A0 }( }3 g1 \* M9 N! l  V    p=
& n% p+ a5 @, C4 _    head;
- j8 k' u5 @; P( J    for(i=1;i<=M;i++)2 L5 `5 `! Q6 C9 A  J
    { if(p->flag==1)
, @9 J" p/ N7 l' h' s" B" r- N2 q        printf("\t%d",p->number);/ g* s4 M0 z  V" c; k$ `
      p=p->next;
- b5 o% a& X2 K- l5 G& c    }
- S6 N1 ?9 F. t8 [' a$ z) s+ F
  b7 `- v9 A  u4 S8 {
* {' B) B5 A/ O0 \6 p5 m5 h7 q+ x/ Z9 h2 L0 @# G9 N2 }5 T' K
}
) y# w0 O4 [; a0 ]: D5 l9 \$ Z
第二种方法:数组
+ s8 V) |7 j. L- V& Q7 r#include<stdio.h>
9 m1 n. [- `- m5 @$ |0 v' R0 O#define M 8
) h9 w5 M0 ^" t$ z- C/ f: @struct monkey, G# |5 G6 I9 K& ?, T6 j( G
{int number;& g. e% f$ g0 F0 y6 o
int nextp;% k+ _3 K1 e$ o2 C
}link[M+1];
7 H* T1 A2 T' p* ?3 w+ A+ N4 k5 T* ~: F+ ?# ^8 `6 k2 E  l' n
void main()
! a% ^5 D. I! U  t{int i,count,h;
3 S6 r) s: s0 rfor(i=1;i<=M;i++)
8 S' D* O7 K, {" y3 @) A{  if(i==M)
/ G, T, {1 E5 [; V0 H* |5 P   link[i].nextp=1;5 h7 W+ K: L  r0 E4 D! A
   else( S. s. d+ N' l* ^% P# ]7 m
   link[i].nextp=i+1;5 `5 |0 N- @; ~1 U" G4 ^6 D
  link[i].number=i;
0 z9 H) F4 q9 K/ T4 N& S; U% j}0 O' `* j5 ], W2 k3 u6 T
printf("\n");7 Q+ {7 z/ l6 L( _4 }
count=0;. b% m' a# _2 D9 Y! S0 a
h=M;
" W* Z9 z. N' [( R7 qprintf("依次退出的猴子: \n");& v; Z7 ]1 q" a( `5 L7 c, z
while(count<M-1)
( m/ V" b/ d# j( y5 y6 Z; b{i=0;
: B+ r& P1 [, T+ F$ M; d, B8 lwhile(i!=3)$ a/ U4 S8 a, i, g/ A3 H8 F
{ h=link[h].nextp;1 U1 d& @$ a0 }$ L
   if(link[h].number): k0 ^* h3 Y) h5 d$ m6 a$ e
     i++;}
6 T8 }( M5 F4 d$ G
& p5 a5 R) m! O# o, H7 qprintf("%4d",link[h].number);. o# H+ \( m* @# T
link[h].number=0;
2 w4 K6 b# Y/ u) f1 v' T& lcount++;4 x2 L+ D7 I* r1 S. Z
}: R* r. ]. z6 p. X

0 ~$ T2 U0 a- Eprintf("\n大王是:");
1 W: B7 i! ?( r- Y1 |! D! `. k  for(i=1;i<=M;i++). A* u$ ^/ E6 C; i- Z# r$ S* u
  if(link[i].number)
0 B/ j- l! M7 y: @    printf("%3d\n",link[i].number);
; ?" S) h; ], d1 d; t/ y/ w9 H# p, f7 P
: d, T. h( P$ }1 j( M. M
}

3 \4 w6 B* t5 M" E第三种是普通方法for循环
: ]) V5 A! M" }% O  @. Y4 z/ r
#include<stdio.h>
$ s  y5 v- P, i& T* P5 Evoid main()
/ B( p( m( f; c; ~7 g{ int i,k,m,n,num[50],q,*p;( @1 b) a4 Q. v2 ]! L$ I
    clrscr();
# h  ~" M7 e# w   printf("input number of person: n=");4 G# C( D+ @% S) C% A
    scanf("%d",&n);9 Y% F# ?, \# x& M; w; j
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只8 a, \! ^) F& g( {! M: d( C
    scanf("%d",&q);9 z5 l9 d6 T& E6 ^  x1 X
   p=num;
8 Y: P( K' j' v  I6 }% f  for(i=0;i<n;i++)
0 A/ h2 Y. {7 [    *(p+i)=i+1;
" X' K2 h3 s! f3 r% M   i=0;4 T1 K- b. y4 `( p
   k=0;, b' K% y5 X3 n) T' U  _
   m=0;
. B% w* \7 i; \+ [3 p$ O$ c  while(m<n-1)3 r0 v# j: a+ Y8 L" `& T
   {if(*(p+i)!=0) k++;% p, X: k3 Z4 z9 W) Z2 R/ I
     if(k==q)
) ?2 L" d3 A& `0 C0 u. e; w      { *(p+i)=0;8 O0 _* W9 o+ A3 Q" `
        k=0;
2 S- G6 W% l! B  Z        m++;$ p  @- y# b# m% \" d
      }5 N& P/ g7 m) O' }
    i++;1 X6 s( g5 h. L0 t8 m5 ~7 v& h
    if(i==n)i=0;
  P! @' P3 v1 V, V( l0 n   }
* H+ I$ p- o$ U) Q; T" Q  while(*p==0)p++;
; I1 q; _& H9 d9 |5 t    printf("The last one is NO:%d\n",*p);( p) X& H- B5 q. j& Z$ m9 F8 o
     getch();
# {- m3 h5 p  y4 @3 o3 n9 Z  M9 I6 k/ B% ~4 Z6 }
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;* W- z, {; L$ W
namespace 又费马达又费电3 j* E: G4 q. e/ n. ?9 O6 L
{
6 E  _1 P9 Z) B, G& K, C4 h  w0 l/ ]    class Program8 B( O' G$ [2 C2 p0 y: o
    {
7 k! Y4 O- R7 f' J5 v0 e% g        static void Main(string[] args)
+ S/ S  p% X' m5 n' Q( P# L9 S        {' ^" q! b9 A% G( a+ p
            int m, n;2 l8 J3 n- S; D4 \* `. u
            Console.WriteLine("请输入数组长度");6 `  s! m, ?8 f
            m = int.Parse(Console.ReadLine());//m为数组的大小& D8 R8 f1 J+ P8 F0 S' t0 R
            Console.WriteLine("请输入要截取数字的大小");9 H& R) f0 Q" u  r. q- O9 C7 {7 y
            n = int.Parse(Console.ReadLine());; J& S( E2 Z' w: x$ ?! F  f
            int [] numw=new int1 T; m7 O" Z" x2 x( d0 K7 l8 s* H
) b) ?$ o9 I. D" j0 D( J9 q7 x
&shy;&shy;&shy;;
' u- z5 y( n( J1 Q/ L( U            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数% u6 f- s3 @  z% m' ^
            {  o8 p+ U+ E' a! K; g* w4 z; B" P
                numw[j - 1] = j;
4 G+ @8 _+ ^1 y3 B. B2 j' q            }
3 R8 [# w- t7 j: a- W            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!8 }  W  w2 u4 ~
            while (d != m - 1)
0 ^6 Y- w( t) C            {8 F- p6 W0 `' H. y
                if (i == m && d != m - 1)
' H; J/ J  P- I                {
; V0 n" Y7 l! ]. t: _; Q8 c. h, i                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!: T2 W+ j2 o. S, L( l  F" ^9 R
                    continue;# n' x6 Q+ r% Z4 V. _- f( b
                }
- d0 F" g/ a1 P                else
" w/ X0 C$ B) O6 H                {+ h, a' @) A% y+ m5 e4 R
                    if (numw[i] != 0)( O8 p( T, j, k/ |
                    {
) {+ k9 A# [9 P; |. F$ _                        i++;" v/ M6 @! B  g  s2 M1 s) A9 U: G
                        k++;
/ N/ O& C& c6 X7 n# T                        if (k == n)
- r0 G: W1 J7 M# O+ F$ J                        {
9 h3 {: H9 i- B* k- y                            numw[i - 1] = 0;//把在n位置数组元素的值改变了! O7 l( ?; V/ l; w7 s9 f% ~
                            k = 0;
  f7 x( ]* z( b6 j2 {              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
0 ?+ g  D) c2 j) w                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);+ R. O% }% a8 `& M" D: o, ]: Y
                        }
* w: S; V! P3 k% u7 B; \( E& I                        else//输出暂时还没有改变数组元素的值
5 M% m5 ]) B* z  q5 }' H                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);4 x) ~- ~& W. a3 U) t% \" o
                    }7 {+ z3 u: u1 E( Y
                    else
2 y0 I# Z0 ]/ c' y4 U                        i++;//数组元素为0,直接跳过,不计数。。。2 q, Q) h" L* x0 n  N
                }9 c1 Q$ g" ?; u9 {. U9 b; q3 G) |% f

7 W! y7 v5 ]  n
4 n( l7 W0 R" _" b/ `4 s5 E  _            }//结束while循环
% N( w% c7 W  P' s            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
% f/ N4 y5 x1 ], T           
" Y4 }% }3 C' T( n: h0 `                if (numw[i] != 0)
3 j: a9 X; o3 Y1 U. W; b                    Console.WriteLine(numw[i]);
  V4 W7 u! K1 m' q7 ]+ n& N9 S) v           
+ K; A. W; u9 y: c+ ~/ {/ G  N            Console.ReadLine();7 ?5 _2 ?7 }5 \% e$ b: k0 l
        }: K  X, J4 Q4 P6 M- V# Z+ a
    }$ g2 b% v" i* }9 u$ V
}
2 V2 E. z$ I; u* l3 p+ G0 ~! C
小甲鱼最新课程 -> 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-4-24 09:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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