鱼C论坛

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

猴子问题

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

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

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

x
大家好!* f+ h/ S& M7 A& q9 `( Q, R0 }
这几天我在忙着编一个问题,我用了一种方法编出来!- [- L% z& x( F. z
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!6 c4 L+ p4 o( ~1 C7 l3 r. }
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
! p) U) G5 o9 w6 x- m( j
: R4 D: f4 [* {7 l% H5 n  @7 S4 Z0 b2 o5 c0 }2 z% |
                            题目) A" C# c% V. M
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
' F9 j/ V5 M( }/ z第一种方法:利用循环链表0 |/ u, y; M9 B5 P3 T+ }
#include<stdio.h>
4 D- u/ g* s6 ~* U. n! k% ]#include<malloc.h>4 B; O) J8 J1 \: [3 V0 u6 K5 p' m
#define M 8            //共有8只猴子
" h6 D% _: z+ i6 J0 F8 ^; S3 _* T#define N 3            //数到3只时退出第三只3 h7 q' y9 ]4 \% Y$ u2 q) A* D2 K
typedef struct monkey
  Y. e' K. R4 W  T4 q- I/ Y{int number;
: G4 _+ X4 h& Y. D# o, \: N  R! Eint flag;
* d' [' v! I! c3 B' Tstruct monkey* next;
, S% `+ j% R5 h0 O. U9 G}MONKEY;
- t- K2 P& O. ]& ]* F9 kmain()5 Q* X% Y4 _) X8 s% Q
{ MONKEY *head=NULL,*p,*s;/ Y8 S0 G7 o$ L. f9 m6 A9 |* y
  int i,sum=0,count=0;
! N& y. `- a6 y  clrscr();              //清屏" v8 f. Y; a9 {
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存! i( _( d) j/ G* x
  p->number=1;p->flag=1;6 F# H9 g% T4 x+ O/ B# Z
  p->next=head;# I# q. A. |6 D: z1 l
  head=p;
& v. `" N7 P; |  for(i=2;i<=M;i++)1 H. t, D5 t- v* x9 X% e
    { s=(MONKEY *)malloc(sizeof(MONKEY));' b5 v* n- Z3 e, m, A1 w: j, j6 F
     s->number=i;s->flag=1;
9 w2 s" l7 D5 H8 N. S     s->next=head;% z" Q1 I: r0 d$ R( d
     p->next=s;p=p->next;
9 W& U( w7 r( H7 ?, p' W    }, O1 k  b- y0 a$ `+ u
    p=head;- V, ?5 {4 @4 F: _% J3 I
   for(;;)
6 \9 |/ U, J+ k$ A/ w    {if(p->flag==1)
* o( ^* x+ J6 a, E       count++;
0 n* z4 C+ e, W0 Y" R2 u4 g! p     if(count==N)% k) ^+ H$ A! C: r2 o
        {p->flag=0;
& m% v9 v* G$ f# |( r' ?         count=0;
$ M+ m: O$ k" X  \' A% L# c; N0 u         sum++;}  g+ ^5 |. E6 |4 h, d! A
     if(sum==M-1)
' q" f. @" E0 m( H) y& I7 k$ c        break;/ [9 [: A: ~3 R% h8 N8 f5 \
     p=p->next;4 G4 m7 M+ `' U. C
    }
3 u1 p/ u: V9 \/ g% R3 E    p=
4 w+ F1 Z8 ?) O    head;0 n) o9 o0 H2 B7 B9 M
    for(i=1;i<=M;i++)
3 O8 M, J8 @) q7 D% `4 r. K    { if(p->flag==1)0 E! X" D$ e0 i. Y2 v
        printf("\t%d",p->number);/ h  @% h& l& r0 J+ u
      p=p->next;
; T, ^% S6 }; c& @0 E    }4 M* u5 [4 H- M

- h4 p7 h- U$ y: D4 Q
* l7 {$ p3 e  t1 X4 a8 u) E7 `( x) I8 M  q+ k
}

' ^) d- a0 v( M- O0 y4 I第二种方法:数组. J* l, z  P+ M/ s2 K, P+ E
#include<stdio.h>, V" n) _7 h2 Y
#define M 86 j( O9 W7 f. ]8 g$ G
struct monkey8 y0 ~4 b2 [# w( Q$ ]. t1 @0 l
{int number;  a0 _2 X; y; c& e' V8 f
int nextp;2 U9 d! S4 x  l1 ?! X" H1 s" |
}link[M+1];
7 z2 Y! J3 ~& D9 z/ x; }. a) g0 H8 O* P" j: P% v9 D
void main()
1 Y% q8 e5 o4 x" W6 \) N! ]8 ~{int i,count,h;2 y  u, h2 Z' U' _+ }. R& T
for(i=1;i<=M;i++)6 R6 m; b1 n: ?, H
{  if(i==M)
6 ]* V& a3 }, E) d: R7 ]   link[i].nextp=1;
1 Y9 y0 d% A; D4 w3 z+ A5 j) Y   else
9 n. b) _+ t6 n/ W0 E   link[i].nextp=i+1;
# H1 H; |. ^4 n* ]' k$ h2 K! X  link[i].number=i;
5 w( Z1 }8 U# G/ D! ?}
. V; G' V  \! N5 \* }( U7 @printf("\n");2 Z0 t& h$ S% P0 f
count=0;
& e9 e  D2 i: c/ b4 w# sh=M;
/ Y! O: p! y7 `printf("依次退出的猴子: \n");
* U9 b3 B: D! j) X# C1 X/ ewhile(count<M-1)' u2 d) D  |- I
{i=0;
' E  ]1 j9 p3 x5 h9 Rwhile(i!=3)
. p  O5 \! t- }5 l9 ]6 i& Q' p{ h=link[h].nextp;/ D5 b' w8 y2 L8 t
   if(link[h].number)
% l' @6 T* ]" `' W# T, V3 F     i++;}
# s) u: T* @* B' b. K/ t) M' R
7 f! R/ z# d& iprintf("%4d",link[h].number);  H0 H: H8 `% [/ X7 T  y
link[h].number=0;5 L+ A# H: F0 v$ w3 I5 G
count++;
% q9 n; G, D; z2 c}9 K' e  |* u0 A

