鱼C论坛

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

猴子问题

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

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

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

x
大家好!
+ Q: y$ f" X6 P$ G这几天我在忙着编一个问题,我用了一种方法编出来!- b' d. R+ r6 v5 n3 m3 Z
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
* O: [5 [$ J- c- X% y6 p) G注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
) z6 Y% c& ^1 z6 Z: p. k/ c8 ~! O% ?3 I* \8 T" G6 A8 a
  Y7 z2 o& T% T2 B: I* n- W- j# u3 ^
                            题目
( d( M1 [' F, b4 [山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。# r+ E/ x0 _) r$ h; D" }
第一种方法:利用循环链表1 m, Z6 s% ?3 T2 D. ]
#include<stdio.h>( Q5 L+ a$ [7 M' F& ?
#include<malloc.h>4 m, U- s; B7 U- Z3 u( V/ A
#define M 8            //共有8只猴子# `9 a! Z1 Q3 E0 u  o
#define N 3            //数到3只时退出第三只
7 r& o5 G" H1 O7 R' Ltypedef struct monkey
0 ^' t4 o8 w* k: m{int number;
& m  W1 _; C! D% d; r! @1 Fint flag;* X( i: O  H: {- K$ A4 ~9 d' z
struct monkey* next;# U3 G9 h% q: W3 E0 Y: e, _
}MONKEY;9 I3 w2 E3 A, m& l$ B
main()0 O; o; q5 ?/ @( O' a
{ MONKEY *head=NULL,*p,*s;5 B: C1 h3 I* F8 j; S9 p
  int i,sum=0,count=0;
8 v0 R" U9 a1 d$ ~. S- t, M! D1 q  clrscr();              //清屏* [" f% p: u" `9 I) M
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存9 X) U1 M0 @' Y$ o- s( q" j
  p->number=1;p->flag=1;: d  u" A3 e+ }
  p->next=head;
8 d) v' k: D0 b4 _/ k- [  head=p;; h' L/ J6 e0 f6 @1 T1 b
  for(i=2;i<=M;i++). q0 i! s  B$ Q  g: t* f
    { s=(MONKEY *)malloc(sizeof(MONKEY));% T) K0 y9 K4 O
     s->number=i;s->flag=1;# T4 r- e: I) {
     s->next=head;
7 Y. @  @5 L( P+ A; i( y" y- c$ n     p->next=s;p=p->next;4 V, ~# a$ Z( b' s2 U
    }
5 U. R' v. x6 m+ P' z    p=head;
' D& u0 |1 n7 u+ |" G   for(;;)
% |3 p) O6 p! Q# r    {if(p->flag==1); _: s$ w4 X) [/ {
       count++;
" y+ C+ {' j+ G9 M7 z     if(count==N)7 B1 `+ i3 k/ J; P5 c
        {p->flag=0;4 T" l2 x2 \8 x# ]. k: ~
         count=0;
9 |# E" e6 V, W/ C( [. b/ Y         sum++;}, M: c, w$ ?* ?9 S% w
     if(sum==M-1)6 O" I' @9 T7 [/ v
        break;$ `# j( ~; S- `) l
     p=p->next;
! \4 |+ e! F. I  x: m    }& `8 k$ {6 n9 j* U; m) c7 \/ Q$ ]
    p=1 ~5 r; y; b' g  ~
    head;( O$ Y- }* @% w( V0 s
    for(i=1;i<=M;i++)' L: N1 y0 m4 [) O, U
    { if(p->flag==1)
) N& ^' k1 c8 }* c+ T- S        printf("\t%d",p->number);
8 D& z# O3 t7 T7 }1 H7 u! @      p=p->next;& u" Z1 R% v8 q- N. t# _
    }
- O* J6 p/ l, j  Y$ o
4 n$ y' J  w( g& O4 s
$ R) E. Y- }; q; \4 F$ f0 H& i/ v5 X" x* Q1 J) J
}
, D6 [8 l. N2 k8 z  t3 I& }1 i
第二种方法:数组0 ^) |% y3 b; Q/ u4 D9 }
#include<stdio.h>
" g/ o% L. L! T' c3 X8 j+ @, g#define M 82 q2 Z( {) o: m. Q; {4 C& D/ K: g
struct monkey2 L5 z. e* B+ y" p* ?3 G
{int number;
, Y& U; x: n8 {3 i5 N" G3 M) Cint nextp;
- b% w, ?. X9 f% W# ]}link[M+1];
2 N* ]3 N, K6 I7 o" `4 ?3 M- G1 T# |! c( X9 ?* ?  u
void main()! S5 n4 ?8 g, o) F! S5 N% v
{int i,count,h;
' B5 g  j/ j7 |( S/ f( \* Xfor(i=1;i<=M;i++)' P/ _+ G0 Y- n! O9 |' n# ]
{  if(i==M)
7 L  E  c' A6 t- A   link[i].nextp=1;4 W% L& R! Y+ H  E! j: o; j
   else8 c% x2 I6 A7 y8 a
   link[i].nextp=i+1;3 M8 J, ~( S# S6 A; U, K9 l- o
  link[i].number=i;# j7 N( s# |/ W- u0 s( ~4 Z# a5 F
}
& x6 A+ |+ L, G/ @$ hprintf("\n");
$ T5 V* b2 Y3 H5 j$ gcount=0;
; R' g, {! `! N& a7 \0 z6 jh=M;; W  N4 Q! w# q# X. D
printf("依次退出的猴子: \n");- f) y9 ]. L" Z8 N6 ]$ L  t
while(count<M-1)
1 [/ v! F# j4 V# E6 k6 W) J{i=0;! V, O- l; z5 d4 c- S% f4 e" M
while(i!=3): E, f* \& Q( q  g
{ h=link[h].nextp;
# K' w) `  J+ A9 F. V( {5 l2 `   if(link[h].number)
3 s6 R6 Y  `9 a) T5 A     i++;}+ M) U9 A* f- y; F
4 w; ~. X8 Y7 j% ?
printf("%4d",link[h].number);' L9 x; u0 D/ ?) `, J4 o
link[h].number=0;
' T/ N( t# [$ M6 M4 Z  Pcount++;
$ t$ f" }; T( }" W1 R/ ]- Y4 }* B/ i}+ y) t% E& {! }' I" h4 \# e5 X

