鱼C论坛

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

猴子问题

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

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

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

x
大家好!( k% n! D3 n+ k8 }' \. {: g" f6 E
这几天我在忙着编一个问题,我用了一种方法编出来!
3 x! c$ ~0 ^& [/ e" X4 s' a/ c* H$ l但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
  _1 k8 G6 {; w; @) ?* X) ^  Q3 J+ @注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
1 f0 g% b0 b3 c% j+ A2 {" u3 I2 V- K7 P* n2 y2 N, R9 H( E

& f; B9 Q! u9 b. I4 z
                            题目8 N1 n# e7 F& k3 p; @3 z
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。! w" E9 Y/ N' m5 H
第一种方法:利用循环链表
: O: [' A1 T# C8 J9 ^' V$ o#include<stdio.h>8 c) x: q, p" @
#include<malloc.h>
0 ^3 I: A; ?  j, Q7 N$ T( Y5 P7 L#define M 8            //共有8只猴子
9 z  i& D/ K# t5 s4 |# k# e#define N 3            //数到3只时退出第三只
2 U2 \8 Q* q: etypedef struct monkey
7 M3 H. d3 Q  x# c* W  h* R, \$ d{int number;
2 y( s# j) k' n7 g8 o+ Jint flag;* ~6 Y6 x2 O6 j# d; E
struct monkey* next;
% I5 w; D9 x0 t" E}MONKEY;: b$ U/ T; g" Z3 Z& }) ?2 Y
main()
, z! d0 e# R* D/ F% N; f{ MONKEY *head=NULL,*p,*s;
- x4 A8 M: J3 m+ z2 v( }0 @( E  int i,sum=0,count=0;
; u! n) X; o( R& A) p* R) o; {  clrscr();              //清屏
+ v( D% k: s( h/ R2 u5 M2 R5 ~& l  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存4 L" L7 m- {7 k3 U6 Y
  p->number=1;p->flag=1;/ U  ~: o# m$ ^0 }% y! q1 ]; y
  p->next=head;
6 B1 D. o/ \# Q1 i, A) _8 r' W  head=p;
/ P9 D  a8 j( q5 y! a  for(i=2;i<=M;i++)7 E& U" e  N6 T$ y
    { s=(MONKEY *)malloc(sizeof(MONKEY));4 b4 o8 k/ n, w/ k6 m) {/ D, [
     s->number=i;s->flag=1;
5 {0 J3 |) L$ `6 W3 n) L     s->next=head;
3 A& Z0 q4 b2 u1 o: x     p->next=s;p=p->next;
- J7 O/ E% a, u& u7 \. a    }
  w, U" ]) W  X5 u. D, p    p=head;# |. |: W5 d, y) l" A
   for(;;), e! S7 J8 ?7 q3 m6 {! C
    {if(p->flag==1). n7 L4 V/ b3 ~  m8 x7 e- |
       count++;
8 b" s& \( T: H9 Y6 Z     if(count==N)
* S# n. X( s$ v: ~& |2 X        {p->flag=0;
* U) W7 _, k; X5 g4 F8 D         count=0;
5 l% l+ v, A1 v- o         sum++;}$ \" g1 e* ]' N) F2 I
     if(sum==M-1)  P) P/ y' w  b
        break;
/ k/ C) N6 f3 v. h  W% g     p=p->next;4 {* [  M2 ?) v
    }
, ?3 S7 r6 |1 T1 o2 e$ W  K& C. V0 w6 X    p=2 X+ T1 m/ T/ U! M
    head;
* a! X6 E  v8 M* i1 x; X    for(i=1;i<=M;i++)
* J, P# g1 I3 o0 u    { if(p->flag==1)) T( [% x9 w0 T5 w" D
        printf("\t%d",p->number);
1 M2 f& F4 P+ C9 b$ D$ l  j      p=p->next;; J8 M  T  I- d! F, V
    }
7 Z2 m1 Z5 ^0 m' _' T5 I5 N6 d& }8 I1 z4 ]% S
; Z5 k0 q( g% g, N2 Q& A0 q  v1 z

6 i0 o$ I3 Z$ j. {}
8 @+ Z, d! i6 m: k$ O
第二种方法:数组
: j4 M. H+ n. d( I$ s#include<stdio.h>: G, `9 t! `$ N
#define M 8* O$ F* ?% t0 c
struct monkey
* o" G1 T* l$ P& X{int number;* K) V! d5 Y+ S7 v  P
int nextp;
3 `" y: F0 X- A. t3 b; ?}link[M+1];
4 Y4 q8 |% x$ W5 c8 L" t2 D- ~+ R# j& y# U
void main()! l- V( n+ v8 H  x+ K: B; c, J
{int i,count,h;, u& X5 x" v" N; w
for(i=1;i<=M;i++)2 y9 C) u- ]0 J+ w- B
{  if(i==M)
0 |1 C' C5 t9 f  Z4 R1 o   link[i].nextp=1;
9 n5 \3 l; \) P   else- P. S; i7 u2 F* [
   link[i].nextp=i+1;0 y% l9 j! `( J3 M( r9 X8 j
  link[i].number=i;
* u5 F/ N% i  [* [( Z& a4 e}
2 N2 F0 `( e! B3 v( N2 P  ]  Qprintf("\n");
% p$ m& u% G, t5 G; icount=0;
" Y: m0 ^5 ^% k& W9 P, }h=M;
, O! A% U, H& d, v8 xprintf("依次退出的猴子: \n");, O1 L  A. \* e* f" Y: k
while(count<M-1)
9 J* S) J! D9 w/ o0 S. k{i=0;: F' \6 j5 b5 Z, T+ F. y/ a8 _* X- |
while(i!=3)
  G% W7 F, H1 X9 l{ h=link[h].nextp;
. [+ I+ u( Y# z9 G. F/ L, r   if(link[h].number)6 S& _: i, @% E* e0 [6 h2 P0 Y
     i++;}
" M" ^0 D5 o$ u- ]8 x3 }$ I/ N5 q! B3 G( K# z4 Z4 b! h- C* S
printf("%4d",link[h].number);3 x* r4 F' ]" w6 {. I
link[h].number=0;  z, d9 X. Z3 h* E9 j/ p" O
count++;
; N; n8 P/ v' H}" I) F# l2 Z" x+ h. w  P) I2 d% B
( G% K% Q# Y* z8 a% A
printf("\n大王是:");9 w7 x  p+ \; i# y$ a
  for(i=1;i<=M;i++)
6 `( n5 {& ~+ O9 I  if(link[i].number)
1 `) H8 H) n. r2 S    printf("%3d\n",link[i].number);
( I2 |1 ?' T2 G+ ~! U8 I1 \! z3 M1 E/ g
& M. W" r- y4 z9 S3 X2 @; Q
}

( o1 k' b1 J/ g+ _第三种是普通方法for循环
) ]3 D; F: f: s0 P+ v$ F# z" n  x
#include<stdio.h>
) j6 p0 V7 J0 t! s* avoid main()5 S5 r4 _+ F- K7 }5 `
{ int i,k,m,n,num[50],q,*p;  d/ I' R2 h7 w" p9 I/ p# r9 ?) y
    clrscr();' V( J7 t  M! B2 Y- D" m% O2 c
   printf("input number of person: n=");! b8 s' D: o! o' k  |7 o
    scanf("%d",&n);
; @) y' v- v& P; r' B3 Bprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只- u& S) \) ~: e( `7 O  E
    scanf("%d",&q);( ~$ k' B3 O* S$ F* t8 l- }! I
   p=num;
  W. g8 t: u" x7 M- v- q: ]  for(i=0;i<n;i++)
5 S% G6 i) S+ W    *(p+i)=i+1;
' p7 r7 y1 D; q0 |   i=0;5 u4 j: k! ~  t/ o, n$ Z0 O/ X
   k=0;
% \. J) J3 r; A# D   m=0;( a6 g- I' t$ ^: J2 W- x
  while(m<n-1)
+ B' Q! v9 Y/ l. V2 B5 m   {if(*(p+i)!=0) k++;
# x# u& g* U* |  |2 Z4 g     if(k==q)
1 F- i* }1 U- ]      { *(p+i)=0;
! J# v7 u) `6 q7 _# y' n        k=0;9 g# ]8 V& o; C8 _3 e1 i3 t
        m++;
) X* t3 G! K7 I# n! T      }
7 Q& }( `$ C# e: b& s0 n$ |    i++;& a4 N! }4 G; e5 R' B
    if(i==n)i=0;
) F) @* S6 D3 d" Y0 k) ?   }  [8 @' _3 D- r) N- |
  while(*p==0)p++;
  d& b9 O( e% I4 W    printf("The last one is NO:%d\n",*p);' G, a' X+ P& n6 h
     getch();
8 _/ Y9 K+ P. N1 p+ z
5 U2 ^1 ?. H' t6 C* B2 W' |}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;& |' E2 d  v, B. }; x
namespace 又费马达又费电
2 ]2 ]! |) m: q8 B8 w! V{/ g( {8 p# v3 e$ k  Q4 O: A1 G
    class Program+ h/ l/ K! R" w; S* s
    {7 \+ k$ n7 b, R' T  O& E
        static void Main(string[] args)
0 x. _& M% V: [6 Y( G; S        {
6 k* h3 e7 ^$ V5 r3 U3 z& ~5 |2 A            int m, n;: T8 a% W/ n- V4 S& M
            Console.WriteLine("请输入数组长度");1 c: I. C8 h# O1 k. W& I- R1 x/ z
            m = int.Parse(Console.ReadLine());//m为数组的大小
) n0 X9 a* E+ j5 V% A            Console.WriteLine("请输入要截取数字的大小");
% e; D9 s! O3 U* e7 d            n = int.Parse(Console.ReadLine());
1 _/ o4 s4 s3 E, C# ]0 x            int [] numw=new int
6 e* F3 R0 q, P0 @# l' Y# a; Y1 ?5 m( b6 _. |# k
&shy;&shy;&shy;;, Z- A9 Y; U/ D, b
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
( `# [& r9 D3 G! A; T            {1 U' a( {1 s1 r  s+ y: V5 ~* R
                numw[j - 1] = j;
6 ~, r$ n2 r2 M! R% [6 q            }" q3 Q' ~: |. d3 l. W
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
, q8 U2 O# b5 a" I2 ?3 l* H            while (d != m - 1)$ @- O: B- _' D+ \1 H1 c8 {, q
            {
% H7 F2 n4 b/ ?+ {# h6 k9 E                if (i == m && d != m - 1)
/ X" K8 ~. N$ n' @1 l                {
6 X% B9 E- w& J; \1 Q4 h; ?! Y3 {                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
. B6 H$ J+ z+ }1 L& o; z                    continue;, A+ \2 ^; `2 ~. R0 i  C( h" S, N
                }
& D& s/ |$ M! H  ?0 Q6 R- `                else
# a: J" r! z) c& K; F4 a4 W                {
% P* f" [5 C4 m                    if (numw[i] != 0)# n/ B7 d) E, M5 a2 g* A
                    {
# A+ N1 i# f4 D5 w2 l5 U; m5 _                        i++;% c* s; c/ f, l: V. y) o
                        k++;6 n1 W9 T% e- ^3 R1 B* b' L
                        if (k == n)
; V; a4 ?$ W! K                        {1 k+ I% U2 V, Q1 S$ `( g
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
0 b% h4 U9 f# d5 A                            k = 0;+ s8 e' ?( R/ d- f) |- r! K
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1  k% J. c: Q9 |2 n; ]! Y9 C! _* p
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);- S& |3 H3 t$ q  y
                        }0 L3 Z0 m+ `/ w. A; S
                        else//输出暂时还没有改变数组元素的值0 @+ x$ l& \$ d/ e4 Z# I8 b
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);5 I. g) p: t  C: {% Z( D; Z
                    }* o# j: N' v$ \: M
                    else1 d; d# U. f+ c7 v. c3 y* i
                        i++;//数组元素为0,直接跳过,不计数。。。- G( B/ N! r5 f& y! G2 B
                }
4 \# w- v  |  D7 C( a: @9 p   a1 o8 J9 ~2 l5 z+ [
  n% a1 `0 X( Q
            }//结束while循环% r9 n. \, a+ p$ H* N* K
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦' C6 Y- t' k2 Y0 o" Q# U
           
0 T. t: l$ _3 }/ U% t$ {3 x                if (numw[i] != 0)
8 L0 I/ P( O( ^- s# E4 i) b                    Console.WriteLine(numw[i]);
9 ~9 u7 y6 M) x           . a% y0 \  K$ i  E$ {
            Console.ReadLine();* y2 T2 O/ y5 V0 g/ C
        }5 q/ k! G( b/ t: [
    }
6 u" R0 @! D* k* F}3 b, V' U6 }2 w  U  w" E8 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-3-7 10:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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