鱼C论坛

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

猴子问题

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

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

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

x
大家好!; s6 d  g/ x# {3 y+ L: Q
这几天我在忙着编一个问题,我用了一种方法编出来!
8 I. \% E# Z2 k+ v% R/ i6 j. c但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
4 F6 i: \4 J% V6 z; d! {/ {& P5 j+ w注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 1 D0 b7 o1 W, @7 i, z

  B! [8 x/ G' ]& c+ w- h! }! h: S+ W6 K$ s
                            题目8 ?3 `$ ?: o8 |3 S( ~  l
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
0 j9 N7 s6 [8 [8 c( C3 C! k第一种方法:利用循环链表+ s* e. z6 E* ^) w% s- \  I# C, u
#include<stdio.h>7 @: L+ G. s( j& a
#include<malloc.h>- x* N4 |% V/ ^% p1 k9 a
#define M 8            //共有8只猴子
; p$ a) I, ]2 Z) p; g2 L$ v4 w#define N 3            //数到3只时退出第三只
8 ?% S/ R5 v# t$ m& [typedef struct monkey
5 e2 J' L" Z2 [& y; v  M{int number;
, |# ^) ^: m& [/ X& d- tint flag;
0 g- g0 ^" e0 ^; F* N- t, xstruct monkey* next;6 o+ l4 c1 [. M( a6 k7 a
}MONKEY;
1 _' z* G) E7 e/ N! ?main()
  V5 t/ H2 [" f( B. G{ MONKEY *head=NULL,*p,*s;+ ~' T9 A, t: r5 s( K: e
  int i,sum=0,count=0;
3 j; N' J* J, v. A; b1 K  clrscr();              //清屏( A6 C- \6 c7 e; f" x6 E6 H1 Y
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
- l6 a: D: j- K; Z& }  p->number=1;p->flag=1;- z/ b1 X3 p& V8 z% h( h6 p
  p->next=head;
9 ]5 O% z& }* c7 g  head=p;
7 W) ]* T/ G% M  for(i=2;i<=M;i++)( b, h' B; X& N: p7 [
    { s=(MONKEY *)malloc(sizeof(MONKEY));
" s% c. M% V- X% W6 @( \+ e# p     s->number=i;s->flag=1;
: f; o2 C3 n+ C- C5 J1 i4 p     s->next=head;8 e, @. ~2 S; o" ^3 ^* s3 L
     p->next=s;p=p->next;
" Z5 h& o% Y4 p- {3 ^2 a8 j    }! E# L4 U+ ]. ?7 z0 \& f
    p=head;8 z# T) K+ G9 O- A
   for(;;)
$ t' x6 t1 @/ V    {if(p->flag==1)
/ f( G+ t' }. o* {# m' @       count++;
# x7 {& E, F' ?+ v     if(count==N)7 f, ^8 V& [4 i: D' a7 e/ D
        {p->flag=0;
! j* c- H4 H  {- T         count=0;3 w$ x0 i, M+ X: z& S
         sum++;}
5 Y! c$ b. r+ W2 U+ g) B     if(sum==M-1)
8 W1 f% Z8 M+ l; c        break;
- t% R% R+ n2 c( q, R7 o     p=p->next;; Z5 Y& u+ a4 L9 C( E0 X
    }8 W/ O# G9 W, N  Y: C9 r2 C
    p=
+ J3 p/ G" K1 T& z* ]    head;' W$ |$ y) V, O0 T9 v# G
    for(i=1;i<=M;i++): |* D0 j+ T9 H/ R$ ?/ e7 M
    { if(p->flag==1)
, o) j! y2 _: A        printf("\t%d",p->number);
# l9 J$ \0 u+ t' H: |$ U( |      p=p->next;; w9 r1 T( I+ ]9 B7 E# N2 o. e3 [
    }- g- f& \8 o0 ?7 o$ L
8 J; }5 W- B7 D8 [9 W* p
- n' L/ d3 K4 u& G

7 _( Z4 X1 L  S* m, u) S: I}

5 p& e' {$ ?$ d* k: e1 V第二种方法:数组) S( k0 x7 s% ?7 W
#include<stdio.h>
5 j5 f: S& F9 j4 J' S* Q# O8 @  ^#define M 8: T1 c3 X# R6 Y  m% n* M- d9 Q
struct monkey6 b" P2 R$ P0 B2 \( f7 }& k8 }
{int number;
. Z4 B$ n% c8 v# eint nextp;
# S! Q, N0 M, b* p* A}link[M+1];
) `  U2 h8 S; R! C* p; w6 w) q5 q/ H( R* p; N
void main()
6 D5 C$ D* m' @: p  Q: G  k{int i,count,h;
$ a. |6 I. K, ~6 N, lfor(i=1;i<=M;i++): c3 V) ^) D1 w  J6 X
{  if(i==M)' n  F) }, f( c# v5 l0 I0 S: ]
   link[i].nextp=1;% \. S4 o9 `# P' g
   else3 C, l9 r/ G  j6 {% z8 j
   link[i].nextp=i+1;6 ]8 n* r  l% i
  link[i].number=i;
) l; U+ i# G( f; P, r" U}' t6 p4 n; j: N
printf("\n");
1 x7 d3 K. \: c# S. E( ^count=0;
; q) Y3 l% `" t! kh=M;4 `# U+ b. r9 I5 h- t1 q& u" ~# G  P( W
printf("依次退出的猴子: \n");, L* J0 G; S2 s! C, J4 f5 o
while(count<M-1)* ^) i: p% I# s' ]: @
{i=0;" z6 B# `; j( T! a
while(i!=3)
/ O) f4 A  R* t" x2 Y' b# r* N2 h1 S# u{ h=link[h].nextp;
% Z% \" j4 \3 G2 c' B6 Z3 |8 K( x' @( U   if(link[h].number)' \3 \$ `6 p6 s. |
     i++;}
