鱼C论坛

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

猴子问题

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

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

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

x
大家好!! W7 y- P( t5 J/ x
这几天我在忙着编一个问题,我用了一种方法编出来!
! X, P% @# x8 C& x但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
$ B/ p8 b' ^! _5 E注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 , j; A' Y7 o9 E. k) C2 d

9 U, e% x; g% [* Y1 L% D( p
" @8 `$ f- ?3 n+ x) F
                            题目
8 t% x# I: T+ }0 E  \) d# e山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
+ B( J9 B; ?" p" Z2 E3 ]# v第一种方法:利用循环链表
" T2 C, A3 `7 s' u/ t#include<stdio.h>( h4 |0 t9 J0 o# B2 f% ~
#include<malloc.h>
6 P1 o2 w1 r# _0 W3 {% b" l* b/ K#define M 8            //共有8只猴子( g! m; v9 X3 l+ Y
#define N 3            //数到3只时退出第三只
  `" h, Q2 ^! R2 vtypedef struct monkey
: E6 C! t9 i2 P6 |6 Y  b; X{int number;
5 d/ r! w  N% Z9 m" C1 n. l6 \int flag;
" F: ~1 d0 Y+ e  d# u  ~struct monkey* next;6 R% y+ `6 B, k8 K, ~
}MONKEY;! {" s+ Q# p% J/ f( y9 H
main()4 V4 k" V, \* `, {( f
{ MONKEY *head=NULL,*p,*s;- L0 S5 G% Q9 h( P9 I9 g3 U  _
  int i,sum=0,count=0;- m2 F' S" R, F$ H
  clrscr();              //清屏+ e  H& b. W9 H6 I2 Q3 u5 }
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存$ m$ O0 S8 C1 A, z& c' i
  p->number=1;p->flag=1;+ \1 ]: k5 L1 a$ _# I; O
  p->next=head;9 W; c, _& @0 d' P1 {& t
  head=p;( t; i! {! B" c2 ?- p/ R! h& I
  for(i=2;i<=M;i++)
1 M0 }, ?5 \  P/ m3 d    { s=(MONKEY *)malloc(sizeof(MONKEY));# n, W0 t* Z, o* x) N# M) S2 [
     s->number=i;s->flag=1;  I4 N6 o* `! O( k
     s->next=head;
' K+ @$ |# h1 w1 e1 n5 i0 u     p->next=s;p=p->next;& V8 U  }) W, j: Q# r- F* e! g
    }
( r6 w' T- J$ t7 X" S2 l9 \4 K    p=head;
# j7 \) I6 U0 |  J2 e   for(;;)( H# I/ _1 y4 ~3 [1 j% X
    {if(p->flag==1)" ^! d  s) q- l! _" U- i
       count++;. L" o  R8 ^) s- P
     if(count==N)
0 V7 `8 F: o. O" O        {p->flag=0;
+ K6 |* B( ~4 f9 [$ e         count=0;# e4 |7 S8 @3 Y3 X. z6 @9 F
         sum++;}
& R6 n! l% {8 j; N0 \% N9 D     if(sum==M-1)/ q1 \8 E4 o$ ]' q2 m! f1 F
        break;7 K; T/ u1 ?( c
     p=p->next;
$ A" g+ Y4 D2 D3 j% a6 k$ @    }
$ h& y1 s% z8 T    p=6 _# b, |: w; |# Z
    head;
1 g% `& H# Z$ m    for(i=1;i<=M;i++): |$ u$ r) A8 U1 r- s& m/ K$ [
    { if(p->flag==1)
- y  ~& R- W/ k- n& l( m; t        printf("\t%d",p->number);% P* ?' Z8 S. ?2 ~
      p=p->next;
5 v+ ~/ f% N) n) U; ^    }  z- O( K- B$ t/ A7 o
) Z" @* b. m7 H5 S! n: e" L$ ?

% [- w  f6 w4 ]$ E; G3 A# G, a# A0 V; n& r! q) c' n
}

2 d. ~. }0 Q  z1 Z% C第二种方法:数组# a5 L) R5 e5 z( o8 [: ^
#include<stdio.h>
: g% o) X0 q3 ~+ E/ `#define M 8
* l  Q5 z; C: U9 b& w9 S6 P  ?struct monkey& M1 z# V( C* {( c4 t* G
{int number;  N0 B9 p4 n0 ^0 ^# D! i
int nextp;
- l2 @' J- H2 C2 R5 i}link[M+1];
' Q- y2 u: c& G7 r0 f' n9 M% t1 t/ P8 c% D
void main()
& C5 T6 D" _3 B! \4 k" a# {# p{int i,count,h;! p, t8 ~4 x! R* a1 X) p% ?
for(i=1;i<=M;i++)( q3 [2 i6 |  w+ W- S1 I+ e
{  if(i==M)' b% U# Z) o# z( G
   link[i].nextp=1;1 t% d# ?2 V) Q7 J2 l: \4 G
   else. _. n0 D' v; ~4 w' G
   link[i].nextp=i+1;  O- {+ B7 O3 A! t, K; a7 E6 {
  link[i].number=i;. o7 W6 o4 |4 a7 t. }; y- _1 `. d' A
}
% h/ H2 i! a+ l5 V8 d4 m/ F. yprintf("\n");
7 B3 S5 K2 G- ?count=0;1 S; u# I3 X( Z8 G2 `# J; y
h=M;5 J. m8 X4 S+ _6 v2 K& k. J
printf("依次退出的猴子: \n");  L7 g) d4 r# z) f" a
while(count<M-1)
3 l2 f" ~" i* l) Y2 c8 m{i=0;* q8 x; H* V& e- h+ e' m
while(i!=3)% O) G6 i% @: p5 z3 n
{ h=link[h].nextp;
0 u6 r* x4 Y$ _3 F   if(link[h].number)3 [4 A! x3 K4 U# M- |! {$ d1 w
     i++;}$ }9 T4 @* c0 B4 b9 o- k
+ i, u9 _! N/ c
printf("%4d",link[h].number);% y# P0 r# {1 }9 B4 ~8 E
link[h].number=0;
+ M- k7 q  j, ^7 c. D- c& Ncount++;+ S0 G( f$ @$ U7 w+ N* q" q, J
}* B! |! _+ Z# \& M/ H& u6 m: u/ B

# f) Q9 ]/ G) vprintf("\n大王是:");
# d* W3 v5 c" M3 e4 m  for(i=1;i<=M;i++)
- L( S/ v1 A; b9 _3 G  if(link[i].number)9 D% r3 s9 y1 s# n
    printf("%3d\n",link[i].number);1 j' F/ W! W" b' v
  K+ i  u1 X: U$ F2 u. }: }8 s3 i& M
9 |' A; j; Q) v9 v% o: @
}

1 ^" o& [* |8 Z0 Y. N第三种是普通方法for循环
, r4 O6 ~9 p$ U+ `! J- J# d: }* w
#include<stdio.h>2 w3 y5 S# [& {: Q: }) b. u( h4 q
void main()
) s: [/ ~7 n) U{ int i,k,m,n,num[50],q,*p;1 A( u( T( [: U+ O
    clrscr();7 U6 ?) U3 j1 f2 p
   printf("input number of person: n=");
$ A/ C& e/ Q3 P2 S& E: \$ Y& g    scanf("%d",&n);1 U4 P/ b1 O9 P$ Q- b3 d7 [
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
& j6 }3 z6 ?# j7 ~3 U# R  G    scanf("%d",&q);
( f% s3 N& P  K0 I- F5 B; S7 y' [/ Z   p=num;! ?: l; s* I+ _- n' u5 Y7 m
  for(i=0;i<n;i++)
2 a7 e& h  x  G, ~0 G    *(p+i)=i+1;
' |; s0 a' d% l   i=0;+ d, y1 z4 y: S- D( R
   k=0;: I  N6 E9 I4 r$ h
   m=0;
. h& m0 c4 d# m1 |/ u  while(m<n-1)
8 V9 N: n8 V$ s8 g   {if(*(p+i)!=0) k++;
' h; `9 g- n6 a* E! T7 x# D     if(k==q)$ G- S' r) m- e1 k+ M
      { *(p+i)=0;
9 Z2 x4 _! T& g1 n. M, d9 r        k=0;5 ]9 f, |+ Z( ~) O  z
        m++;; ~! m! M/ N3 ]; u5 U* J! {* o
      }
4 }  s8 L4 x2 `    i++;, T7 S+ N! e3 V. _3 Y& f
    if(i==n)i=0;
: _( W: D2 C8 h: N! R4 I   }
, F. d: V" U2 L: t9 X  while(*p==0)p++;  C( y9 [7 i5 g, e
    printf("The last one is NO:%d\n",*p);7 q1 _# P8 B- y- J  u( E$ M
     getch();) B8 v. `: L) a3 ~
' v3 ]+ f: d0 n3 _1 j
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;( A; q8 M3 ^% I. B6 K8 \. |
namespace 又费马达又费电
  w8 s, i+ x- {3 S* O+ c( X{
' q* q2 s  T6 R; A+ L: B! |& n0 n    class Program
. o5 C4 u) ~! L' A% |6 A    {
) I" F+ [0 n8 z! f        static void Main(string[] args)
0 O; L4 r7 z( }- K9 K$ J+ b        {
( d6 t4 {  g' }# k4 c9 J            int m, n;
$ e" I! W" g' S  A7 P/ W            Console.WriteLine("请输入数组长度");
2 T  O9 ], v0 ^5 n2 N- A8 u            m = int.Parse(Console.ReadLine());//m为数组的大小
6 I* j) K1 W- a: N" h! m  Z            Console.WriteLine("请输入要截取数字的大小");
, f* Z  E$ y  u. [" m: }: ?            n = int.Parse(Console.ReadLine());
% E7 j# g& I5 V5 l% j; q            int [] numw=new int) Q1 s- `' r6 c  w: t

7 H8 ~0 ^' n4 l5 Y&shy;&shy;&shy;;: u- f( d- S- ^( ]4 p
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数% u3 q0 A5 w4 E" y, W3 C- E
            {0 r: ?: I# B+ `4 g# J% d' V! B
                numw[j - 1] = j;
0 g! ~: ~7 r6 e            }# z7 E! r' f1 r( f' X3 E- o2 x) u
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
2 g4 f. X2 R% a5 h$ s- |9 p0 {            while (d != m - 1)* G+ T  P: T' P
            {
: f9 B) R; y- G( u; K5 \0 G" d                if (i == m && d != m - 1)
3 G% l) H+ g4 h+ I. f                {$ \2 O" n, o) ^7 A
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
. n/ ]& w4 }2 L* d, e                    continue;
1 E5 Y5 p1 J% r                }
" I& z2 M: K4 J& l6 p6 D                else2 u" Z7 g6 M6 c" l2 ?$ {
                {1 J; N) ?* S( j0 y) {
                    if (numw[i] != 0)
% m0 f0 P, d$ @0 A) G% u3 Z                    {' k7 ~' k% A8 c# w% Q& C
                        i++;
9 q- o9 `' Y& F: l2 j                        k++;
8 u8 g( J. J0 [                        if (k == n)/ I1 A& |  W6 |6 n2 C+ Q+ C
                        {9 `0 Z; d+ h5 a; G, i5 a
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了; V8 q4 P" ^0 _9 C' [
                            k = 0;
8 J$ N! P& o  R              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
  C! E, [& G' R6 i                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);' Q' H- }1 j0 q4 Q; _1 o
                        }; l6 n' D! ~* r) F
                        else//输出暂时还没有改变数组元素的值
$ z* n6 d" q# p& g9 R                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
" k8 k0 d+ C6 y& A* }( a                    }
7 b, ?5 c- z" ~5 q. @% A# D                    else
  ^+ i$ J1 s' l9 b0 X                        i++;//数组元素为0,直接跳过,不计数。。。, \* i1 Y1 e* e
                }
8 E3 Z) V  o; w: H9 Y6 ]! ?% J; Z ' ^6 J/ w* N# T! `) z
- \8 @# {/ y0 f  M. |
            }//结束while循环+ e" Q+ G# a4 {2 I/ }. Q
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
2 X: d- ^& L8 K  ]5 H" U4 i$ z5 }           ) H& ~' D* x: Q5 ?  M! J
                if (numw[i] != 0)
5 f: y% t4 Q# f  q: [$ F: F, V                    Console.WriteLine(numw[i]);3 m4 B8 |4 P7 z5 {0 O5 V
           
" t; J) {7 _9 i1 l4 A: p# j            Console.ReadLine();
" c2 }4 P/ D3 F9 @2 w1 C        }9 X8 f) [; M. d) L  H  A5 p
    }
8 W* D4 f$ {3 d. A/ V}8 b; N5 E4 F% \6 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-7-1 12:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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