鱼C论坛

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

猴子问题

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

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

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

x
大家好!
! J; n. g9 J+ k8 k7 i2 w这几天我在忙着编一个问题,我用了一种方法编出来!6 o! |3 b7 o: N# z( E( s, b& i& G
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!3 _: x/ v+ j& d) H  [
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
" P6 q" l  c9 u/ Q+ d  z5 R" [
$ n# G4 h* w, }/ r* o/ W2 E, y- C, w& }; H7 R* {6 h9 D6 j
                            题目  B. f  g/ Z3 s, D7 e# S3 [0 e& f
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
' b( M$ F: }4 ~& W9 p4 @! I6 C. U) ?第一种方法:利用循环链表0 H1 l/ k7 B( U6 X' M" f% b3 f) U
#include<stdio.h>
- I* o, H0 y5 C; k. E6 G#include<malloc.h>( a7 u6 h& ^% K3 \+ c$ a
#define M 8            //共有8只猴子
5 M+ C2 H2 s% i. y6 i" Y5 J#define N 3            //数到3只时退出第三只2 [$ J( m6 Z0 @. t* y% z" K
typedef struct monkey
7 Q( _* K3 @  T& o9 v{int number;
& \6 [7 }! ]2 T7 }- o* l9 r3 ?( fint flag;
+ H9 q0 ~# _" T1 n' ]: q- Fstruct monkey* next;
) D* P; {( \0 T3 ]3 @8 d}MONKEY;
! y. n/ J2 \- A+ s' o) {0 imain(): o2 ?) k# {6 Q
{ MONKEY *head=NULL,*p,*s;
2 `) G. H" p5 _' a  int i,sum=0,count=0;6 f* w6 w9 ]* |" v! H6 y7 P$ c, }
  clrscr();              //清屏$ w" ]$ |+ m' k8 ~8 F% K/ O
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存) z+ q  [) c) H8 E0 N+ h% C4 f
  p->number=1;p->flag=1;5 j8 o' ^, `) t3 a1 X
  p->next=head;5 p! _( X) b) e  G, c8 D2 d' D
  head=p;+ S# b- \2 Z' F0 l" v3 a
  for(i=2;i<=M;i++)
% u4 M, q3 [( h! \: j% S6 U    { s=(MONKEY *)malloc(sizeof(MONKEY));. c% R2 f' @* z
     s->number=i;s->flag=1;* a9 q: Q% p: _2 N& p  V+ G$ @& T
     s->next=head;5 E3 i) ]" m$ c. N$ H. b& Y
     p->next=s;p=p->next;
3 I" ]6 e' w6 j. b7 n    }
* D; n3 t) h: E; p! P$ P    p=head;6 I4 y! G4 Q  F  v$ q
   for(;;)
