鱼C论坛

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

猴子问题

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

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

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

x
大家好!+ z5 [; X- G* s/ |
这几天我在忙着编一个问题,我用了一种方法编出来!1 S) m4 |4 L3 F! |: m+ M8 T  S
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!+ S+ t- l8 K- W( e; i
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 0 i6 \7 w$ I/ ~' R* U
% r) Z4 _; f9 b4 i* ]8 ]! u

, B: |* V. \% Q7 Q6 P
                            题目
: k. N# P# X. V2 E/ @, ^/ O$ r6 v山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。1 h! t1 K& P, M, G( y4 w
第一种方法:利用循环链表
9 w/ R8 Q7 ]6 T0 h#include<stdio.h>; @$ k- b; J3 e: ^
#include<malloc.h>( @: Y. ~/ T4 M5 v) \
#define M 8            //共有8只猴子
; P5 X6 z: k( c6 M) i( c" O0 o) S2 k#define N 3            //数到3只时退出第三只
) n: q; [( E3 w1 g- s  A' Ktypedef struct monkey6 x% Q6 R1 [' Q/ g. t
{int number;2 f+ D& @) T% X) E- c3 x8 a
int flag;2 Z8 w; F- V, o* N2 Q2 z% J
struct monkey* next;& e, g. o4 k  H8 T; w: T
}MONKEY;% e2 C5 Q" b) k. X8 m4 N
main()) K! k8 B( k+ U, b# h9 N) A' O
{ MONKEY *head=NULL,*p,*s;- E$ B7 x$ {4 K; {8 P1 S) U
  int i,sum=0,count=0;
& P6 C2 b! u6 x1 J5 x  clrscr();              //清屏7 A0 k5 G/ y; H8 i1 X2 n( k
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
$ N$ T$ ?; _8 x+ d7 N3 \6 _  p->number=1;p->flag=1;
3 g4 Y- p7 I' Q  p->next=head;! R4 T% n, z3 s- e1 i1 o
  head=p;. _$ J# [- q7 _+ K8 m% k0 l4 w% X
  for(i=2;i<=M;i++)
! s0 o; Q: Q" w: S/ U) I    { s=(MONKEY *)malloc(sizeof(MONKEY));
. q# n" t0 i7 ^) I2 i     s->number=i;s->flag=1;4 y  v) e$ ~' t2 V1 x
     s->next=head;6 H' H9 R1 G3 ~( N* r4 V, w9 h
     p->next=s;p=p->next;+ F* k6 h0 F6 n6 F! E
    }5 T% Q# `0 @; Z2 q* @8 |8 y
    p=head;* l3 E! c6 ^) ^, x- W9 l, k, S
   for(;;), b8 H. f2 D, Q- b. H( h
    {if(p->flag==1)
2 E+ x5 z3 K7 K) ~5 ^7 D       count++;5 P) ?% C& a6 v- p( m
     if(count==N)
, T  r5 c9 p( h$ E        {p->flag=0;
. B3 h3 A0 T! ~- I  j         count=0;1 s% f0 [% S% l( B5 i3 \* w
         sum++;}
  ?% }; k) t. ~4 I+ f     if(sum==M-1)4 X7 P8 Z0 e# N! T2 s- Y- d. a
        break;. O1 [  D7 H, v. @% c) }
     p=p->next;/ X# C$ \$ _0 Y& c0 @
    }
2 X) l; k8 p' s, Z5 C    p=
8 H# Q% |9 Q4 x0 J    head;
- ~) E* X* m0 K    for(i=1;i<=M;i++)
4 G+ J# Y8 ]: [    { if(p->flag==1)
% r6 @; H7 E( L1 ?        printf("\t%d",p->number);
) t5 I. N, k; b' s      p=p->next;
- r1 N0 S% j5 @$ b. J( S  _    }$ S0 ^, y: g, g1 {2 x0 V

: e( f" _7 `" y/ o5 Z$ p7 F0 c" R# x# x
% C/ }" h7 N5 N; r$ N9 g7 s( M
}
  l' }1 N  r9 ^0 z2 ^& n
