鱼C论坛

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

猴子问题

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

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

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

x
大家好!* ]2 Q9 ^% o- T
这几天我在忙着编一个问题,我用了一种方法编出来!7 A- k' w* h  f& A" X( [
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!( F. J$ b7 {5 F  {7 J
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
; x2 u, G% f& @. m2 Q4 a$ h* \$ O8 A3 w5 g& q$ `* {
8 V# Q- o# u8 ~5 ^! k
                            题目
, z( ^" @( t3 n3 d- q+ {& w山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
, ^1 h$ l. X5 n5 _! g5 N第一种方法:利用循环链表
9 h2 T+ l9 c. B3 q4 w8 Y#include<stdio.h>& B! q. }; T9 O0 u6 l0 M' \, P" A3 `
#include<malloc.h>! q8 s! K6 @8 \1 H4 |* d
#define M 8            //共有8只猴子2 d% u4 j3 q, ~! y
#define N 3            //数到3只时退出第三只: |7 A" A1 Z, G9 O
typedef struct monkey& h- Y, D( M: E. x- i
{int number;
& f& h. X1 _, J9 W  b/ Rint flag;
: |' C# G% p- ]5 }struct monkey* next;
4 S6 H) |& E: o, ?}MONKEY;
) y1 S; I5 |- @8 B2 _main()
  }5 c( I$ q2 y3 z7 d- i{ MONKEY *head=NULL,*p,*s;
8 e) f4 D7 l& }  int i,sum=0,count=0;4 n- ]' K* g! t! K
  clrscr();              //清屏
4 n5 a# L- F3 \8 j8 ^0 ~  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
& _. ]! f8 P) e  p->number=1;p->flag=1;2 t; F3 w+ {" D: G; x
  p->next=head;8 G% `4 P- z' c- f) S2 W- @
  head=p;+ b9 w# b  }5 ]7 z" i
  for(i=2;i<=M;i++)% q& B/ g  X9 T  A* w' c: K
    { s=(MONKEY *)malloc(sizeof(MONKEY));
) F" P4 U& d, A2 I# k     s->number=i;s->flag=1;7 q. @  r/ j5 [0 S2 p; f  g6 p4 G/ N
     s->next=head;
; ^8 W, g* c2 \* d- h6 ~     p->next=s;p=p->next;) \) u3 {- y; `* b- w
    }
3 b. ^1 D  A" T8 B5 E7 A# U& i    p=head;
: m2 d6 S4 g5 A/ w   for(;;)
! g6 \/ V* P0 `4 k5 ]( E% B    {if(p->flag==1)
! \: |8 H% h& S" D9 J; G/ D, ]       count++;7 e0 C3 r5 U3 G5 V" f* F4 r. Y
     if(count==N); B1 I5 Z9 f& m# z, ]
        {p->flag=0;1 j( o* G% Z" t1 J6 t) c* ?5 g5 e6 z
         count=0;% A$ `4 l! O; S7 F! r; O
         sum++;}
  G. b2 t+ X' ~" ]/ n/ \     if(sum==M-1)' ^6 J8 v8 |0 i& _; ~
        break;
- e3 A& C' V) o     p=p->next;4 w3 G9 R" O* q4 _0 j. A
    }: x5 M: f! E9 A2 Z% Q) b" A
    p=
" |' D. k/ g0 P9 ^. d6 k    head;
+ ?- m9 A9 I. e+ e7 U    for(i=1;i<=M;i++)2 J6 _7 `9 c$ `1 z* ^
    { if(p->flag==1)
- o( e' B) M* P- \/ e        printf("\t%d",p->number);
5 Y1 Y  c  B, g; P$ [  \      p=p->next;- c, B/ W1 C% }! A0 E6 t6 v
    }
6 }" X0 X+ z) F6 `% x$ C- a+ P1 v) `6 s7 {9 _
3 P9 o! ]- M. d1 N/ U! @7 ?

