鱼C论坛

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

猴子问题

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

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

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

x
大家好!
1 o. J4 T" g" m& `! n这几天我在忙着编一个问题,我用了一种方法编出来!/ B8 c+ k3 G. I
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
% X) e+ b7 g2 r8 D3 \/ a注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 3 H4 U2 k- y' h! k' f& ^: o

2 R! N# b. x% ~* H
3 R* @: Z' Q2 _9 v
                            题目* D5 s2 P  ]. h, t
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
2 ~: g3 U) d) F& b; a第一种方法:利用循环链表4 C  {* f$ q$ Z! b4 J( G
#include<stdio.h>
% f  V+ c6 d; c" Z* R  m5 u#include<malloc.h>
! O+ [) C) p: e' O, F. Q. h0 `#define M 8            //共有8只猴子
# }5 O9 v/ n4 t#define N 3            //数到3只时退出第三只
  n) G- \9 q9 C( A6 \typedef struct monkey
& C6 l4 o6 C6 g7 d{int number;
9 r& L# R! I( d* P; g  Z% _8 Gint flag;4 A% h+ P$ n; C) `$ r, U
struct monkey* next;6 o7 W2 Z6 O. i& J- ^* {
}MONKEY;
! V8 q$ W& g: s! C6 o* V3 \. N6 Bmain()6 l8 D% a( y$ q( j, k
{ MONKEY *head=NULL,*p,*s;
7 x) A- A5 y% w1 J) Y& |0 f0 d. U+ V  int i,sum=0,count=0;
) a) Q. g* n* M8 v% W  clrscr();              //清屏
7 k: h/ ^% K$ X3 ?( M  y  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存% u: B6 w8 Q- x# Q/ N2 s( {; o2 P
  p->number=1;p->flag=1;
' F) E  g7 u5 N  M9 G4 X  p->next=head;
( a7 Y9 \% ~  D9 ^; i& k. p  head=p;
6 R% @2 h; k! K* [" @3 h  for(i=2;i<=M;i++)
) E5 c0 G7 T2 Q; G9 P0 f/ ^) C    { s=(MONKEY *)malloc(sizeof(MONKEY));
2 D, U; E% G( r" ^: d     s->number=i;s->flag=1;
: G  r# Q3 K0 J$ c1 F     s->next=head;& J( j: `% l) m% x. k
     p->next=s;p=p->next;% `% w% K3 ?+ \/ y2 _6 N  j
    }
: T4 h/ h% Q# A# h    p=head;
4 B! B  [; m) U   for(;;)# w5 }* g& A8 s$ s
    {if(p->flag==1)
2 D6 X* [; @; G2 L       count++;
8 Y% p, T; Q) j: x9 \3 ~3 {5 a7 Q     if(count==N)1 E) t8 M9 i0 k/ ~; }' j
        {p->flag=0;+ d6 Q+ Q3 q2 z5 T
         count=0;7 {4 M( I& l/ Y  g3 P: L
         sum++;}" u- [' |2 E) `* H  w4 G
     if(sum==M-1)% y& G7 ^& Q; Z( ]7 P% f. ?
        break;
( B" {# r7 f) ^& |/ E     p=p->next;; s' d/ \% W  Y, e9 }% a+ b: h4 m
    }: H  }1 y- `  G. B6 L0 C
    p=6 L( E! K: L1 o7 s) B2 |
    head;0 z) ?) L( L+ W4 u4 ?0 Y6 [
    for(i=1;i<=M;i++)5 S8 Q: M2 w4 v) Q4 t
    { if(p->flag==1)
, W2 K' |4 u0 k        printf("\t%d",p->number);
* F! z& o, `1 G3 Z      p=p->next;
+ P9 ?" X& B# {( ~; L# b, i' n    }
. r' l$ Y9 q, K6 f& b: t: |' @  ~6 M. C# p
3 _+ E- u5 k) N; F2 U. m$ D; Z
  D5 o( o( V* e/ i/ g- y; Q9 `
}

& b: [# j* ?/ q$ f( n  ]第二种方法:数组
0 D- L5 w. K9 t7 P$ n#include<stdio.h>
) p; h, W, F* k7 q( U#define M 8( T: D3 }( P+ F: _4 L2 `
struct monkey: X3 y/ x! a5 `
{int number;
2 M/ |! w# m- L1 Zint nextp;" Q$ y" {' F3 g5 i: E3 w
}link[M+1];# c4 A; O* [/ l; H: A9 i

+ G4 o" i2 o* V& y( kvoid main()
' I$ \9 D4 j5 `- p  H; {! l" }* H5 P{int i,count,h;2 f4 X% c1 u6 F1 ]3 w: B
for(i=1;i<=M;i++); L# t, i+ E0 U6 n; i3 f
{  if(i==M)' V) g, D/ F9 _1 B6 M7 \- |
   link[i].nextp=1;) I$ C1 Y. E. F' |: r1 X' a4 O7 Z
   else& q) ~: c3 }8 i; A
   link[i].nextp=i+1;6 D* [, N7 p4 y& U& t0 f: k- `1 \
  link[i].number=i;9 m# m( A( G3 [' N
}
1 k/ {- t; M9 i( b+ Zprintf("\n");2 X% H" ?* K$ @
count=0;6 h* P9 C: c6 m3 Z) u' V$ N
h=M;2 q+ Z5 B- v8 h0 u5 [0 C, p: e
printf("依次退出的猴子: \n");
% E& e( ]6 Q; i0 z& a5 p: zwhile(count<M-1)
5 b2 U  ~% c  D{i=0;
$ I% d- E+ r8 V. {( b" Rwhile(i!=3)9 d1 _/ B6 x1 x4 p7 l/ Q% x- K
{ h=link[h].nextp;
: ^1 `$ ]1 B) x4 Y9 z0 M/ {   if(link[h].number)
* _  T. d  X: i     i++;}% G! M7 c. n6 f

, z0 ^* {/ B9 h2 G* {8 ~" @printf("%4d",link[h].number);: l$ L! x' c+ P0 f0 L- ^+ S% O5 p
link[h].number=0;
1 F4 Y$ `  @0 A" ^count++;/ x7 ^6 u) B- }3 h- Y) P
}
& \: P7 A' s" `  J7 v8 N# E+ b2 z3 ]
printf("\n大王是:");
) I# ?9 p+ E" V+ b8 S4 R  for(i=1;i<=M;i++)' g( W4 X- a+ y3 j# k  v( ?
  if(link[i].number)6 y; v. D$ ~8 X1 ^/ f9 O
    printf("%3d\n",link[i].number);9 F! k0 w7 W. E8 x! Q

2 @5 v! [, h! ]9 `; V5 J8 c5 z$ E$ k* ^) a8 B
}

+ C1 O" L0 G7 X1 x( }第三种是普通方法for循环

; n( j/ C8 C2 {#include<stdio.h>! O( o2 k, R! q' |2 q% Q
void main()' _, `. Y- ^3 d( h$ }6 v5 B' B
{ int i,k,m,n,num[50],q,*p;
( u$ F( \, Q3 R0 k    clrscr();
/ G% l( M) z% O, E( B+ @( F   printf("input number of person: n=");
2 d! s3 T+ F( v    scanf("%d",&n);8 E4 @! }' i' k+ h# |2 }
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
5 J+ h* J; c$ e3 _    scanf("%d",&q);
( h7 P4 r7 O# J/ _5 [& p1 [   p=num;, \6 p! P; ?1 Q. B! M& }
  for(i=0;i<n;i++)/ P* s  e' c/ a1 O2 g4 A7 K
    *(p+i)=i+1;9 F4 \9 O3 n7 v2 ^+ v' N& T
   i=0;
; X! W4 M4 w2 L1 [" J   k=0;) X- W' l5 W6 g4 {% a" G
   m=0;
9 p- p* |4 U1 F! j9 j  while(m<n-1)
+ V, x7 @0 o$ F5 ^9 ^   {if(*(p+i)!=0) k++;
6 N2 P4 w. l9 H$ ~7 F2 w& @5 _. ?     if(k==q)" `. B) s% [2 \1 j
      { *(p+i)=0;
, @* u3 w7 \+ d        k=0;
: {& C0 H( @' |4 P9 L        m++;
5 k) T. O! Y) E* A7 w      }' A* z6 X, A' l- J
    i++;# o) m' c+ a) W7 d2 J) S
    if(i==n)i=0;
- q! t3 \2 e2 i6 ?' Z   }
0 x5 G+ h4 _; D! T2 e- U. y' A  while(*p==0)p++;
5 M% \2 G0 r, D    printf("The last one is NO:%d\n",*p);* P/ M' ^) Y& z7 y+ `; m
     getch();
- m1 r* ~: _3 n! ?6 o: F! v
' h& a' T" O2 a% W' h" ~}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
0 ^+ x+ Z! W  b9 ~# i0 b5 E6 znamespace 又费马达又费电/ ]/ |; _' M* V2 {1 D
{$ \* w( g$ n0 M  S) I1 o
    class Program& H+ w: p) r  F4 X' w4 I2 l, j
    {- x1 p0 e! p; ]" D4 Q. ^  u
        static void Main(string[] args); a' A3 H; W3 I3 p
        {
7 ?& b& I; S" b6 @1 w& {: b5 {$ ~            int m, n;
/ T8 [' ?" z0 F6 b1 M  A            Console.WriteLine("请输入数组长度");
8 T1 y- N, f7 O: v0 H2 D! F6 @            m = int.Parse(Console.ReadLine());//m为数组的大小
; ~5 a' ~2 b7 P! q- R' ]+ N            Console.WriteLine("请输入要截取数字的大小");
, v; D3 c4 a* n8 m$ W, q0 }7 R            n = int.Parse(Console.ReadLine());
% n7 `" C0 j. ?' e            int [] numw=new int) H: P) k4 ]: J0 o/ j8 W

1 _# n1 g& g6 I; V' B&shy;&shy;&shy;;) I3 r4 f# u& w; S' x
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数7 o+ C  n; u+ M1 Q! g9 i9 b  q
            {8 ^! z* c8 o+ O
                numw[j - 1] = j;
$ J$ v1 V( L9 j& s( r/ k- ?8 Z  c            }9 }8 B1 p/ A% k7 Z6 {
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
' p0 c1 {: `: c! F  J6 X4 x" x5 ~+ f            while (d != m - 1)9 u) |$ v! X) L* e
            {
" \/ Y& F* T' o, Q3 K                if (i == m && d != m - 1)
- u. p( i5 y- k( j, J2 b                {
+ J" d7 G# U! l/ G" O                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
' Z9 x7 O5 Z9 x* g- R, A                    continue;
' `' k& q7 h) M5 Y                }
! d2 i, y: E9 k* [1 v; g- S: W                else4 h* G: _+ v9 p1 v
                {
3 `" O2 S; P+ N0 T, X3 p                    if (numw[i] != 0)
, Z; T3 t) C) `6 r4 H1 N                    {2 B( j2 o/ |# y' }: M0 @
                        i++;1 |, p0 G" m8 Y4 q
                        k++;
+ K. C# I% p6 U. [" k. x8 W                        if (k == n)9 g5 D: j; t" @2 ~( y. G
                        {* J  l; ~+ U2 n
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
8 f. L) M6 {8 P" h, R                            k = 0;
4 v/ o% C. U6 U3 b! N% v2 p              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
/ Q* e) {, ]1 \: _% R! y- [                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
- H" a9 O) W- E; {/ v. h% q                        }! M- L' m) [- b8 b& [6 e3 P
                        else//输出暂时还没有改变数组元素的值! J- w( B) @) |( |  a1 r
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
- \: J& I& u( w9 k: a2 X5 t                    }
+ c9 F' [4 T8 M2 B" T) n8 F8 l                    else
" p6 j  {, i) N! z                        i++;//数组元素为0,直接跳过,不计数。。。
( l/ D8 F" R- L6 T9 [. a                }% }* b$ E$ @4 G8 f* b9 }

( k! k! I5 v& D( {" D
! ^' O2 g8 h  B) R) f2 |' v" k5 B. x            }//结束while循环% |. V1 n5 R/ v( \; b
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦$ e7 J  ^; t) D6 y* t1 G/ N
           $ ], _! Q' O( k/ C" ~: A, g# S
                if (numw[i] != 0)
5 \0 g/ `) h( @. F5 W3 x( D/ ^                    Console.WriteLine(numw[i]);! v& G) F* e0 H5 ~
           
4 K! T; h0 M% I- W; t            Console.ReadLine();! w9 B8 n9 v9 I
        }
9 w9 w; r, t9 P7 P$ s2 J6 P0 x* X0 j/ [9 }    }
7 t# L/ Q6 y0 G2 X}
+ L+ `" T5 R/ {: F: y) {% j: o
小甲鱼最新课程 -> 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-12 19:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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