鱼C论坛

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

猴子问题

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

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

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

x
大家好!7 G! w  K. l$ ?4 j
这几天我在忙着编一个问题,我用了一种方法编出来!( N0 h& D# b5 W+ g
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
8 L3 L4 M& Q1 U. R! Q- e* H- D注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ) \2 R$ B5 Z% _3 X& p0 s1 q
& b* p( y7 }& g5 X8 y
; ?4 m& o/ d; J5 u
                            题目
6 j/ O" P5 Y" H, U) }1 v山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。/ a5 D4 m2 l" l: d$ }. `9 N& W; M
第一种方法:利用循环链表! [. ]/ Z: g5 v: i$ K. T
#include<stdio.h>
/ |: |4 [: I2 M* I, o#include<malloc.h>) X. q( u7 _1 q9 e
#define M 8            //共有8只猴子6 u  G, [! v/ z6 I2 B
#define N 3            //数到3只时退出第三只
0 i2 V+ I2 x+ ^$ E5 w7 Atypedef struct monkey
! P3 m7 o7 D  D* k% J% T# e; `! B{int number;% o3 }; k& G3 E" u
int flag;. F/ m3 r4 V& [
struct monkey* next;
% L+ p4 n, f6 }7 D8 K% s}MONKEY;1 B+ C7 I) n' [. w- T, {
main()
/ g% X4 ~9 V% p4 s' f{ MONKEY *head=NULL,*p,*s;
$ q% p- H7 q, \2 t- b* d7 q  int i,sum=0,count=0;" x9 ]. t* L# K3 O7 `* Y
  clrscr();              //清屏
7 D4 a/ J, P* Y% h  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存3 j% O! Y& }; Z% w8 B+ l
  p->number=1;p->flag=1;$ q% h. Q# `* z
  p->next=head;
9 x  p9 y3 \+ ]6 V3 k  head=p;
+ X7 Z/ g% t$ a. G5 a4 O! H  for(i=2;i<=M;i++)
5 a0 O" K+ s! F    { s=(MONKEY *)malloc(sizeof(MONKEY));
  p' o/ ]& o5 C     s->number=i;s->flag=1;
7 E# {5 E" i( d2 J$ g& Q' I9 B) k  k     s->next=head;5 @( O+ b7 D3 {3 l
     p->next=s;p=p->next;8 Q7 I* t7 H" d5 i. z3 C4 s- I
    }! X% w' P. T; r" _7 L: T$ V
    p=head;: @# w. J+ k# r" I) w: _
   for(;;)
