鱼C论坛

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

猴子问题

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

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

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

x
大家好!
5 T5 L  M& M( p这几天我在忙着编一个问题,我用了一种方法编出来!0 i" b7 I" k# O
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
0 k) e% C0 I9 L9 ~' c' {5 Z) D注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ' o' I$ d2 d' F  a
0 L) j+ f: L. E* b& R

. u# q# ~* Y4 |4 c: }
                            题目" O; o1 s7 p- m& L, c* \$ @( G
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
+ y7 J( ~1 Z8 Q* j& D" \第一种方法:利用循环链表- [3 n; J0 Z$ |% f+ F
#include<stdio.h>
% F3 W- a2 q& T8 E* I#include<malloc.h>
# c4 g$ J: R; ?5 s! G#define M 8            //共有8只猴子
) X3 g5 {2 Z! E; h#define N 3            //数到3只时退出第三只
: k/ u3 ~: @2 r* t; g* M* ptypedef struct monkey, K! f! V5 O8 W$ O
{int number;% N  L+ Y8 P& f* ^% j: V( G
int flag;
! O. D- B% ?2 sstruct monkey* next;
, d3 G, @2 `, m3 @+ j! w" _}MONKEY;
; n0 \- i: U  Y. f) q5 omain()
: ^2 o0 Q$ ~1 s  o( k4 F( g{ MONKEY *head=NULL,*p,*s;
0 b. [! e$ Q! A4 @# [' j) T, _  int i,sum=0,count=0;8 a0 t6 N; l2 J8 X$ C
  clrscr();              //清屏8 S+ h. t: @# m7 N$ E% y
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存9 d- \. l0 k; r7 E
  p->number=1;p->flag=1;- Y. x# E0 Q1 Q5 k* y
  p->next=head;6 M7 I; f/ D" h$ l% y+ T
  head=p;
0 T# D; D6 H" J9 N" H4 o  for(i=2;i<=M;i++)
3 \; X4 g+ {9 C, B9 R' _# b9 p/ n; H0 _( j    { s=(MONKEY *)malloc(sizeof(MONKEY));# f1 }7 x2 @7 z# d. u
     s->number=i;s->flag=1;) @* ~7 ^& H/ s3 Y2 p5 C
     s->next=head;
0 ?: ~" |. j  ?. _& T     p->next=s;p=p->next;
1 F$ E/ Y9 v; p4 D1 p    }
$ d. P0 `/ T$ d; `- P, g    p=head;
# M, _  u1 o3 {/ t  b2 M- W8 @   for(;;)4 `3 S7 ]' ]; ?' ^, O  \. y
    {if(p->flag==1)" y5 W* h  N/ d: X: s) R  Q% J
       count++;' \% m# `' A" d: Q- V# E. u
     if(count==N)
, m& v2 V1 {& K4 I        {p->flag=0;. x$ C* ~" K  G! F% m) V/ m0 i
         count=0;0 X% f% F6 Z+ V
         sum++;}( M2 W# W: _# f2 o
     if(sum==M-1)
; e1 m( Z3 N( K* d        break;2 K3 j- ~$ l- \7 k8 D
     p=p->next;+ [7 ^& ~+ i' V! Z  B* x$ @
    }
1 ]3 r* y; B/ U1 Q% J" W! z    p=: A) P" r( F0 s& a
    head;
* S0 M& v6 Z- {4 H    for(i=1;i<=M;i++)! }% e8 Z5 |. J. C: f1 I8 @
    { if(p->flag==1)
# A& c2 J: q0 W% f" k. n  ~        printf("\t%d",p->number);. P" e' b  W0 T. M- i
      p=p->next;
0 y( s* k" E7 O    }" S  k9 n5 f% |1 B" l/ `: }1 N
- W$ j3 x$ Q$ ?

2 A! y4 j7 {1 L) k& D
" b  C$ [" h" n7 N}

; i& J) u' ?, u% L6 H! X第二种方法:数组. V3 _* d$ U5 b# B5 O
#include<stdio.h>( X# j# {" V: N2 M' [+ f
#define M 8
. H4 V; L; R  ^& z+ D! Gstruct monkey
9 I. Z) z4 O! H{int number;/ h" d; O- o8 K  P
int nextp;
' S) h2 ?/ k# Z9 N& S}link[M+1];
4 X2 H( i2 b9 v/ P: B; q
, U5 `& z. w6 T5 uvoid main(). T+ l8 T; a" P6 H
{int i,count,h;3 _' w6 W8 `) B$ y* G1 {3 f- }
for(i=1;i<=M;i++)
5 a. a# v) N* M. w+ O{  if(i==M)
1 [/ D( ~2 G& o* i   link[i].nextp=1;
' [( D: v9 e4 o. o, t9 \   else4 j: c. P; t9 G( {' A% Z, D' H
   link[i].nextp=i+1;& G* L, a, u, E, g5 b
  link[i].number=i;# e6 a8 M; ]% L( Y& W+ Z6 D
}# }9 o$ ?8 A8 v  g0 {
printf("\n");8 k9 f7 B4 S# \/ V, l6 g+ A$ B2 ]( o
count=0;
1 n$ p+ a, \7 A- q; {8 u4 Th=M;' ?# e# `2 I# `# O, x
printf("依次退出的猴子: \n");4 ~8 `3 k6 W- m1 G& L; w, ?
while(count<M-1)$ o( a4 h" J+ I; T; q. D/ C
{i=0;
: h3 B7 _$ i; l" y5 l8 lwhile(i!=3): K3 |( e( x( x0 @7 P4 r2 }( E/ S+ K
{ h=link[h].nextp;% T* r1 T! p. W1 B& W+ ]
   if(link[h].number)
: _" F( b" h' {4 V% e4 t     i++;}
$ b; F; ~7 _: p8 {
' I3 y4 n; w# Lprintf("%4d",link[h].number);5 Z7 d+ N7 W  F
link[h].number=0;
% J; o. A: K+ c2 }count++;
5 m7 M9 ?6 F6 [}( T9 ~: e- W! l% ~5 @! a5 @4 j  `

, N4 N, K* q/ |: y2 Eprintf("\n大王是:");! p/ o% f. w  h, ?5 e
  for(i=1;i<=M;i++)" g+ A7 ^+ }" p  ]! |2 N& w
  if(link[i].number)
# L, G4 s0 s8 X( G: @. `( r    printf("%3d\n",link[i].number);
3 t. ?! J3 ^$ X% n- j7 s5 @" @7 n+ |. i  S3 f2 U9 K! `1 ]

4 k4 P/ V! Y" ^2 N}
, [$ y. i4 `  b- F/ a* K# |
第三种是普通方法for循环
; t7 m5 I6 Y* M5 O* `8 L
#include<stdio.h>- w3 o" p1 _$ N; W
void main()# U" A$ F1 R/ r( Z# _* M
{ int i,k,m,n,num[50],q,*p;
; C" X6 y  E/ J# J    clrscr();
7 t  t+ _/ K. \+ v" C. k   printf("input number of person: n=");
, @7 [& i0 t1 `# G    scanf("%d",&n);( v! ?1 E  r* d9 X. v, U
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
+ j; O& I! E0 ^  h    scanf("%d",&q);" j0 Z- n- ?& f" S: m
   p=num;0 f5 i- B) j" j8 S3 a3 F0 C) ^! m% p
  for(i=0;i<n;i++)1 J0 y& ?- E3 x9 n
    *(p+i)=i+1;& N7 [, m  X/ {" e8 |
   i=0;2 ]# T% S7 M- y. ?( {
   k=0;
0 b" \5 g  P& g+ w% A, m9 b   m=0;! Q6 t2 u5 h& Q. ]
  while(m<n-1)
" h; Q9 O* e8 N/ k   {if(*(p+i)!=0) k++;
$ D  x8 j6 `2 i( P1 q     if(k==q)
; Y* J! w, K8 h7 U      { *(p+i)=0;8 v# G6 r( H2 P3 t, r
        k=0;' Q" K( Z9 R6 k/ i+ W( @
        m++;8 k1 _! O; z( F. U
      }+ O) s. M/ S' X/ y) d7 h& z
    i++;
' o0 ^$ N! p; a; o5 H2 ^  y% B    if(i==n)i=0;) {- O# d+ b( x2 ]/ v6 Q
   }
+ `% k2 y5 \$ i' K1 C1 B  while(*p==0)p++;
5 k" R3 d9 d" e0 k0 k% [( X    printf("The last one is NO:%d\n",*p);
7 B( G; f6 j$ f; @- g  O4 u     getch();
! j7 z& B" D' M( R
9 O$ w( Y4 J1 ~" W( C% ~9 x: a}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;: o! O( N' V+ x1 J3 J% a
namespace 又费马达又费电2 k/ P$ C! e; D% w5 D" i& u
{9 K& j; {9 E/ U
    class Program+ V( u6 v4 q: V( G" X( f+ x
    {
. {1 a* @; J  H" ]        static void Main(string[] args)8 {' T; S8 v0 r* D; Y1 v
        {  _! D5 G3 ~" R7 A
            int m, n;
6 b' W. b" e/ ~/ x- X0 q) g            Console.WriteLine("请输入数组长度");! D' a7 _7 W' r- U+ P) N
            m = int.Parse(Console.ReadLine());//m为数组的大小
5 ]; T# L7 z: C6 `6 p7 Q            Console.WriteLine("请输入要截取数字的大小");# y9 ]3 D8 L4 L9 j6 h* T4 q
            n = int.Parse(Console.ReadLine());
. x" Z+ c% P0 J) N( `            int [] numw=new int
7 i( h) e* {. A1 N' l8 Z! T. x& ^+ K8 f- a+ m7 J& }8 b7 ~: \
&shy;&shy;&shy;;
/ p# t# u. H' r  P9 t, e. m            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数5 m& M: p" b" G1 \: [8 S; W
            {
' L- a7 a* k4 s& [* S6 s& {                numw[j - 1] = j;
( C0 @/ Y4 k! W3 M; E/ u            }6 t" h% i6 f( M! ^, J$ ~( o
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!4 U1 S& P# ]/ [9 j/ D% i
            while (d != m - 1)
) L$ U/ c4 r* [& i" f+ G1 G            {
2 J" K' h% Z4 s. b* ^; u6 O4 |' g                if (i == m && d != m - 1)
) S7 ]" t  b7 u/ W                {6 a: v- c" W7 E
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
1 \2 F0 v8 ]1 P3 X) \9 w5 x: d8 G                    continue;$ ]# _$ h& z$ v9 j. ^
                }$ n' }7 O( G' T! i8 {! ]
                else& A. Z# C: h; o7 N; l
                {
; X2 F! M* F0 m+ t# M+ K  a                    if (numw[i] != 0)
% M" `# E/ R( Q; E                    {
/ A( g! N3 f0 Z9 L: F                        i++;. w* ]) r: Z- ^0 K$ ]: a
                        k++;( y: x5 t3 u: L. H+ v% L/ ]7 s
                        if (k == n)  B4 ?6 Z# E1 R9 B% i
                        {
' i6 f5 y5 U6 S; M5 b                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
1 ?: H2 `5 F0 p; Z                            k = 0;& P8 h% h& T' d. K
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
1 P' w+ w$ ]5 s0 @. Q5 I; ?% y$ j                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; v8 i8 u2 T7 G) z5 p. o: n                        }
. i* S6 R+ I. L3 f/ d# R) s                        else//输出暂时还没有改变数组元素的值. j- f9 @! f  R. z7 h
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);, F5 x( g& T6 b' {' b0 d
                    }2 A' _7 K# A  q! R/ \& {
                    else7 @- H0 k: X/ p* y9 F( b
                        i++;//数组元素为0,直接跳过,不计数。。。% q, h1 S0 ~0 h( u; I
                }
* ^; g6 `( u: c1 O* V8 e
  J$ D0 l0 L7 F1 n! f: j
1 b1 J; @2 c0 H3 ^0 h/ m            }//结束while循环' H( Y4 ^7 g5 T% @; l
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
; |+ z1 B8 o8 Z" p7 X) a& u$ O           
$ k/ v( f! [+ c. F1 c7 @/ v& j                if (numw[i] != 0)$ z3 a% v: O8 U2 A% ]
                    Console.WriteLine(numw[i]);$ z& \3 j9 |, A7 h# B1 I
           " d! u/ {  |1 w2 q4 N
            Console.ReadLine();
6 p: K% o# ~- X8 B+ v7 B! W/ I        }
8 l% \$ Q/ M) w, r    }
2 ^2 {% }8 _+ H}
% [) z+ Q" `/ F) k
小甲鱼最新课程 -> 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-3-10 16:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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