鱼C论坛

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

猴子问题

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

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

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

x
大家好!. L9 u- K" B" q' F* A
这几天我在忙着编一个问题,我用了一种方法编出来!9 i1 M8 c, N; `8 p$ W0 {( K' e0 \
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!8 Z. q1 `: y2 o
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
( G1 E" y6 `! \6 h/ ^9 H; B, }
3 {. |+ b: b. y5 q* Z2 A
                            题目
' z4 n0 L) Y9 s山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
- k; m7 }) ~' }; D; R: G, z# s第一种方法:利用循环链表6 Q% M: t( a7 D; j0 f
#include<stdio.h>
" f+ {- G- {; ^- E$ N! f. R# ~# |#include<malloc.h>) x. A4 U, E* ~: }6 q# p2 \1 E, {
#define M 8            //共有8只猴子" k7 M' e1 c) L. Q$ r& _
#define N 3            //数到3只时退出第三只3 ?) ^  R) m; t( _( C
typedef struct monkey
8 x+ H) ~' S  @{int number;
6 Z$ w2 \- D* i& Q' nint flag;
4 `" H# P5 t, M' J- Wstruct monkey* next;
9 W4 D. u( _; ?) d# j}MONKEY;2 ]" Q/ c- J, |( a5 O
main()
! s0 Y9 T# w0 ]/ y{ MONKEY *head=NULL,*p,*s;: Y4 T+ i: B8 W5 l6 g
  int i,sum=0,count=0;
+ l' y( U4 j* _8 o8 k; X, W* _" j  T  clrscr();              //清屏
; _; i6 s4 w: r% v3 S; v" d  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
- e/ S9 v- f5 m, E  p->number=1;p->flag=1;
+ L6 V* M2 i  X0 z  p->next=head;1 v: j6 F/ v  ~4 K- Z3 G
  head=p;
* {  z& g! g$ ?. f8 K% B" a  for(i=2;i<=M;i++)
: |  J; _+ i6 W2 k0 |6 Q5 r    { s=(MONKEY *)malloc(sizeof(MONKEY));
( c6 ]2 R  L+ ?+ n4 E( E     s->number=i;s->flag=1;6 n; x1 k- F6 f0 g+ h
     s->next=head;0 M' n5 y: F# h# o
     p->next=s;p=p->next;( a4 O7 R& U+ y' Q3 U% K
    }
0 ?& `9 }% B9 v    p=head;9 ]; r9 C1 |6 @9 J2 S7 T
   for(;;)* M+ ?2 h9 G' Q+ _1 ^3 k7 ]% e3 l
    {if(p->flag==1)
( ~4 {% P6 r1 w, x       count++;2 \7 O6 c5 _& a6 V; g/ `2 r
     if(count==N)* j1 F8 W. `8 x" G
        {p->flag=0;
5 S" w6 ]/ `* [7 ?4 f, s- a: u         count=0;9 q( t5 F; }4 M7 I& e
         sum++;}
$ d# c% [  z4 _* i& i     if(sum==M-1)
- ^$ V, P2 B  ^4 @. e# }5 S/ c        break;& S8 V1 x9 T0 Y% c
     p=p->next;
) D' m9 P$ t7 W- R; o4 b/ k$ L    }4 O$ O9 l9 J9 `  O' K4 w4 Z
    p=9 k" v, s" C& J: u
    head;- ~" U+ T5 L4 @* G
    for(i=1;i<=M;i++)
: X8 W' Q7 n/ l5 u, j, C- P    { if(p->flag==1)
) I. ]3 l6 I! v3 k9 `        printf("\t%d",p->number);# j- @+ ^% t' ~5 T4 T( ]0 J3 M
      p=p->next;
9 U: b; \: Y  @" o9 R4 P! X) N    }" j( x4 T9 y- e7 }8 Y

  y: k8 ^% d2 P8 s/ V/ B2 y4 e9 E  y* y' d
) X# I8 W/ h4 n9 Z
}
% K% d/ C/ T7 e. m( q5 }6 }( [: b
第二种方法:数组
$ i7 i. s% F$ w* u#include<stdio.h>! ~, x6 L. I. _! F  o/ R
#define M 8- a( T$ ?" r+ I( u3 t4 L" M
struct monkey
. U4 E; n. r# r+ U, e: p' o" k{int number;" b- Q( {/ {# ~( f$ b( A
int nextp;  F3 M& _) C5 K, I% \/ k6 }! O2 x2 k
}link[M+1];' U; E" d& s0 V3 b$ [+ M
: P. ^' a; V1 X0 E/ j! T  O
void main()
- f! w1 x8 U9 c. p+ S{int i,count,h;0 o! c8 s# Y+ |. O
for(i=1;i<=M;i++)
( D4 V; h: ]6 Q) e{  if(i==M)
1 ]! ^  h. G  h4 Q   link[i].nextp=1;+ ?' l4 R8 n( B  u. g8 L6 \
   else* u. D) ~5 ]+ \
   link[i].nextp=i+1;
' v" s0 i2 a$ E' k% `  F: G' m  link[i].number=i;
& k9 p; D) `: t7 V; L# i}
& V) F6 [6 I# J  h9 R6 S" Rprintf("\n");/ {0 K' h8 }) b0 E: f
count=0;9 O* M: n' Z0 o5 @
h=M;/ O" O' k: x4 i: |
printf("依次退出的猴子: \n");
' r6 h% x0 W/ C9 kwhile(count<M-1)4 ?1 m' A9 \. n6 T; R* C" @
{i=0;
" F1 A5 B1 k/ k. L2 Nwhile(i!=3)
" W' @: G  x7 O3 n" A8 T{ h=link[h].nextp;1 u+ H. l# u0 v* \$ w
   if(link[h].number)
! X: |, a7 W! U5 G- U* P     i++;}0 v$ o# I5 `4 W' c3 u