第二种方法:数组
0 Z2 P6 \9 F, o; Y#include<stdio.h>
. ^" U6 a. e6 {, Y1 t' R4 c#define M 8
1 t% _" Y3 O# t2 n9 Rstruct monkey7 N" [7 S. I8 f" e. C
{int number;
  W6 S" e, Z+ Y3 F3 |int nextp;. N$ v- B& y$ b
}link[M+1];
$ e; I& F! `! F1 O3 k8 c/ c& Z* d# ~/ u$ @, j( L& |/ I' ?
void main()  @- _! g; O" D- V8 D
{int i,count,h;' h' b4 Z! p/ \+ @
for(i=1;i<=M;i++)
/ S, v2 N- c" ~6 p{  if(i==M)$ t) p) \7 C9 V. o& s: @
   link[i].nextp=1;4 Z4 X; \5 C) n7 f! A. _
   else
3 D* A! S/ k7 w$ J, @   link[i].nextp=i+1;9 U- O2 K2 |1 w5 ]9 b
  link[i].number=i;+ }1 g7 Y& V2 n0 z+ u, ^
}
! _6 [, o3 z7 o' Eprintf("\n");
6 [" ~" k+ r5 B7 M  x! I3 ]count=0;" p0 {3 D6 J( _. z& u/ Z3 h8 |2 T
h=M;
: K2 Y5 M; R" r8 l4 c  kprintf("依次退出的猴子: \n");7 L0 E% P! @" b. U" j
while(count<M-1)
' x8 f3 T+ }' o- l+ t2 `4 P4 W{i=0;
1 N% W  j  d- G0 [0 ]# B. }# Vwhile(i!=3)
( x" \4 O5 n) @3 }1 r/ i7 x8 ?{ h=link[h].nextp;  x7 Q; N3 y  W
   if(link[h].number)& x" H, u2 J% q. p
     i++;}7 W& Z* U( M8 f' `1 I
4 y/ V) n5 `: W0 g" i1 V" F1 S
printf("%4d",link[h].number);
! K1 w9 I7 d4 Clink[h].number=0;7 F+ F' q: d7 q0 w& {
count++;
6 P3 {4 Z( c* \' |  Q7 k* i}
' m1 D6 [, H) A# n( r3 S7 E6 ~( \' V
printf("\n大王是:");3 b. f" ?/ w  }) O( @# c; n
  for(i=1;i<=M;i++)
9 e* t6 v) L- F* G3 ?% p' A  if(link[i].number)+ V! y  O7 a; `( P# U' S
    printf("%3d\n",link[i].number);+ Q: s, @. V* j! j

1 }1 R# H* |, G6 a9 d! w3 f, X, T" J+ W. c, L# H
}

- q  [0 O- u5 @; y& D5 @( z8 B5 w" g第三种是普通方法for循环

, k, y6 N  [& T#include<stdio.h>
; l. H1 Q3 J/ p) L; b9 Ivoid main(): w; b( j2 Y7 c; L& W/ Q8 W
{ int i,k,m,n,num[50],q,*p;
  r% F0 a+ L. z1 |) ^4 w    clrscr();
! A& K- h. J/ e1 t! q   printf("input number of person: n=");1 g. j5 E+ o: k; f, q4 s
    scanf("%d",&n);! _& S2 X/ n8 h
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
' N4 b' J# P$ z. R& l    scanf("%d",&q);
: a9 \) X0 b5 Y& j& o! S' x  r   p=num;
* v( i* w: O! Y5 _9 f% d: Y  for(i=0;i<n;i++)
- o8 o$ j+ ~8 {, P/ t    *(p+i)=i+1;7 n& t$ ]7 }9 `; p; x
   i=0;9 k# @0 P$ G3 G+ j+ q; R2 L! O
   k=0;
) t' v0 I! ~' K   m=0;7 Q/ @/ q  R1 H' _* O
  while(m<n-1)
: R" T+ ^' u9 g* ?0 N5 H, g4 r   {if(*(p+i)!=0) k++;& r- Z; ~& ?, V3 _; y9 V' l% Q
     if(k==q); J& V' i6 _7 d$ g
      { *(p+i)=0;
" ]6 k) u/ |+ |6 ^) L: C3 R  J        k=0;
% y, l. T5 w: O( }/ u, W: |6 E- h        m++;  v( B  j& `+ z1 e, X
      }
, F& _! i2 H9 O    i++;( L0 b! K* m$ ^" n* \) ^
    if(i==n)i=0;3 f* l: p/ S, k: X: R! X2 e0 }
   }# m( R$ S2 Q0 ?
  while(*p==0)p++;/ M) M4 I7 `; R, c; S
    printf("The last one is NO:%d\n",*p);" D' a% @# G( j5 \5 x* w! q7 s
     getch();
1 ?5 E1 c/ i4 b8 G( Z* b! g1 {& g7 `. \! R) e: @! J( j( r
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
; D) m7 x: b0 Z/ w3 D1 knamespace 又费马达又费电
9 M6 N8 x9 S% n# |, U' f{
% z3 [( k/ Q5 T, N$ v9 y, P    class Program2 M: d( \4 ?0 t
    {
5 ?1 h5 A7 R) L; d. O& Y9 o        static void Main(string[] args)4 p4 E7 l$ {/ ]. X4 c
        {/ \2 G1 r& h0 H, u9 Y9 t; T
            int m, n;7 ?0 b! [. I$ t% F2 D' k
            Console.WriteLine("请输入数组长度");( F  Y. U+ p: q7 G
            m = int.Parse(Console.ReadLine());//m为数组的大小
" R5 H' N6 O4 |4 P7 U, {1 d- Z            Console.WriteLine("请输入要截取数字的大小");
: x! v4 N, M2 i  R% O: D% ^            n = int.Parse(Console.ReadLine());" _, k5 A% g& r7 m. R
            int [] numw=new int
+ e$ s' f5 c# v* P: J! }9 Z! g$ z: Q: S% o; j6 Z+ p' n) K
&shy;&shy;&shy;;
8 B& M8 T3 d/ U( j2 g            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
; U, `! P0 [" X1 L& t! T! T5 {7 i            {
" p7 M' i0 q, z0 j7 h" S                numw[j - 1] = j;2 o" \; U2 c9 B* I! N
            }* F" P1 ?" }. F6 t! c
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!" e1 B! I6 Q6 w* x+ z
            while (d != m - 1)
1 ?8 Z1 y7 D9 t            {
& y; r4 O0 _& f3 q$ i                if (i == m && d != m - 1)% J6 @' S" M' B, M$ E% B" y. n$ _' y
                {  ^5 S+ ?- U! i4 ], K" ?3 w
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!2 r1 \, R6 {# Z0 L
                    continue;8 o6 U, ]  s: z9 U7 {
                }
) @6 L, P# E/ A                else6 w6 Q- D" o4 Z% {$ |) _& t
                {
  A4 H: I" a' A# y; Y: y                    if (numw[i] != 0)7 h, D) H4 R, V7 K7 W# K# B  g  J" D
                    {
/ T4 @, l% k3 K; c. d. }/ a9 b                        i++;
6 X* q, m3 L2 i  {2 w: i% q) l! g1 p1 N1 t                        k++;3 F3 a# a* R4 T: \2 r; F
                        if (k == n)/ O/ M; R+ s, a. D3 E( }
                        {8 S4 l) y6 ?8 m, c
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
( H: g% C; k9 n1 I1 I: [! g                            k = 0;( F5 p$ Z/ ~4 s9 H) }
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小11 p3 I9 Z( x6 S1 T
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);3 B7 [, _# s- ^! t1 D6 |7 j. g9 Q8 I
                        }
+ Q8 k* y3 R( W, f, }                        else//输出暂时还没有改变数组元素的值
$ s) b" G: f; U                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);9 `" y. f6 m% L2 \
                    }# N0 Y! L- U2 b# ]* L7 K6 \
                    else
2 K: @$ ?/ S) V7 Q* t1 Z                        i++;//数组元素为0,直接跳过,不计数。。。* k" p5 k8 M( o0 S" t4 r! y
                }4 p  {  p( `3 Q/ ^4 H8 F! d  i+ H

3 m, `, M8 {( }/ D! U: _; i6 \" r  L0 H3 i  b  N/ K9 X0 Z9 O
            }//结束while循环/ ~: W) Q/ j! b) R7 t+ j
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦" T8 [3 Z/ `8 k5 r
           7 n# P6 z' _4 Y$ y
                if (numw[i] != 0)
2 F; f; ^4 x9 u1 A. M                    Console.WriteLine(numw[i]);
' g, G+ x: F& R) W           & i7 k- D& t+ m; G. F! A
            Console.ReadLine();
5 ~: N7 H& C# m. ?        }/ y% @/ g. i. s
    }
" @  R6 I9 N' M" |}* L1 e9 I' t; }" t! C: C+ d
小甲鱼最新课程 -> 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-6 05:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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