鱼C论坛

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

猴子问题

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

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

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

x
大家好!  T" U1 ^# ]- i
这几天我在忙着编一个问题,我用了一种方法编出来!; ?; _0 w" v; e8 |
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!8 Y- ^# G6 P, y2 j
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 & z3 M/ B4 A; A, X7 W5 d) m9 T+ z

2 t$ G- p; m- C6 q1 M' h6 {  f
' Q3 J$ D% f$ q9 B
                            题目
" O, f0 I% f: S2 {3 T' b6 [6 R山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
' Y; X% X# e& h第一种方法:利用循环链表
' f1 a: S$ F/ @7 Z& Y1 O#include<stdio.h>: k6 Z" a; t; r: z
#include<malloc.h>; a" t; \. x: C+ h6 g+ i
#define M 8            //共有8只猴子
$ N* U# d7 L8 J. P1 d#define N 3            //数到3只时退出第三只
' E  w8 S1 f9 X% Y" N" i& ntypedef struct monkey: h9 ^  p9 K/ r/ a9 z5 T- B9 ^, Z( B: m
{int number;
/ b0 w! C& H! qint flag;0 E. {9 e: y3 Q+ p( ?8 r% O$ l
struct monkey* next;" K9 [/ L  z" t! ^" B  j* @
}MONKEY;
3 V. c' i) J. V: Gmain()( L. Y3 ~3 w. a8 u
{ MONKEY *head=NULL,*p,*s;
' f  k9 ^2 d. k8 L3 ]5 [4 g  int i,sum=0,count=0;2 s; h& r" X5 p. P+ L# X
  clrscr();              //清屏
' h& E- R; U1 W! L  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存" q  P" C) Z* S0 T5 d4 t5 D
  p->number=1;p->flag=1;/ d4 t. C* U0 Z+ \5 v8 t
  p->next=head;
4 b  v& L/ M% D: ]# G  head=p;
5 E7 S% b4 d  D  for(i=2;i<=M;i++)
4 a+ {) d" i- T/ T5 ^    { s=(MONKEY *)malloc(sizeof(MONKEY));, s4 q0 B2 Z8 `, Z: R  V
     s->number=i;s->flag=1;
+ N8 L) U% K% A     s->next=head;
1 c+ N- a2 k/ l5 _1 w     p->next=s;p=p->next;
! U4 r. |4 s5 a    }
1 M1 v' m" \4 R0 l+ N/ o    p=head;5 p  ]/ y( g, {  f* h
   for(;;)1 t7 R5 X) Z* a* u* N- U. e
    {if(p->flag==1)
" X8 m0 @0 v, I0 E0 f1 K1 {       count++;5 n+ I& c0 W8 f
     if(count==N); B' }5 C. z* N6 B9 n  x
        {p->flag=0;
+ R7 B8 i& Q! p' s5 Q! ^         count=0;! Z5 y% b& R4 U0 C: F5 I, I
         sum++;}
0 p1 l  R7 R% v8 U; h     if(sum==M-1)9 K) ]% S6 |! a4 o+ W4 O
        break;
8 j- T5 M) e; n. P     p=p->next;' K4 ^: o$ [" G3 j; ^
    }  W2 r4 ^5 d- c" k/ P
    p=