' H9 |9 a/ Y1 Q; C, A6 Y
6 d+ ]: J- n5 M, `; J  C. {4 \) hprintf("%4d",link[h].number);
& ?5 g$ |) \0 R( n" F1 Elink[h].number=0;. \7 x4 y. r) L  a- q
count++;
1 s2 \# C9 `  B5 B# S}
- \3 L& I* h6 Z
" G! @  a- j0 q: t- xprintf("\n大王是:");, Z( T* A% w) Y; k. B
  for(i=1;i<=M;i++)1 S+ s; a9 T/ ]7 m& t3 _' o" e! u7 j
  if(link[i].number)
, i) E1 Y; N3 E; {; M, d    printf("%3d\n",link[i].number);
, k; Q4 W4 @# c8 H3 E& g; k, ]$ q4 j- i% q# m
* g' ^. ]3 g3 W! q  j  |
}
# a4 M! j# r1 D% \% g1 {7 {$ D
第三种是普通方法for循环

! ]' g- I% r' K8 r/ ]; I; v#include<stdio.h>; \. f+ G  \( m8 m0 Z: z0 x8 @' ?
void main()
/ R+ |- O' U$ t3 y' k{ int i,k,m,n,num[50],q,*p;
: t1 j( v: o; z8 ^; I6 ]' i, U% L/ }; r    clrscr();& E9 n) V% \5 B& o' \
   printf("input number of person: n=");
% {1 p: G' n& F7 g1 d    scanf("%d",&n);$ n- B& I4 t( Q2 f' v, M
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只* @* [; l6 U& j
    scanf("%d",&q);; Q3 v2 c, q' D# z! h
   p=num;
5 g/ N, t4 z  c/ o/ @) M1 u+ Q  for(i=0;i<n;i++)
5 |3 {6 i, _4 U& o    *(p+i)=i+1;
/ Y$ q% z0 K) M, g4 o# N   i=0;
7 W+ h3 X! G; u. `* o" m$ N   k=0;
, t* X! @5 E' x8 Q& V9 Y   m=0;" W0 _1 a% s1 z
  while(m<n-1)
5 F: K. W& C0 V% J8 o   {if(*(p+i)!=0) k++;
, F+ I/ A7 u5 J, @9 J, \9 H, F     if(k==q)
, ^- o$ s- S$ o, O( P' h      { *(p+i)=0;
0 T+ s! Z: D+ K- ?2 g) ~        k=0;
, G% a: r* I) z! l6 L        m++;
9 V/ w' t8 c1 g" l# m      }
; ]) P: v7 }  l    i++;
) J" `6 t. B( ^; L- y  E; j    if(i==n)i=0;& ]' r3 h. S& l& v3 n; F" c8 K
   }
1 o% @3 J+ t) k5 ^! @' o+ U2 Q! g  while(*p==0)p++;( B# Z8 K) \3 |
    printf("The last one is NO:%d\n",*p);