8 o4 ]5 D$ V, F: g, z+ B9 ~2 w4 U, w}
: j/ G- M+ D/ M: x- a% @5 b
第二种方法:数组+ G8 ^! z: y' F3 x: P1 R' h
#include<stdio.h>
% |% f; w) N6 h, v" u/ q5 T7 L" x0 s#define M 8
& P) W, E( Q( k" s3 i; Astruct monkey
0 [2 y9 I, n$ m6 b( g{int number;
, ?( ^& ?! I! ]/ u# _int nextp;
; H- A5 d. D) R6 p! M' b}link[M+1];1 L+ n, T3 Z; p2 @
6 I/ v3 L* G( ]1 g
void main(), G  q0 |$ |. m5 }7 c; f6 x7 r' `
{int i,count,h;
+ w" k% A) r) [. U0 u8 `for(i=1;i<=M;i++)) b& _# n7 @6 u3 v+ X& a: h
{  if(i==M)4 L$ o% J( C. D2 ~
   link[i].nextp=1;" |3 |  \, s" e9 }
   else7 [6 ]% ~  q" \% s7 {
   link[i].nextp=i+1;2 J5 M& p  y4 G. Z8 U! I
  link[i].number=i;
% O$ P6 l9 ~: N5 I3 R' w}  G% t, @9 P# w8 w
printf("\n");
1 {" G$ J) y3 Qcount=0;2 Z5 `# B( z$ L+ {0 s' ^4 D
h=M;
* _6 [, j, J, {2 B: D: Y- {& |  n+ Oprintf("依次退出的猴子: \n");2 Y( x# U# t8 j* J2 Q
while(count<M-1)3 @; @3 s' X* [& ~  D4 q# o
{i=0;
. B# Z* m. |# z% t# L2 z0 a( D# Uwhile(i!=3)
2 o" T7 C! Z# \' j7 l{ h=link[h].nextp;% e" E% ]  S9 W; l$ p$ K, U
   if(link[h].number)
$ _3 `# T( u1 |1 e! H     i++;}- z" \+ f3 Y2 I8 L! d: P9 J; [
9 d; s1 z8 g& E6 H
printf("%4d",link[h].number);% c2 [+ u9 _! s: h
link[h].number=0;' @. i; D# |9 g0 R) K3 @
count++;
6 W* ~: R$ d; p}
! @  n# S6 k: y3 e7 J; }$ q
/ u! }) e( u$ x" zprintf("\n大王是:");
( G0 R0 ?: K& m1 t$ S) e  for(i=1;i<=M;i++)
1 y! ^% a$ ~& R) |; J; p  if(link[i].number)# Y' t/ h% O- C3 J) s" |
    printf("%3d\n",link[i].number);# r- U% m# b4 A" T* X

; w# M" h) |: ^2 I" M: }/ S! K1 u$ x7 s4 i6 J0 X
}
. Z) j8 }7 i1 k! w
第三种是普通方法for循环

/ |2 n+ m  O3 v#include<stdio.h>) A4 P' W+ `5 l
void main()& t7 u- i: ?$ `2 O7 }3 w- |5 _
{ int i,k,m,n,num[50],q,*p;
' T! f; P( |  s. e) ^0 E- M    clrscr();
5 R3 F' ^$ v) @# a/ |, E   printf("input number of person: n=");
$ N8 J6 z' \5 Q& A  `5 e2 L# O5 z    scanf("%d",&n);
  l$ e' M% F+ {  s8 \  c  z% B5 |printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
' S7 M* K( o+ L  u    scanf("%d",&q);4 ]' K4 p/ t+ o, F$ i5 E
   p=num;
8 L* G. [' y6 s* K9 p  for(i=0;i<n;i++)
/ {1 x9 N* [  t- s% M$ B, g    *(p+i)=i+1;
* `8 ]; x8 y1 J+ p9 X9 x; V* z" V7 r   i=0;+ J8 I  n: A' g  g
   k=0;
5 y% L! d; D* Y   m=0;
8 h- o' ?  O. v+ X; _/ Z; h, g  while(m<n-1)9 A2 U, B" E9 Q  J
   {if(*(p+i)!=0) k++;
% _; y( U/ X: S     if(k==q)
: z# l  J" m! w$ Q4 {4 b      { *(p+i)=0;
- ~! |) h5 H7 O        k=0;
( C2 ?2 K+ Q# V5 Y+ F& q        m++;
8 v) ^; C* {- [6 {" Y" V( O; y      }7 h# s! o7 z7 ]
    i++;* U/ }& L6 n0 R' Q( P5 G( F
    if(i==n)i=0;
! q, Z; @! `* E* S3 T* s   }7 Q  I$ T  z5 J
  while(*p==0)p++;6 l6 O- F! ?' p
    printf("The last one is NO:%d\n",*p);
3 ]. T& [& a7 R5 H4 l  u! d: p+ r2 i     getch();
5 ?6 w7 P3 {/ y  V
+ G, q+ _4 t" ]% G/ d/ ?5 |}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
+ _# J$ I- P3 _& ^namespace 又费马达又费电
# M" m% z7 o3 v4 S6 T2 _{
$ U& F! B" c  w9 ~, ~" h! \    class Program) w; ]1 O4 }7 v. }
    {
2 w& m( s, C: t7 s; \3 ?( B        static void Main(string[] args)( l7 |+ }2 s# w3 c! \- J0 S
        {
. w  Y! _. y) v. U& l2 Y- L* |8 ^            int m, n;
% g7 D# d! F. C+ e+ P            Console.WriteLine("请输入数组长度");% B, ]5 R1 W2 C. a: M" V, @
            m = int.Parse(Console.ReadLine());//m为数组的大小
' b( U$ F. e; Q9 R  [" d* H) N            Console.WriteLine("请输入要截取数字的大小");2 K4 E0 k( B1 Z- y  F: N
            n = int.Parse(Console.ReadLine());
: j( v( ]0 C" w6 F            int [] numw=new int
9 V: c+ o# Z1 z/ F7 v1 B+ X6 u& \) b: S" `4 H5 u3 O5 r8 X# P" v
&shy;&shy;&shy;;- e- N1 E2 S1 ?( A7 G' f( W7 \9 n
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
9 m2 P" }* ]! }  S% p9 K            {. f6 j0 e2 |% Q6 J9 u
                numw[j - 1] = j;+ C* S- i  j0 e+ ?4 d9 x
            }) ?" B' V: z$ Z/ R
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!7 W+ {- M3 {8 e  w$ {5 Z" M0 C% H, D+ P
            while (d != m - 1). K* P' I9 j4 @% e" f! Q: a
            {
& o1 i4 f* n! l8 j9 N7 R7 B                if (i == m && d != m - 1)4 C: x& M( v6 M
                {9 @- k! Y, x6 Q& \; u# W' f
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!" m3 m7 b0 s# u8 D5 Y9 t
                    continue;
# ~4 p0 @6 O  S, c# J" N! t; q2 w2 `                }
' f  {) l5 F1 M5 [/ ~                else, Q+ C8 Q7 K8 H7 g
                {
* n' W( K  b: h4 ~8 r/ h& C* a- K                    if (numw[i] != 0)
3 [$ c0 s9 w) q4 _                    {
; x- M  ]4 u+ ]( X' s7 J+ x, M                        i++;$ @' ~& X% G' C5 M3 O
                        k++;1 J6 D  ]& B/ l. d) `! a8 p# y
                        if (k == n)
% g' V7 x) f" e- j                        {
1 p: K, `- ^% Q/ o- I, V/ X                            numw[i - 1] = 0;//把在n位置数组元素的值改变了' Y- r! y% q+ n4 D1 ?% A
                            k = 0;- t: g- T8 w! u/ F* v" p
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
* U) J( m8 R* b0 i                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);  f/ @" }: b' \" x7 w7 P
                        }
7 x$ h) e1 P" u8 ]& V) u                        else//输出暂时还没有改变数组元素的值
4 K+ G% N' g* M2 _5 M# Q( L6 i2 G4 L                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);0 e4 U$ \4 s8 R& R
                    }
$ A2 W$ [5 ]: S/ u8 |5 O* F8 w                    else
$ S9 _! x: g# o. B                        i++;//数组元素为0,直接跳过,不计数。。。. K; ^) a! G( V( t+ a/ R$ U
                }! k# Z7 D3 C0 k
# S3 |5 B  Y7 S7 G- _8 H
2 Y' Z% E1 p( K3 P) {2 }
            }//结束while循环
. B* ]  S4 {% |$ m4 g            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦: Y) F$ {0 L& y% j3 e3 T" Y
           
+ u( f. U) E9 v& N( I                if (numw[i] != 0), s. X3 r7 X3 p7 I
                    Console.WriteLine(numw[i]);
) ~) \* |- x5 q: i           
/ q- b; y/ s2 h! o5 u! ]            Console.ReadLine();
7 P: M/ O- I4 p7 h" e. d' Y: `- f        }- q" i0 r: ~3 ]# A+ w- ~+ [- E8 C4 g
    }' b- x, Z1 l/ v; Y$ R
}
9 i+ P; P! A" N) O3 F
小甲鱼最新课程 -> 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-2-11 02:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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