鱼C论坛

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

猴子问题

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

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

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

x
大家好!' q. w  @* {8 f, a8 Z
这几天我在忙着编一个问题,我用了一种方法编出来!
+ M- B' R3 M$ u1 v8 k* W% T但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
. ?* m. u0 A/ V- n3 ?4 {) F, _注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
9 T7 I; u) m- c. m6 R0 x
/ W$ d1 V! y$ S. {% j* v+ T& S1 a& h5 j
                            题目% Q2 L, ?8 |8 N; E2 h, }9 {
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
: ~( C4 I8 \) F7 a1 {第一种方法:利用循环链表6 o4 }0 K8 n5 u6 u; s. R
#include<stdio.h>/ c8 @! l5 q9 S3 }% V+ w) \
#include<malloc.h>6 [: T9 d- B# L( `% L
#define M 8            //共有8只猴子! p- N- }( r& @) Z3 ?. t  A
#define N 3            //数到3只时退出第三只
# `, T3 g8 s6 d! ^8 c$ Rtypedef struct monkey
. d6 n# ]4 c  G! D2 t9 c" i* L{int number;
7 x$ Z3 @( M) D% d& {" z' W1 Tint flag;" j- |8 s7 a4 s/ c) N5 C# D2 J
struct monkey* next;' w0 b, d8 H) V
}MONKEY;
, b0 t( y4 ~7 h6 Q; Imain()
/ Q, C, \: ~$ f( ?  k2 A{ MONKEY *head=NULL,*p,*s;
2 N% v) A7 ^; d) g& e  D9 J  int i,sum=0,count=0;$ F. w8 e7 ?! N
  clrscr();              //清屏7 s8 Q5 N) [! ^3 T
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
) N( \* X3 p% f* G  p->number=1;p->flag=1;
9 i* K( s% }  ~9 R( T! n7 d$ b, a  p->next=head;
" Y1 I7 }% ?' N7 {+ |  head=p;
' X+ ^* [+ h4 i  for(i=2;i<=M;i++)! d3 c: q; ]4 y2 Z; S6 Q. E
    { s=(MONKEY *)malloc(sizeof(MONKEY));( j  w; d1 S" ]: ~  ?
     s->number=i;s->flag=1;
5 l$ z+ \1 r' S) b     s->next=head;) C- `. P: W8 L( Z
     p->next=s;p=p->next;
' O: h7 z0 {; i, l! S% w# K    }
5 l% {0 `- t0 T2 D( X    p=head;
9 Y1 _5 S2 I( M6 s/ o   for(;;)# K/ T3 Y. o% y$ N
    {if(p->flag==1)
( ~' E/ ~) W6 e: q       count++;: G( X. Z3 b0 B! i
     if(count==N)
1 d4 ]6 |4 o- I2 u4 w$ R        {p->flag=0;) w1 v! s% V4 @: I; Y+ {) A& r
         count=0;
% Q" R  w  `7 q; O; ]         sum++;}
9 ~5 S- E$ F: ?  }8 N     if(sum==M-1)
5 L5 r+ e5 i0 v4 e( W        break;
7 }) a, o* o/ `     p=p->next;
7 A0 m1 B6 V, @3 C! ^1 j    }2 b* f9 N( A+ r0 X/ [) e, l
    p=' I( X* a8 z) q3 K
    head;
- g2 t; s* Z8 R4 J2 C    for(i=1;i<=M;i++)
1 K# p2 S5 G) {    { if(p->flag==1)
. o& `7 t! M( a: E/ D6 ?% Q        printf("\t%d",p->number);: s) _0 I: u0 \, J( s- ]
      p=p->next;
8 L1 _+ y9 T& i1 L- I, X    }
! A$ n" o. Q8 o- M/ l" V
8 f) Z6 Q/ b% x0 C9 v( v, P0 ]7 r) C' J1 W( X$ I8 p- Y+ W