' G) P% L8 V, x( i6 x    {if(p->flag==1)
2 S- v. @6 C9 K1 X, @7 h  n       count++;( _" K% v' S' N. `* l
     if(count==N)6 P9 Q! ^9 {, u( t5 g& j! A9 X3 ~
        {p->flag=0;
1 h) S8 g7 c& l3 Y0 G0 B! B7 q( M         count=0;
+ b/ [7 E: ]2 |0 {         sum++;}
! p) k) N4 V- Z+ x: M     if(sum==M-1)
  Y3 b6 K8 z" E& K. G        break;$ S( }/ |  b+ ^: f$ h/ `( T
     p=p->next;2 _7 e4 Z8 y+ Z7 |
    }
* v1 Y8 ^4 U% r    p=7 Y- W6 [  `1 A$ X% L1 Q: @1 J1 V
    head;
8 v- H6 K; R( z5 l/ }' Q2 \    for(i=1;i<=M;i++)
. }9 X, N+ \" C- I    { if(p->flag==1)5 y8 ~1 v" g5 E7 `
        printf("\t%d",p->number);
0 O$ j& @+ f" g      p=p->next;
# n/ Q* h8 a" M+ M! C8 J, M- z, r8 G7 o    }. K8 r2 J9 U5 L0 L. F& P
2 ^% J+ ^5 h9 p. S, _

+ m9 E+ w4 d4 Z/ F  @& w8 d5 H7 U2 f% m1 ~3 f
}
" d6 }/ D5 m; y$ D2 p0 L1 R; s
第二种方法:数组2 H! l0 j4 w( X6 Y( {6 a2 \5 `
#include<stdio.h># h7 E0 m6 t" B$ l* x! r6 j3 R
#define M 8
; c- T1 E6 Y2 Kstruct monkey
4 f# {1 M$ ^- v% G3 }& X{int number;& ^7 z/ {9 H5 h: V
int nextp;
6 z$ Z* z; f' _' H2 d# j; G}link[M+1];# s8 M& A! C4 j: I6 T( f# m. O
  R" }. Q+ s5 o. d/ b9 `$ Q9 e- h
void main(), v6 y9 X8 A" z; W3 F* T$ s5 I& k
{int i,count,h;* J/ ?9 H- }/ |; I/ Z+ f
for(i=1;i<=M;i++)
7 M" s6 K  ]  `7 E1 ]{  if(i==M)
0 J4 p. M' f; h7 f! S( k# p& |   link[i].nextp=1;2 v* n- p+ s9 E) F( T
   else$ Q; i# W0 m; y! F% {- z' y+ \$ W: }
   link[i].nextp=i+1;
3 `5 c  B  a7 [2 C  link[i].number=i;* \# v* O; u( ?2 k5 R
}
- v- Q. @) Y5 d0 h+ X+ kprintf("\n");
( ^9 x/ t/ {, zcount=0;
! F- D5 d+ o$ r9 t! d4 N; wh=M;9 Y1 y  Y; g- p7 }& q  n  A
printf("依次退出的猴子: \n");' h+ w$ r) j, c7 I" u0 T
while(count<M-1)
  m+ j7 D; p/ I4 a1 L8 l7 o0 S5 f{i=0;1 y' r- T# D1 b! _! ]8 W
while(i!=3). N; N9 j; v6 z& K
{ h=link[h].nextp;
1 O& f. T1 Z, P( H  I   if(link[h].number)
- |8 w  H( M* ^     i++;}
! \+ x5 _' J/ Q% d' u, ]& r4 @; O5 l. d% L5 Z
printf("%4d",link[h].number);
  R1 Y' f& Z) Wlink[h].number=0;1 O- A- T  J- [
count++;
, H# j" s6 R# N- U; R}
: N4 y* S0 O" |  y) a6 C+ f3 i6 O" n' g/ v: Z1 {/ R/ ]
printf("\n大王是:");" C: c5 x* c2 }% @: E1 X6 j' z3 V
  for(i=1;i<=M;i++)
; M6 f1 h& e( [5 e8 s' f  if(link[i].number)$ J) w4 y3 L4 \0 B3 D- T
    printf("%3d\n",link[i].number);& `/ m# z6 X. ^! S

0 C9 W2 g) m8 H* ?& w/ l; a& `( P% ?5 W, y7 M2 R- \/ X* I# w( @
}

0 ~: X) t4 ^& c& N! Q- D1 d0 a2 Y第三种是普通方法for循环
5 @# ?% \3 G, Z# T, P
#include<stdio.h>+ c0 Q+ c2 n3 X; Q
void main()
1 x) g" i; J4 ?{ int i,k,m,n,num[50],q,*p;) P  U& O2 X) Z9 {& A! H
    clrscr();
6 h# K/ @  l6 S* {: I   printf("input number of person: n=");4 F5 C8 ]. n# G: D! u& x$ S2 |9 }
    scanf("%d",&n);) X& w1 b0 Z" d4 x- \1 {( Q
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
' J7 B  H0 h, Q8 M    scanf("%d",&q);
' u6 X9 [$ D* l/ c   p=num;# ~+ ?6 Z9 v4 e1 r2 R. Y! Y
  for(i=0;i<n;i++)* J8 R! ]  F+ D. j- t( v3 p' q2 u; Y
    *(p+i)=i+1;
8 C8 X1 h9 y( v7 h/ b3 @9 f   i=0;
. l6 X5 K) Z0 c/ U* k   k=0;
2 @3 g; x/ U  j5 ]. _   m=0;
# }2 S, Z! `( l6 h  while(m<n-1)1 o* |5 J% K& V2 g9 V
   {if(*(p+i)!=0) k++;
+ J( ~+ X9 ?- a; `     if(k==q)% r4 a, z3 Y* S/ `! s$ Y) E
      { *(p+i)=0;5 ~0 `$ V6 p) {9 \
        k=0;
8 ]" v- J  l8 j; A3 i" {        m++;
" M8 a! O9 U$ w  C      }5 G1 q, n1 T! M* B! X# {
    i++;  P% g$ C9 O& T! E; V1 s0 V3 a  [
    if(i==n)i=0;
, y" C4 K  Q+ h, ^% s0 u8 p4 [   }
* q0 D& ?) S) @# M! b5 @9 S- c  while(*p==0)p++;
& ~- R$ ]8 J! f& L% u. Q, j- }+ k    printf("The last one is NO:%d\n",*p);4 d7 ?0 y3 g, p/ E" K5 f; T% h- X
     getch();# b0 p6 t8 Q9 R) y8 J6 d6 g  x

* t. k* p- m) x( `: H}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
' ^* I) W  i9 Q7 U  d3 ?0 Qnamespace 又费马达又费电2 H- w' Y9 X) ?/ V& k# i: R( M
{
# x$ f; w  D- Z3 x# ?& v9 K3 C) J    class Program
4 y+ E" M: z  G) Z8 q9 B! n/ y    {
% J2 D- w& B1 ^0 H( w/ {        static void Main(string[] args)
8 ]5 i- |% Z; f        {
; l$ Y% ?& ?0 R8 U            int m, n;
8 i" Y! R$ j, }+ ~8 J( N) J            Console.WriteLine("请输入数组长度");
: N: a1 g! J! U; |! O2 F9 U6 U            m = int.Parse(Console.ReadLine());//m为数组的大小
( v/ {; m9 E4 ?& R$ a$ h' s9 U            Console.WriteLine("请输入要截取数字的大小");
/ l3 g( u: x4 @* e3 @, `+ W) y            n = int.Parse(Console.ReadLine());1 v5 C+ d; H7 `
            int [] numw=new int( `% }3 ^4 R$ a3 [$ z& M( ~

6 X1 s8 d9 K& v  _9 ?) g" I" y& T&shy;&shy;&shy;;( ^4 ?* b2 |+ v+ x( P' M
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数- k0 t- R* ~" Y
            {- Z$ h3 q( t  ]
                numw[j - 1] = j;
! K9 e6 s* e2 X; {9 L* }5 G            }
3 d. ?" T' r& Z7 s, p( ^* }$ H            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
4 D6 l8 t( `- r            while (d != m - 1)& P/ J# {4 Q$ ?& ?, B
            {9 \% j( L  c- ?, L; ]
                if (i == m && d != m - 1)
# ~+ Y" O3 G, b( l6 a! b# M2 a  c                {
4 p8 M3 F/ p" h                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!  J8 b2 k8 T' g: c
                    continue;4 P# R0 u* C0 J
                }
  n3 z- z. I5 R  p/ f$ P                else
9 Q5 J- V! k9 e! K                {
3 Q+ c5 K0 _9 k, q, k                    if (numw[i] != 0)8 v$ k# X) b' W: Y) D4 z
                    {) j+ }* H4 z) ~4 _5 m. U1 K. B; t
                        i++;: f% t8 s' g/ d
                        k++;
2 l8 z. q* S* Y6 Z" w; \                        if (k == n)3 A6 z3 ^6 K: K/ P
                        {3 Y  ^6 y  t9 m/ ]) u
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
0 a& E3 H  j( b  _9 J                            k = 0;3 B8 @1 `- o$ J1 m
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1+ {) y) I5 L+ e( v, W# a
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
- i. ~6 O; P$ m1 Z; o" A. Y6 @                        }1 r" V6 K3 b( q! x
                        else//输出暂时还没有改变数组元素的值
9 i; _0 \4 z! G. g                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);. Z3 Q: O  t# y/ D% A
                    }$ i% F$ `5 z1 b) o3 o: I
                    else) I# M' k. ^' \1 l
                        i++;//数组元素为0,直接跳过,不计数。。。% V" o2 [/ j* R0 w/ I0 g& O! [: t
                }
! `2 r3 h. m8 b, z6 D  u
5 A7 n1 R0 r7 }* ^" s3 V, ]& E0 I! i, M0 m0 l* L) \) ~
            }//结束while循环4 D% H9 q5 B/ X) l' t% w
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
8 B8 a! `+ B2 \           
0 [3 h, Y8 q' [  B( F5 L; Q- W7 L                if (numw[i] != 0)3 x4 f+ t" G0 D" D# T5 @
                    Console.WriteLine(numw[i]);
/ s: i- m- G; G. e0 t           4 \, H7 B; U$ H2 c2 q' P1 F
            Console.ReadLine();
9 P' J* u1 v# p0 q. s% V: M        }+ i7 P) h# ~9 Z% V5 Q$ J
    }( w& F4 N6 \( J1 N/ q& Q6 C) Y3 l; c
}1 x$ ^0 ~1 L, S( d+ F6 ?% 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, 2025-11-16 13:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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