9 l2 R6 \( x* T9 {1 K; g    head;
4 b( K+ H' _0 m9 I% \3 j    for(i=1;i<=M;i++)# ]- n6 u8 z( k8 Z/ `/ E; f; `
    { if(p->flag==1)% D! ^1 U1 @2 L6 Z* I1 c1 i
        printf("\t%d",p->number);* n9 \9 H- N4 x0 o2 J
      p=p->next;( C, h# m- @! m  K' H- o  s$ [
    }% W# t  N) V: j; X
4 _% ^/ A4 o1 @2 f. T) g6 s
$ A$ b9 d7 y* t& e

' L+ @# v1 T: {" K/ F* ^" E+ a}

7 [% p/ V( [& {! x5 u第二种方法:数组! Z4 ^+ r0 B) g# |. g' A! u8 V
#include<stdio.h>- \/ R: L. Y8 M2 E8 }
#define M 8
+ A8 [# ?1 I, g+ T  k& Hstruct monkey# R* Y; |' d. y& g1 u& x: \5 R% u9 I
{int number;
+ G' N2 u: q7 Fint nextp;! x; i, H4 W, ~$ y: P+ r" y7 ?
}link[M+1];, m$ m2 O. k0 y& ?
+ h+ K$ f! G5 b2 I# a* _4 O
void main()
* P! _9 w( A- ^0 Z0 T* J; m{int i,count,h;4 H0 d! @. @# O9 Q, g
for(i=1;i<=M;i++)) a' _& z2 o' Z3 k3 d- P) j+ k  _
{  if(i==M)( Q5 P4 \- k1 Y& V' s3 s7 C
   link[i].nextp=1;
; r3 e6 v; }2 u# f9 M( Y9 ~   else
3 o0 H) U/ \6 ]( c9 X   link[i].nextp=i+1;
! \/ {. u- [3 q$ [" u2 U! }  link[i].number=i;4 S- y2 B7 K+ f; O9 d8 o' q/ Y
}
- g# i$ o7 Q" _0 Q4 S, Q. hprintf("\n");
% u' O* [( v. b! A' V! hcount=0;
/ p$ C# n6 z( `, t; J; Hh=M;
" I9 c3 L# @! b" Tprintf("依次退出的猴子: \n");! l7 B7 R2 ~$ D8 ?1 u4 p; G1 O' F( ~
while(count<M-1)
9 j. m+ R  \# w{i=0;: G* z% d' E4 ~6 V
while(i!=3); Q6 ]0 k" d9 v0 x5 Q7 k
{ h=link[h].nextp;
$ y0 U4 \% \% E) N, e   if(link[h].number)% K8 E5 K& ]0 k9 u; L
     i++;}( q2 T4 x% N3 A% a( u- S( d
) ]  ]7 E. u: g8 G, l" z
printf("%4d",link[h].number);
: `. ]* ?6 f3 X0 Nlink[h].number=0;
  Z8 l+ m7 N& E/ d; tcount++;0 z3 y% T9 D4 B( X, P8 U4 N" {0 q
}
! t4 i+ d$ \) C  @! o$ N
$ i; ]8 {2 W. B; c) ^, {* ~5 K* Dprintf("\n大王是:");
0 K  K! s- h  ?. I  for(i=1;i<=M;i++)
/ P& I  C% M$ @0 P4 G: O  if(link[i].number)0 H/ g: v3 Y/ J* A& S
    printf("%3d\n",link[i].number);9 \! s* t+ ]$ G# @+ A

1 f4 K* t3 C; V) ~$ u
* [, x# N/ D9 ~; B1 F}

- o6 n# U$ Z9 }第三种是普通方法for循环

4 S& v3 ]' b- h9 ~#include<stdio.h>; ~3 K: h5 d5 j- U, Z
void main()
9 x8 W2 s9 L0 [, E6 _{ int i,k,m,n,num[50],q,*p;
6 l) z  M. r# H    clrscr();& X* h  z, i7 a0 A+ ?
   printf("input number of person: n=");: F: t6 H: V2 C2 d. \# q
    scanf("%d",&n);
; J% `3 C8 A. H- H4 D: Y2 @& Dprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
& F6 h' E6 F  @& X: D    scanf("%d",&q);" \8 z- Z# @9 Q6 ?, ?7 A5 d- d* y
   p=num;/ N" B$ n- N% p" ?: H3 l
  for(i=0;i<n;i++)6 g- o$ J5 D9 b) Q- b
    *(p+i)=i+1;
$ K  m) p0 \, H; L5 M9 A) R   i=0;
# M. ~0 T+ k' X   k=0;+ r+ o9 [1 e% O$ t
   m=0;
6 N. e* O# t0 M: {  while(m<n-1)
4 \- e6 \  r5 r$ a* C9 }   {if(*(p+i)!=0) k++;2 N- t( l3 Y6 w7 Z! B3 c; x' _
     if(k==q)
6 U0 `0 O( {# `- k      { *(p+i)=0;% j4 j; G  B9 ^7 z
        k=0;# g3 D, J& P% w2 E  k1 \+ ]1 m8 f
        m++;4 j* ^: ]  m9 z7 j
      }
6 S" s! J! I( i2 Z8 Y( _7 [1 T  Q    i++;
5 O9 q3 h0 x5 e7 h  ]$ M" o4 Y    if(i==n)i=0;5 p. ^. v) m. q! w; n; a7 }: B
   }
" @9 x7 y- P  K$ P) `  while(*p==0)p++;$ M' r2 K5 Z8 t. F& I
    printf("The last one is NO:%d\n",*p);
3 D* I; {: b7 |9 q# C6 D/ Q4 N     getch();  [' q" ~" [5 ]$ T$ L/ o: U
9 S9 W5 O2 t5 z& P1 v4 I# W
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;3 O! }- o0 J; K8 V
namespace 又费马达又费电6 H) z1 O' e* X8 e  Z7 V" ~( o
{5 Q9 z( t: y/ e
    class Program
9 A% n; \& G) W  t+ h9 o4 L0 l    {
' n+ x: T" C0 I        static void Main(string[] args). L5 N1 }: f" U/ s
        {9 x+ r  y4 n% e& M- H
            int m, n;) P% N$ |( _' U: F( M( [
            Console.WriteLine("请输入数组长度");8 A: R, x4 M/ h) `7 J* I2 Q  h
            m = int.Parse(Console.ReadLine());//m为数组的大小# D7 w& s! n8 ^' @. Z
            Console.WriteLine("请输入要截取数字的大小");' b% c. P. G+ X6 R
            n = int.Parse(Console.ReadLine());
9 d1 }+ C7 v2 `( S- U            int [] numw=new int
$ O* C2 C8 i4 c# K0 F) ^
! E$ ^( E9 h# c+ S5 e4 T2 `( P&shy;&shy;&shy;;6 @4 L9 ]0 v- U' F1 e4 w" |6 r
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
" S8 P/ E: ]; k) C4 K: O            {& V8 E" B/ p; s, c0 t7 ^
                numw[j - 1] = j;
+ V. F2 o) c% Y& i/ m- L* k            }5 y1 {, T0 i" P5 D' B3 Y
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!7 K7 ]* R0 r# y: ^2 u
            while (d != m - 1)
& ^0 n- t. L" [+ D* I            {2 ~4 P$ K0 k  X9 \* H7 l
                if (i == m && d != m - 1)2 [3 h9 r# T$ M: z  A$ ~
                {6 K$ q0 j5 ?/ r) Z
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
! @8 _% J. e+ ^                    continue;; K$ O# Q7 S/ `, T5 X4 B+ Q; e
                }" O& R2 r2 O4 W- |- A" L
                else- V4 D: W6 A/ ^2 }9 o. c3 e6 L# l
                {4 E: R3 m. r1 Y7 U; m! L
                    if (numw[i] != 0)
, u% m+ [! A% g4 Q5 v0 |                    {( F; O% e, \, `4 @1 C
                        i++;& X& W5 ^7 y# g5 `& _
                        k++;8 B9 r: C4 \# t0 H9 k- M( q' k9 l& o
                        if (k == n)
6 m# w% N2 D9 H0 q2 i6 A* ]3 d                        {4 `/ V6 w6 j) J$ I
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了& ?4 h" ~# w* K: K: b- l
                            k = 0;2 [  E" z* [5 ?( M: K
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
& w4 ^$ o, Z9 ~* n                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);; s: h, [2 l3 B8 ?6 p3 X
                        }
( e: {( Y8 T2 b) h                        else//输出暂时还没有改变数组元素的值
8 T6 y- O' j& t0 R                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
  x/ T& d1 W7 M8 |7 W4 p2 a                    }
( f7 w  ]! X+ N- n' a                    else
- y7 U$ x  _8 ^* c                        i++;//数组元素为0,直接跳过,不计数。。。
$ X3 q; g: h+ M/ G; ^0 R  @7 i                }5 H7 G# T" d/ E# U1 E
7 N( e' i; d( u
, W% }6 b) c0 M; ?$ a) r
            }//结束while循环
# A  X; N8 d+ [            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦4 w/ ^  Y8 s; t( Q
             L# P% ~' {9 _$ x
                if (numw[i] != 0)8 l- c- J& F( y( b% g
                    Console.WriteLine(numw[i]);
1 n$ C( q( w0 ~           & Y# B. V6 Q: j9 D3 r0 ]
            Console.ReadLine();" o) m" m* O- n- I/ Q, \
        }
# \1 C: h5 K7 U7 C% ?0 X- R0 g    }
) L7 }, ~! P+ h4 c9 z* J' o}
+ S7 ~/ y0 J, U
小甲鱼最新课程 -> 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-26 01:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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