/ B, [, p0 k( U- t4 b    {if(p->flag==1)" e8 U/ y- i6 R! R1 V
       count++;
0 l( C! u6 S! ?, l% {) P9 j; W- J     if(count==N)
; a# o7 ~/ D. I8 j9 H  l" t        {p->flag=0;
, {" _+ g4 p% O2 c. U  L& c         count=0;: j- ^1 d, b. U3 _. Z' y( z
         sum++;}
3 c" G+ [' \8 H6 m4 _     if(sum==M-1)
8 H# |, f4 x3 S+ S        break;
' r: |1 P2 U6 [7 R  D6 E9 d" t     p=p->next;/ o" P  _6 Z0 u6 |, a
    }
% W  |9 e* U/ J' B) A    p=
8 I! |: h6 g- o- W% q    head;
, r& i' q* M8 A, {+ _    for(i=1;i<=M;i++)
2 Z9 i: j/ v4 t    { if(p->flag==1)& q. l9 {0 P3 C, J  q9 ^' f
        printf("\t%d",p->number);9 C) B* ~4 z1 _) t  k9 I
      p=p->next;
, y7 |7 X4 s! k8 g    }
+ G# L1 S$ Z. g/ V% L) t' r$ S$ n/ T' Z# s9 G

% h. o8 q& _! O
3 Q3 q! |( J. @( o}
6 Q  y3 v1 Z+ E  b% F
第二种方法:数组9 G& E6 z+ j4 D' ^! V4 ?6 i" P' h
#include<stdio.h>% ]# f5 |+ `$ X3 w2 N! m+ ^
#define M 83 V- a3 }5 Y- [' i4 T; W' y1 v
struct monkey8 c0 N2 ~+ q" q5 B! w3 ~
{int number;
6 h# S! I- p. ]int nextp;
( j: C* h, E; s# O}link[M+1];
4 ^8 s' m5 E5 a
! [& R. t( N: P9 K' [void main()# K0 }1 ~/ |) D, I1 u- r6 z
{int i,count,h;. c9 E5 ~8 b6 M
for(i=1;i<=M;i++)
, c5 q6 y9 L- J{  if(i==M)  F( w+ [8 j# _, z* l
   link[i].nextp=1;
' ?3 }$ V2 {% O   else
* Z: s) W4 u" W% R3 C/ s   link[i].nextp=i+1;
: f' h( }9 U; A  link[i].number=i;
  G/ f$ |8 J  V( w0 n}
6 r3 m: K" V6 G5 O1 l- d  vprintf("\n");
) X# `4 t  i7 L- Kcount=0;
' {7 M. T, p1 b/ dh=M;
) b7 P9 W& r" j1 J2 h" R! Z# I. uprintf("依次退出的猴子: \n");
( Y0 n; ^7 ^" b  e. T, [6 T. B! mwhile(count<M-1)
4 A9 Y, Y9 |; A$ Y1 l+ R$ y+ Q# Y{i=0;
8 |$ `5 `0 V' ?* Mwhile(i!=3)4 E4 A; F/ v. v( e/ N
{ h=link[h].nextp;, V$ s1 P8 l0 X8 O) m# U
   if(link[h].number)
$ }3 d8 v0 ?! W- j6 g     i++;}
4 g9 ]. T+ \( c( A7 H* y0 D* U4 L: a4 T& s7 D8 J) k
printf("%4d",link[h].number);  V. H& `( F$ O5 R& t9 r" i) a
link[h].number=0;
- }4 N( P' f0 k! y/ _count++;
" N! q- E$ e2 I3 E) x}+ i; K  i! _/ R  N$ ^* M
' r3 q# O% Q, w/ c- O5 H+ _2 w
printf("\n大王是:");4 R" R% D6 S# q
  for(i=1;i<=M;i++)3 A% o, _" w. s% H
  if(link[i].number)
1 j6 D" o$ I5 o+ y0 U; @    printf("%3d\n",link[i].number);
- V- J4 s' u! e" E
7 v8 Y3 g: j" ]" I# {& Q9 B
7 B. [; `$ r: }. W0 s}
0 s( q: n0 G/ g
第三种是普通方法for循环
1 I) o; ]9 V2 n: }" H
#include<stdio.h>' H& n8 J/ U/ H4 I  @2 O3 H
void main()) k6 ?9 [# p- U7 l# {* I
{ int i,k,m,n,num[50],q,*p;
! `4 a8 [# X' l    clrscr();
7 j% m5 z9 m6 B) M8 r4 C: ?   printf("input number of person: n=");
7 h/ K2 N  x' W; X0 n! B    scanf("%d",&n);5 m, s, v9 V' ^) }% M1 y: f. h% [
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
+ V( X' G5 |3 G  |1 j    scanf("%d",&q);& k2 C0 Q  q; P
   p=num;; I' X8 n# ~4 b; z& M
  for(i=0;i<n;i++)
% _. q& J, ]; C    *(p+i)=i+1;# q2 L% F5 O& A3 A, z; T8 Q
   i=0;5 j$ |" D1 e6 O( h8 V
   k=0;$ b9 f: F; j% }3 K1 v
   m=0;
% ~1 z9 I5 N$ i; X& y1 j  while(m<n-1)% ^. Y+ l" `; d* _: o  m! H
   {if(*(p+i)!=0) k++;
, ]- b$ W% _" R1 a; \1 q/ {  H8 q     if(k==q)# Z9 N. z/ c* |+ V6 P  {
      { *(p+i)=0;3 \% o5 ]) u- a7 L% f+ B& N
        k=0;
  }/ K* J6 \2 q" Z, \6 L) X        m++;8 k1 g7 e" t( m$ t7 d$ R) V# \
      }
$ y, b. @/ ^9 v4 u0 }0 d    i++;; _, L" f# s, ]' y# L
    if(i==n)i=0;5 ?/ e- x; C0 x6 L, j
   }