& y6 U- W+ Y; i- @/ B4 O* e% K0 G" t     getch();8 J2 t$ P8 t+ N5 X7 g
# t0 R2 Y; K" n  r. r$ E6 g/ b% ^
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
; h5 K! }0 N9 Y- ^3 v! rnamespace 又费马达又费电& x6 z0 S& \: H& U+ ?0 G
{2 T" H' R) a" U/ s' j
    class Program
  ?: X5 r" R" I9 R9 a    {
1 _, V& g0 o( E2 B& x        static void Main(string[] args)
" [+ @( W1 C5 z$ B3 C: H0 Z- B2 V        {
; X& t. k4 i: E1 K9 m            int m, n;" o: v1 n/ ]2 ?# ]& a
            Console.WriteLine("请输入数组长度");
# f# s8 Q) F8 L% q, W' N            m = int.Parse(Console.ReadLine());//m为数组的大小4 c2 K3 |) [$ j; V2 a& c  a
            Console.WriteLine("请输入要截取数字的大小");2 y. R3 h7 a! @
            n = int.Parse(Console.ReadLine());- v- Y* M, W/ K8 ]! w
            int [] numw=new int
( J2 G; K/ ?2 u( x" B& [# w+ Q2 f3 ?, o0 a. }9 k+ O, Q
&shy;&shy;&shy;;6 e& u/ X' B; W0 Y# q! d! M
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数" a$ |  T/ G2 f8 {7 E8 ^
            {1 }8 f1 d* x. G% g: d" h: F0 @0 K
                numw[j - 1] = j;& `# C5 A! P  d4 [2 a( y
            }
$ b- W- f2 M1 ?  f            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!' t' u3 l, \) B8 K/ t( R
            while (d != m - 1)
( \5 r  i# l; y+ o7 f            {3 G7 |  |  {( U
                if (i == m && d != m - 1)6 ?, A4 l! K7 @% F- F( H  |
                {* m$ g1 D# \- U' N% x* Z( y* x5 K
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
/ B- {, h3 ^) B& j; F  e. U# d                    continue;6 `0 L7 G$ w3 ?! s: f% F6 @, ]
                }3 h; n4 }) y% M# S3 E  x. o
                else" i" y( z9 `9 S3 \  ^% F
                {! `0 c9 u& u, x* E: c
                    if (numw[i] != 0)
! [7 n8 O7 F: E/ F                    {$ I9 j. L! c8 N$ ~
                        i++;
6 k9 m6 C+ A; @7 S$ n                        k++;
& {, @0 j1 ^8 \" y. [. O1 z& p                        if (k == n)
8 M# O+ B4 R' ~5 I: ~                        {9 h, ?4 G7 o/ d! `9 I" P+ a
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了$ e; X8 ]6 i7 ?: N$ V$ q$ B+ V) n
                            k = 0;
- X6 L5 s9 K" R( m/ T! v) A, h              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小15 I/ }4 e: ~% G* ^
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);$ f9 U; c& J5 T3 E9 y5 {+ ]( V- A. b
                        }& q; h* w9 a  b9 @* O
                        else//输出暂时还没有改变数组元素的值
% u0 r7 S( }; t5 z3 Z: D9 t, D                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
, q: Z/ g. S9 J( u4 k6 C6 t- w" A                    }
% x# B: G" w. O1 d- B' W! E                    else& `/ u1 F) E2 M. E* e1 F7 k8 m
                        i++;//数组元素为0,直接跳过,不计数。。。" q0 C2 {0 H  F" k7 |) Z8 I
                }
" r; r' x) Q& C
" c4 U3 p: ^- u3 d9 K' p4 a
* ?8 @6 ~% R0 y/ [9 f+ U- x            }//结束while循环+ l6 E0 I, e" K) p. d
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦  F8 {* Q6 w- {) e
           
1 B, k1 |# y$ D" C0 n9 |$ W                if (numw[i] != 0)3 N* S8 F* B/ S5 b
                    Console.WriteLine(numw[i]);) _# ?/ j2 c: A; P$ D
           
! ^7 Q/ M! T. E5 x2 W+ Q3 h            Console.ReadLine();) D- G! ~5 V' q4 I  `
        }
9 y: c) c: P; Q    }
  g2 {* y! U! g}' j( }, y- P1 L7 f+ q4 S
小甲鱼最新课程 -> 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-3 12:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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