7 S/ b. Q6 k2 r* \- P+ H4 X8 xprintf("\n大王是:");
3 ~2 [8 E% L( Z- J- H  for(i=1;i<=M;i++)4 |' Q  \9 y7 V' f" D" U
  if(link[i].number)
2 a% _/ r9 m( I) T  t2 C    printf("%3d\n",link[i].number);, ]' W# f$ K) x/ B0 }, h
+ G# k' U2 c8 q: h7 \5 K( x

% `3 `7 m- P) `: s3 }7 `}

) @3 n  H2 E. t9 Q第三种是普通方法for循环

2 Y  y9 [( B/ i4 R#include<stdio.h>
0 c: o7 x; T* V' v0 r% Vvoid main()
& ]9 Z6 b: v, B  c! a{ int i,k,m,n,num[50],q,*p;
; @  V6 e7 [) {7 J* u* K2 c    clrscr();4 Q9 W# e2 q, H' Y9 J3 a
   printf("input number of person: n=");
3 V: g4 T/ l: z$ L1 y  D    scanf("%d",&n);
. k& F" l! m7 ^) a5 z1 qprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
4 F( v. g/ `" B- i- g    scanf("%d",&q);
; a# B5 @4 U3 \, o   p=num;9 U: a, S9 x4 O0 ?
  for(i=0;i<n;i++)1 S( E- e. ^7 i9 x/ H
    *(p+i)=i+1;! k/ r! O0 k; n! F8 ]3 ~' g) R
   i=0;
1 T5 r/ ^  n4 A2 ^# q- R1 }   k=0;
" Y; q  v/ l& ]7 ^9 D   m=0;  W) l5 m! c" Z- i) O
  while(m<n-1)3 H/ |; }/ G, U6 U
   {if(*(p+i)!=0) k++;0 a# p9 _8 ]8 n: G6 |3 l" V  I
     if(k==q)
' p. q# N. D* V# i" a0 g6 c      { *(p+i)=0;# C% t$ s$ R  F/ Y' C# y( D7 e
        k=0;& {' _9 I$ Z1 M. O! A
        m++;
0 n/ o, Z- Q) {8 i      }
4 q; L  P: K$ N) z- C1 y    i++;' H" z5 H# D: y" B6 y3 o
    if(i==n)i=0;9 J# f- L) ]  v& \6 p  D
   }9 Z1 E7 T/ H+ k2 G
  while(*p==0)p++;
3 v' c7 ]+ j2 c7 l    printf("The last one is NO:%d\n",*p);
! N1 |! ?1 _# K9 F) J     getch();
5 e' y2 M% g, I" X+ z6 S& a+ L3 R$ |. R( ]) Q4 d
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;; z/ ~+ ?5 O' j0 J& w
namespace 又费马达又费电
, k% D) t5 y  i7 R& K( X' n{
3 H0 t6 S2 i/ m3 y    class Program1 i0 L8 N6 k5 V- E' C) M* E  ?
    {
* R; c6 n/ T1 m1 [+ @) U: @( ^        static void Main(string[] args)& z3 x" B/ X2 s. _' T- Q0 g: Q" [3 E$ o: T; E
        {3 a0 A4 n4 ~. p6 t% P; c6 d( ^
            int m, n;
+ {+ G* ?4 {3 c: V            Console.WriteLine("请输入数组长度");
5 l4 F' _7 z* _6 J2 T3 J& c            m = int.Parse(Console.ReadLine());//m为数组的大小8 X6 _. }. q4 x' |. Y. L
            Console.WriteLine("请输入要截取数字的大小");6 q: x6 D" o; c7 ?- I4 l- ]' W
            n = int.Parse(Console.ReadLine());
. n$ {3 t8 ^2 U' b# J2 b9 `            int [] numw=new int  r  g) u. J% X# W
6 O2 Q: {- |8 E+ }
&shy;&shy;&shy;;
/ G8 c5 [7 h5 Q% O9 O5 m' S            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数$ ]# O' M: j( E* a. X
            {
& x7 h2 n( l2 c$ d9 X8 S9 ?+ v                numw[j - 1] = j;  I" f9 ?. z6 X8 M2 M
            }
% k1 b& _3 p; V2 m            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!6 u4 @; e- b2 d) w
            while (d != m - 1)
% C2 c" B2 M4 V) B8 l            {
: E& I' i& n& r# [2 N' {4 J                if (i == m && d != m - 1)' f1 ^! B3 [+ k: n6 z8 u
                {2 Y! \3 ?. D  _$ l* ~5 ^
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!5 h; I+ Q) ?/ N
                    continue;
- Y4 f+ g  q8 _2 D! T2 z  W; U( H& v                }/ K+ a6 [( v& r' \8 I7 b1 X
                else
2 s9 l/ \& w$ T: G, W7 ~                {
2 P7 B. P  X6 F                    if (numw[i] != 0)/ ]* c; u, x* Q1 @. q
                    {% ?4 f# z9 n* R- Z9 q% g' j, T
                        i++;
! q; H# w7 J% W+ N* M9 f) y1 k                        k++;- M. B6 m: S$ ^
                        if (k == n)
: P- Y- p+ H) Y* M& M  ?; U, U                        {6 j5 }* G3 e9 I5 o
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了0 ]5 V4 o" n* }# J9 W* p  o/ S  L
                            k = 0;! P: q, ^) F  a' y6 Q, Z6 `
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
% S4 o3 ^/ [- B+ x" \$ f3 r                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);7 X' U- q( f8 O) i) O
                        }9 M# S1 W, o3 n2 g4 C' S6 v# m+ v
                        else//输出暂时还没有改变数组元素的值/ T$ P" E2 t) a* L3 R
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);( \& o% V0 E+ X# t
                    }- \- i) {3 F" h+ O. o+ w
                    else+ \1 l' w' i9 D8 ~7 [0 U9 l# }
                        i++;//数组元素为0,直接跳过,不计数。。。
* C6 R9 [) q9 V  [                }
, W5 |. h. w' }0 U 3 f, D  y8 Q; O+ b* ~3 `
0 |* i  e+ B% o7 j
            }//结束while循环
% t- l" n; {) B5 f            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦0 z" l0 g6 ~( y  E" m
           . ~* w5 ?6 M' w+ j
                if (numw[i] != 0)" N! ?" e' e" I6 b( I$ c
                    Console.WriteLine(numw[i]);
; e: R6 Y4 y" p) U  o# s: L! J           
# m# s+ c/ L! N' a" |4 P  v$ e            Console.ReadLine();2 p% s* v/ V6 F% A
        }; f! y/ L2 [: S7 R+ ?* M( j
    }0 @" n# G' C& Y$ u& Y
}
* p3 s5 d3 ~' N1 Z# @( B
小甲鱼最新课程 -> 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-22 16:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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