4 h1 S/ }+ T8 i# t5 V% Y5 f}
: a/ ?- @* P  U2 o) ]- m
第二种方法:数组
5 R0 f+ A1 a  ^, Z#include<stdio.h>
, y% n2 B7 Z) }3 C#define M 8
0 C' t' @1 {$ i0 Qstruct monkey
- X- ^0 H0 d+ o1 v{int number;
7 |' l1 @" Z) _$ {2 R; ], N9 N* uint nextp;. |' r% x6 i4 e. |+ L
}link[M+1];
7 _' h3 C: o1 Y" ]) G4 Z, T0 `6 v+ V; B( {1 Z" _+ L. h7 ~! ~
void main()6 x( U9 t& s+ @, F1 \
{int i,count,h;9 }1 j" r, h* z, N8 G3 @9 [" ]6 ~
for(i=1;i<=M;i++)# W: ~  b# u! j
{  if(i==M); l( y# I) y! ?5 G& E+ A
   link[i].nextp=1;1 L( f7 I1 i' C/ Q, l
   else
; ]$ d! ^/ M+ j, L3 A" I" W+ O$ F   link[i].nextp=i+1;( p. l9 D: v9 u" s
  link[i].number=i;/ C7 o! z2 J( g. ~8 F/ T
}1 O5 G6 }8 R: O  i7 X, @
printf("\n");
6 ?1 |% H: ?& S9 m* ]# @9 \count=0;
- V* S+ W& j& ?6 M2 b$ Ah=M;
$ I  ^! ~3 s0 e0 B% M" Hprintf("依次退出的猴子: \n");
: q7 W, b' F- \( P) vwhile(count<M-1)
9 |" |5 F, v( p$ z6 Q. Q. G  B2 C{i=0;
( H; Q' W$ ?5 I8 r+ owhile(i!=3)7 [5 h1 E# v# v6 K; V, E$ h5 [( V
{ h=link[h].nextp;
3 D+ h: K, k* ]( s/ T2 e  X   if(link[h].number)& p) R( @, \3 }1 P) w' C
     i++;}
: o8 R" W% g( p; \, B+ c2 v5 y
" N. q+ R- [% q. w& @  gprintf("%4d",link[h].number);
; f5 _8 N( V) _/ [6 G7 v* hlink[h].number=0;
1 t5 G" x6 I6 c0 P3 D8 Q- Ccount++;
! Q$ U6 E0 b. B}# f5 H5 X4 t' q' P5 g6 @

& `5 t4 u: ]3 \3 d* r( }printf("\n大王是:");
7 ^: i6 Q. K- G! U7 F  for(i=1;i<=M;i++)
9 k# e" B+ Z8 t/ x: S2 P, n4 E  if(link[i].number)( g1 w- D9 |- t+ w( J# [
    printf("%3d\n",link[i].number);
3 M& F& C! T" ~5 g0 x+ E
& W/ ]: B$ F* ?: F' Z/ O, {2 k; X4 c% O+ q7 I) v
}
/ x* C# Z- F! T4 L& `, s, A4 O3 m
第三种是普通方法for循环

9 p  \; M6 B& z6 l% t- D#include<stdio.h>4 o) X' `: f2 b) E+ |( Z2 j& ~
void main()0 A9 `0 W% x: M4 b0 k
{ int i,k,m,n,num[50],q,*p;
- g! U: P% T7 T9 l6 P0 C5 b$ a( {    clrscr();
+ A( ~- I2 _; m% \# j( n   printf("input number of person: n=");5 e9 R! m! S, I$ _+ l: C
    scanf("%d",&n);" F) e/ z8 I2 s: t6 d' g) A- N
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只. T: I, J% B4 O' e
    scanf("%d",&q);
8 r& q. f, b2 Q9 B* Z8 P   p=num;9 c+ L+ @) p* {6 s  c
  for(i=0;i<n;i++)9 ^: p( P: t8 h2 d7 K5 H
    *(p+i)=i+1;
. K6 v, i. A0 [! M0 J% @   i=0;
: O. _. D# g8 d* q   k=0;  y& g- `2 W9 [: |
   m=0;2 F) u( H, z3 [) ?$ ?4 v
  while(m<n-1)
* C0 J1 g5 ~9 T* E$ K   {if(*(p+i)!=0) k++;
2 F6 V' f# T2 S2 c     if(k==q)
) Y3 I" ]( B, U# G      { *(p+i)=0;
* U4 s% @- f( \# e% h        k=0;
* `) ]) Y. w5 R/ a" K        m++;2 c( r! c/ g2 `6 N" \" {0 i
      }2 S& u' k2 m# s. H
    i++;
/ T7 Q0 j. {1 c3 y9 t( {    if(i==n)i=0;! \% D2 C1 ]0 U) u
   }6 y6 h: `- x+ G/ w
  while(*p==0)p++;
" E: n; t: J4 y7 Y    printf("The last one is NO:%d\n",*p);
( y7 _4 O  U. W$ p" K8 i- ?7 O     getch();; e! P3 A: i( ~
$ z3 [7 h. X) X, E* e* i
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
  W* R6 x+ i  K# d0 Lnamespace 又费马达又费电2 e. H5 l/ I: ?# w
{* H# V2 U% ^  T: a2 u# v
    class Program7 b5 m3 ^' [: [( n% G$ V
    {
2 @4 O2 e' L& o, Y" W        static void Main(string[] args)$ x" Y2 X, {+ {! W3 ]; Q" N4 L
        {# V$ `1 _. y# Q( M5 g5 j5 ~. R
            int m, n;
$ `) N8 o6 f. h; w% g            Console.WriteLine("请输入数组长度");
5 P% u* ^- G# o/ C+ i0 H            m = int.Parse(Console.ReadLine());//m为数组的大小
. z$ ~. \) F3 `0 Z! e! a% h            Console.WriteLine("请输入要截取数字的大小");+ s6 T8 \  w+ `: x8 P
            n = int.Parse(Console.ReadLine());
) H! C5 S3 c1 r* E. D) c            int [] numw=new int% M3 U! A" L5 M: H8 |
5 c& v  }) C1 I& |* P
&shy;&shy;&shy;;
; T! ]  A+ f0 D3 P/ a            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
; e3 H4 X5 g/ Z$ D" h2 k, n* ?0 U            {
; U) y3 Q3 x& Y                numw[j - 1] = j;- t3 q; E! f- L2 d
            }
/ G3 z0 E" b8 M$ y            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!* @, @# |' T8 O+ f  h) \/ f
            while (d != m - 1)' q0 x% {5 |8 r! z8 O$ A
            {
0 g+ @6 v3 [1 w- a5 `2 E                if (i == m && d != m - 1)* U) a+ {. u& x- K9 F
                {
1 x2 S: j( T8 ^) A5 K+ R; L; N                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
$ |1 D7 ^5 F; z  ^% T% x" f8 }+ x3 r                    continue;
3 U- f3 C5 C" @+ r                }5 l) U9 J8 R5 Y  T6 p" K
                else$ f. V& U1 Z0 f/ y! }) G
                {
; j$ n( j) j$ P1 X- Y5 D                    if (numw[i] != 0)2 _5 N4 n: I, \: R% o8 d  U
                    {
1 J- B$ @. K& ^/ e  H1 X                        i++;
$ t2 H# i8 ]8 X) p2 u                        k++;% H$ m9 ^  p; l$ w
                        if (k == n)
6 p* B* \( ^% X                        {
" S  W6 e) I) H) o6 Q9 @                            numw[i - 1] = 0;//把在n位置数组元素的值改变了3 o! \: d  g  d( q, `( ]0 O
                            k = 0;
3 j: _7 Y( n+ `( R) d# E              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1, B; I& G- n3 G, X% d
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);* N  N: @, A. y  s7 @' T
                        }
6 n4 Y1 N3 R3 U. C+ j                        else//输出暂时还没有改变数组元素的值# K8 A5 H& F/ b5 ?' ]
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);) B7 ?- ?3 I* g' y7 M4 C1 B  ?4 j% S
                    }. x& W" S! c- ]7 Y2 q* a3 L% v) |; E
                    else( g8 E6 u6 F% J8 Y+ Q/ ]% z: i
                        i++;//数组元素为0,直接跳过,不计数。。。9 K) P+ N" p9 `  b, J! H/ Z% S' ]
                }( ?! L$ t$ I; R4 ?! @6 P- c
4 p/ X& P! p! q/ [( A& ]3 D0 p

/ @8 V" e: }+ |6 D            }//结束while循环
- g: d1 S$ W3 R2 \& R            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦7 J5 T& q4 _9 g% i
             x$ R( T5 s0 G! U3 `. `, ]4 }
                if (numw[i] != 0)$ |1 D! s$ U( [; L2 v/ m4 X
                    Console.WriteLine(numw[i]);& U1 ?& B+ K8 J" T/ _4 ]  d3 d8 w
           ; Z% C. f: T# n: j
            Console.ReadLine();
3 i1 @4 t7 k( {( k" n7 \, T        }
  U& G  q' P4 r! d    }
2 b9 ]  g; s' W, K}6 M" j9 O; ^4 J, s( W
小甲鱼最新课程 -> 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-4 01:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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