4 }9 |4 k  ^# B  while(*p==0)p++;
: \6 q" y2 @# {7 T' s. [5 j    printf("The last one is NO:%d\n",*p);) E) ~0 f6 v( a5 e9 ?# s# L
     getch();5 J; u& a1 s+ p: O7 U
/ H: X: I; B* t9 \6 k
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
# e6 `5 Q7 w8 `: F5 Knamespace 又费马达又费电
% t/ G* u0 Z+ v* B0 B* T1 O{# P7 ]0 X! s6 a! B( Q. ]. G
    class Program% Q9 I4 J: A8 v' V. v' z$ w6 @
    {
& }* x$ f) c" q" w        static void Main(string[] args)! e' M; z' x; e3 \( E
        {
/ W: f! c, h0 e& F            int m, n;& N1 C5 V- ^0 K/ X$ |
            Console.WriteLine("请输入数组长度");
  G7 j$ @) M0 y/ k0 \3 D            m = int.Parse(Console.ReadLine());//m为数组的大小' m( V4 c% O) B9 U# F9 m
            Console.WriteLine("请输入要截取数字的大小");
" b+ R4 X  G1 M# h# ^. R7 G            n = int.Parse(Console.ReadLine());; q2 `$ M! v6 M
            int [] numw=new int
# P7 n* z+ S2 F1 r
1 ]  }2 z# u* m&shy;&shy;&shy;;
& S& l& R8 ~# }4 S: S$ y  O* M7 I            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数/ O& O3 t8 h! z- }
            {
) d& e3 l9 x; v                numw[j - 1] = j;
5 f* D7 e2 Y/ a; L: w            }3 m& V' }# Q) w* e
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!7 R$ t9 x; U# k" w# U
            while (d != m - 1)* K" [2 v, b$ P$ Y# N; R! F
            {
# z- N; `& x1 b+ D; s                if (i == m && d != m - 1)% p! r6 x3 E4 X
                {' b5 M7 \( f' w& ^/ U0 [1 {* ~: M
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
1 a+ k5 `! q0 r1 {/ s/ q                    continue;6 d! Y' x- h. m5 J' x
                }
" x5 q. A9 C, {" y                else
+ D& ?3 A8 S) Q. z7 k                {
& c: G5 F* v2 R3 s3 Y" u                    if (numw[i] != 0)
4 D# r" b6 I! h# L, n/ M% R                    {
  Y) T# F9 d% Y# W  m+ d- h  R                        i++;
4 O/ c. N, U3 M% Y2 D7 M, p  m                        k++;
- U  s! M( f$ q5 ?( J, g                        if (k == n)1 r' B2 e0 i! ?6 ?4 _, ]
                        {) R5 h, z& B$ P% O4 r
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了2 E1 o( Y4 G1 z% S" y7 [0 s- ]3 j2 \
                            k = 0;1 v. i" j* X) N- ]# v7 L4 F0 r  G
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小14 Y" ?% ?# V6 _& ]1 x
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);3 l; }1 H/ r) h; i1 y: V! }0 H
                        }
! s5 R, ?* l  ]1 k                        else//输出暂时还没有改变数组元素的值. g6 M) n' E  P' ], P' o
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);' h2 X4 C; J4 b  K
                    }
# F3 {/ k( c! K' _8 u                    else
3 D; G/ n" {  Q5 e                        i++;//数组元素为0,直接跳过,不计数。。。
* @, ?/ W- B* {* }% C" n+ S                }, l- ~0 f( [& X0 J5 i
# H4 X; l! E/ U) ^6 J
1 X( p) Y( l7 h
            }//结束while循环. y! B8 {# _+ H) H  y9 w
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦0 _& V4 e8 T  s
           ( ]* o, Y! q/ F/ u
                if (numw[i] != 0)
5 z- H2 v, d$ N, b2 G1 t) t                    Console.WriteLine(numw[i]);2 g. ^& w: H2 H5 \" h- ?
           
, p" U1 W- {& p! F  R" J* S# c# ?            Console.ReadLine();
  u- j# C4 A0 B        }
# ^" Y/ L) }; y$ y3 T    }
% B2 }$ l" b' g% g' _}- k/ Y8 _4 |! D6 f2 n. G
小甲鱼最新课程 -> 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-4-20 14:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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