3 e" y6 P3 `1 \- Zprintf("%4d",link[h].number);
+ F- k4 _% A. j6 }* jlink[h].number=0;* L, h8 u5 ^; F
count++;# E0 `' W( R, }, V
}( T7 J# R% n) t& c  `

/ s& x  ?% n1 W  a! Cprintf("\n大王是:");
/ Q% c) o; S: a6 j0 T2 ^1 @, m  for(i=1;i<=M;i++)1 e& T7 t2 i) b% G
  if(link[i].number)
: D# B) A7 }  q, a2 }& B  W; Z    printf("%3d\n",link[i].number);
: \0 F% @6 {9 r9 A; m. W: h/ Y3 K3 J3 G

' c- W6 X; K* |+ k9 G}
5 O* e9 b+ z% e9 D1 F' b
第三种是普通方法for循环
+ ]- l, A+ I4 \$ {1 p5 S
#include<stdio.h>) U) v4 V8 a3 g5 ^
void main()9 W( t9 Y4 q! _2 v- x( ~, g
{ int i,k,m,n,num[50],q,*p;
3 D- I+ h" v  l+ m; i' C    clrscr();
7 x8 {$ Y0 H& ?6 u   printf("input number of person: n=");
  D+ }; Z3 J$ R& T    scanf("%d",&n);9 Q! |" W4 ]0 ?
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
( a- G/ |6 G, [6 X% h    scanf("%d",&q);7 x9 x8 G$ C" J
   p=num;* C# p/ q8 O( d
  for(i=0;i<n;i++), @  u, {+ m, e
    *(p+i)=i+1;
, C8 J. N" I- m2 {   i=0;; ^5 K' N: n* O4 z! s
   k=0;
- o0 J! a+ y6 V$ u% E) e   m=0;
7 W# n) ?% P: M3 X. K) @  while(m<n-1)
8 o; x4 ]* }1 D# ?# D   {if(*(p+i)!=0) k++;
9 `; g' x( G) C     if(k==q)- I0 J* R4 v5 w1 M3 z
      { *(p+i)=0;
! F; l/ }  A4 ]1 d5 A; l        k=0;' M2 `0 N1 N( A
        m++;
2 N" T5 ?, F4 }  s5 W6 V      }% W: Z* L1 e( }/ q4 `  c9 X
    i++;
/ u7 g  D  O( O) ^. j/ b' g    if(i==n)i=0;$ v  a5 C8 `/ j# \' M  n8 J9 k8 t% V
   }  w8 F: L% G  k/ M  e
  while(*p==0)p++;
9 s* I8 }: Y7 F7 T* Z( ~: T    printf("The last one is NO:%d\n",*p);( _; f2 w9 T' v' R' x: C% N6 F  S+ k
     getch();
4 [- T% i4 l- W  N: S5 |
2 t' S) m8 K! W2 _! j}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;; `+ m: D" x* T+ G3 e# h: X
namespace 又费马达又费电! S& O3 P0 X- b9 P; @
{3 R- O7 y  ]( c, B
    class Program2 }3 K" ^" c$ N& l5 g1 c7 a7 k
    {0 g& l% d/ l; x6 s
        static void Main(string[] args)+ c' |! f7 c1 _2 O0 |
        {
' g6 K8 K0 h( w5 q. l5 @            int m, n;
2 W' E1 O' W/ o# U' m            Console.WriteLine("请输入数组长度");
* l& [) K0 U7 q( l0 y' r  C" c            m = int.Parse(Console.ReadLine());//m为数组的大小( K, k. t) h; R3 F- l# p: O
            Console.WriteLine("请输入要截取数字的大小");! [7 N" v" Z( b+ ]3 I) y: L7 ]/ `
            n = int.Parse(Console.ReadLine());
! r3 D1 Y* E  D5 O# ?% e6 q            int [] numw=new int+ l$ [- g8 H1 o6 d, \; k# ^

, n0 J4 C0 w$ @9 P* R9 o7 e&shy;&shy;&shy;;
8 g! ~' [8 t7 p1 T& E: F* k" \3 B            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数4 w0 K7 k% h% ~5 L
            {3 q) B- Y6 L3 X( A6 I2 D* S
                numw[j - 1] = j;
( h. E  g. X1 a$ F) ~# p" j            }
" z& ^) K, Y! J7 D7 y            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
7 |, j( @1 y" q6 n: n6 @. B6 _) n' p            while (d != m - 1)) I  m- T! U; r
            {
) o* U$ v8 R6 M' c# e- J                if (i == m && d != m - 1)7 I7 P& n7 y* G: ?1 v3 i
                {' d/ E( z1 H* k( H8 q# m4 p4 {
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!# g( _1 K* X( ^- G% B
                    continue;
8 |1 x. h4 h5 I* ?: ]                }$ O( Y4 G! r! e+ o
                else. P3 |6 ?; D6 l5 P
                {
4 S5 z, Q. L! X7 g3 V4 c                    if (numw[i] != 0)
; i6 L1 T# P& c/ d' k* }                    {0 h, s' Z2 F2 R6 \& x
                        i++;
0 ~6 k) _: y  Y2 ^( w) K( @                        k++;
1 r3 T2 I6 ~+ s) A- m4 a9 z3 P. N4 _                        if (k == n)& C3 }$ b1 c% Z- |- A
                        {" x9 }/ Y9 S# I0 [) e# V6 k8 N
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
3 _2 `- j6 w7 `4 u, t# D                            k = 0;
; Z( C2 l* X" q6 I5 U2 z              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1% t, h1 d! E+ g
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);2 {- B$ L; R3 O* E; j
                        }
, u8 N! }1 t9 A; Q0 |9 i                        else//输出暂时还没有改变数组元素的值8 W5 V4 H$ a) w+ ]4 K5 T0 l3 j2 l
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
# o) @! w! C& G8 D                    }# a' ~0 X& @0 G# C. N
                    else% D; k- w. X/ ^" N- N3 c. t$ D
                        i++;//数组元素为0,直接跳过,不计数。。。' M  K* p" g+ `
                }6 b0 X' ^+ \: h8 V
8 v" v" R# a4 g5 S# G6 `* V* t

7 o5 g# {* B$ [! v; }) @5 |& V2 C            }//结束while循环, ]+ b& X9 m- o4 p& t
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦: ^( Q4 Q4 z2 ]
           
. F: K2 ]4 ^  {& c: m) F                if (numw[i] != 0)
8 J; O- ~  e  z                    Console.WriteLine(numw[i]);9 i4 k' o. ~0 E0 j/ J1 U
           
2 ^5 I1 x( P' q, n% \( _            Console.ReadLine();
6 k2 I* j: \; B3 w        }
) A8 W1 i3 r6 @    }, E: q. }! [3 t
}
- h" C1 A* J, B' ]# V  }* ]
小甲鱼最新课程 -> 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-1-14 06:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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