, c, d( ]9 _9 U8 Q" `8 P1 j1 mprintf("\n大王是:");6 D! L! P( t4 `
  for(i=1;i<=M;i++)( b% y, q$ w( E- C: e' Q
  if(link[i].number)
  V1 h; [6 ~. E( _# ]( |2 l    printf("%3d\n",link[i].number);! v2 V8 _7 q( e
. E2 c, p/ a! C% b) ]
" @( {, I5 K5 ]9 i6 d+ K
}
8 Z4 g3 z, }/ x* V* V# Q
第三种是普通方法for循环
, |4 `$ s& m1 ^, X. }! b" n1 C* P
#include<stdio.h>
2 `8 r2 X/ Q8 Q! M( B& Ovoid main()/ J+ O( t6 M% \: L2 F
{ int i,k,m,n,num[50],q,*p;
- Y" @) t# |0 Z! [6 P) V; U    clrscr();8 t/ U/ E3 k9 k- N* A  h) x
   printf("input number of person: n=");
; I8 K* m3 a& q1 b$ k    scanf("%d",&n);& D+ t. f6 K$ t; y1 ~! Y4 O
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只/ k4 @! G& T5 v- d
    scanf("%d",&q);
7 \5 }) N( I( w4 r3 [   p=num;9 i0 ?, T# [8 N7 t- n7 N& W
  for(i=0;i<n;i++)+ L/ G$ h' c, v9 a
    *(p+i)=i+1;
- W# U0 M  B2 ?   i=0;
# U* X% n7 p8 a3 `2 W   k=0;
- j3 i5 X$ N6 h   m=0;
8 o: w. G  V) K6 j+ Z  while(m<n-1)
% j/ M* M5 p8 F( X  X   {if(*(p+i)!=0) k++;' S4 R+ l+ c5 }* V0 [2 R
     if(k==q)! o5 c8 k0 a/ p! A- {
      { *(p+i)=0;6 B- ~3 p0 X& }
        k=0;
7 r" a3 N2 d' g7 C4 C* ^        m++;
! l: W; S+ _4 B( R/ w. P5 W      }
) m8 r. h% q: T" F8 _    i++;9 Z2 Z" y$ F* U
    if(i==n)i=0;
$ J+ h/ n2 P1 X5 y$ A9 _  [   }+ ?, }& g3 U2 N
  while(*p==0)p++;
1 L/ P. `& m2 H" }    printf("The last one is NO:%d\n",*p);- a1 K9 M. a4 C8 V( H
     getch();
2 i2 s0 T$ z: v# b, w% }
( O4 @& \4 w! L0 d0 \! L5 G}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;' B, t0 w' ?, F: P: v
namespace 又费马达又费电8 m) m, G. P5 f/ ]/ ]. y
{
4 f  @* C# E1 ]0 y# z! ~    class Program, L, d5 W+ @, J( M
    {
: @/ ?% o! A0 Y' j! {        static void Main(string[] args)
: D& S# S$ W9 U& M" j/ g1 R! \; ?5 f1 a        {  q+ S/ N  C8 t% h! j0 }
            int m, n;& s* O' B- b( z9 n
            Console.WriteLine("请输入数组长度");" ]2 P; p- l1 t8 m7 j5 e
            m = int.Parse(Console.ReadLine());//m为数组的大小
7 j! y3 S+ h! C8 k$ c+ Z/ \. C            Console.WriteLine("请输入要截取数字的大小");
5 `+ E' l) J/ r            n = int.Parse(Console.ReadLine());6 G3 b8 W( n: x' l1 X  V2 x
            int [] numw=new int1 Q2 J( W: i9 F. x% B

- N- A" H5 @. J! J# C&shy;&shy;&shy;;6 M" M* Q* P& K# q) g
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数1 u. h8 s2 R; A" x/ D& @
            {* K4 n: h3 W8 d) Q0 ?# }
                numw[j - 1] = j;
5 [" Q  U) v# T1 {( q            }
) ^3 v' [6 [+ A5 s+ h8 x* G: \" e            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!0 {8 ~& H9 k5 K) H" ]
            while (d != m - 1)$ I5 z  k* \* Z6 Q, z/ q7 z2 P
            {
9 s# J0 X) f8 o( Z                if (i == m && d != m - 1)
1 o1 T* h0 E; [) P/ x) O                {
: u8 |( V* {, P" U. t/ G% C                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
( G' g* c/ f+ j% W( I/ k                    continue;
: S" N; \. S1 }, Y  f6 i# f                }4 F( t: D7 @, l+ X0 ?' Q' x
                else' K' q& |. r2 Q9 l
                {
! y- ]$ J( o8 W' O0 |  o  o                    if (numw[i] != 0)
9 @" z) i$ Z) k6 E2 m' U/ y# O                    {
( ?+ G0 _5 A& a  C) }                        i++;# W( M; e7 B" J8 \( W; d
                        k++;7 h+ R) H( x/ {% R
                        if (k == n)$ s/ Y; d& G( Q
                        {8 I% M( f5 o9 C& U0 s( L
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
5 f$ _- i% _6 n2 Z$ P+ f! f% g' t                            k = 0;
7 U9 U6 z  _7 u* b7 X              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1% U4 {% A5 @2 O: y
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);9 x' u5 t; b, S  R* J1 b
                        }* V) D1 V2 I" v- o# u/ n4 q" c
                        else//输出暂时还没有改变数组元素的值) i: T) I: w4 w9 }5 l
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
+ n+ v$ ?# b9 F/ W' O: [                    }+ `; _9 W! I1 x3 n9 ]; `/ L9 V% O
                    else
( c# y0 F6 y5 A8 b7 ~                        i++;//数组元素为0,直接跳过,不计数。。。. D% `! T) P* Y* f+ b( v/ M' s$ \
                }
5 h' j! O9 L2 m& i3 m  F - D9 C# j  }9 s/ O. P2 J

. U8 E4 W  ~0 V+ |, P  H. [            }//结束while循环$ B, l$ |- Q/ I+ Z7 k) H& Y/ j
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
; W% H9 f' M( R) d6 R           
. b: \6 x  {6 p1 N# t                if (numw[i] != 0)
% i* ^4 l$ I% E7 t' D- f7 [                    Console.WriteLine(numw[i]);; I/ ^5 U, I! i
           , U$ E2 V) W; N, f2 u" u  |( ~
            Console.ReadLine();
# I4 K/ u9 c% n5 W/ G. c$ f        }
# S7 z. Q) L( D1 n5 P    }
+ I' v  g1 Y! x' W  {8 K. H}
" ?1 C# N1 A  z3 `) m& v
小甲鱼最新课程 -> 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-1-18 00:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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