鱼C论坛

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

猴子问题

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

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

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

x
大家好!( Y/ F" t4 L0 u) G
这几天我在忙着编一个问题,我用了一种方法编出来!
( h. s- E* E. x- A" S但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
9 ?% Y7 Q. u9 @' q! O注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 0 I9 @; }. r  |+ n# u
, S/ H" A  g( A( F3 H) `! P5 X5 y

/ z9 Z  m9 v0 y/ }, `* c. y/ i
                            题目4 }; j+ D5 K( G0 s$ x
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
' I  |+ u# P  d3 g1 s1 U第一种方法:利用循环链表2 N1 l" w% u- z
#include<stdio.h>: y+ X) t: `1 B) i; w6 M9 h
#include<malloc.h># }# ]0 \; n* j8 o$ F- H( m1 m
#define M 8            //共有8只猴子8 t0 c8 x/ M& v0 p2 }5 P/ X
#define N 3            //数到3只时退出第三只# w( U) e' S2 h" U
typedef struct monkey
3 C3 B" P0 H. r% H. J9 m$ |5 i{int number;, n5 m6 \2 B# ]
int flag;
, A3 v3 P4 P3 Y0 wstruct monkey* next;+ u$ p& V% J0 N& T4 h: ^7 U% q% \) k
}MONKEY;' h5 A, n  M; j2 h, a" o
main()+ T. H; Y+ Y$ Q% {9 T- d
{ MONKEY *head=NULL,*p,*s;* `) M. F# k, e
  int i,sum=0,count=0;7 f  [/ F5 w  K' k$ V
  clrscr();              //清屏
/ }3 ?- Y5 G% E* ?8 L  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存! ~0 Y$ O- \/ G" ^  b( l
  p->number=1;p->flag=1;
0 w# D1 Z% Y% K$ I; P  p->next=head;
2 z# ], U  B: C! ]  Z4 |& R9 I  head=p;
$ j6 C& l' D6 F4 {8 q4 b1 o4 i' F  for(i=2;i<=M;i++)
# T- r6 y' s9 A    { s=(MONKEY *)malloc(sizeof(MONKEY));
* ?+ x) s7 G, S! E, i" R' ?     s->number=i;s->flag=1;; K4 ]% i9 @$ i/ m, V
     s->next=head;
* C3 X/ n- s1 H5 i3 `; w' I     p->next=s;p=p->next;
, ^* `/ F. |/ c& X# y& U6 f5 h    }; X- x' V# o1 v" ]% w3 K. u# @0 L. D
    p=head;
! L' P5 M0 k: y) |   for(;;)) G, J# s/ T. X. V! Z) X
    {if(p->flag==1)
( Q: `  R9 J! \       count++;0 G$ b$ u' M$ I; ]( u/ j* l% q1 m
     if(count==N)
% b! o+ ^8 O& v6 r0 n3 n: l) Q; `        {p->flag=0;4 ]: Z. p9 x6 W7 `
         count=0;
7 R2 J, A& p1 A# b' c0 a5 @         sum++;}
! [! v  Z3 s, H0 Y2 v' T     if(sum==M-1)8 e. ~- K/ j# Q8 w
        break;! q  u- l1 P* l% c9 q% |/ i
     p=p->next;
; c6 j$ |; v' I; M, ~9 U    }- c1 W: u1 t( ~* l$ J; w
    p=
1 a  N; [% D* N, ]5 T4 m7 x    head;
/ f( m& t$ V, G9 Z. Y6 j5 z    for(i=1;i<=M;i++)
6 b* G2 ~( s0 F. f& P* K    { if(p->flag==1)
5 {% N6 i. e& U        printf("\t%d",p->number);
% I) U) N5 B, {8 t1 m; b: ]9 ^+ V      p=p->next;( T% I# e" q0 {- p! ?
    }
- Y( E/ {; K0 y$ X+ r. P7 E8 ^- ]
1 q5 ^8 j0 `$ e) q, E$ Y& n3 K& l% I" p2 p" c- g
  C& M) P% Y1 A1 M
}

5 x- U6 ~/ E; Q8 y. u( ~: g第二种方法:数组
& p2 ]2 v& O; }" c+ h#include<stdio.h>
& c3 R. v3 o/ T1 o! L7 R" y0 |#define M 8
+ |0 Y/ |2 i/ M* ]# P2 I: M" W, Wstruct monkey
1 w* t7 ?& Y, y" r0 C8 I{int number;! L* j& F' @; \: ^! h+ s) [
int nextp;
$ w- y0 K/ ?+ Y7 ^}link[M+1];( ^- L6 C) E9 e' q

2 e# R9 M: x* t5 C# F5 Svoid main()0 ^" X8 d1 V! r' L
{int i,count,h;% D/ f" ?  S7 V" ]$ @% _
for(i=1;i<=M;i++)
0 Y1 b0 K( `' |* K' a{  if(i==M)
# w. _3 B0 u8 T   link[i].nextp=1;& F2 X6 `7 _7 `- t$ k7 i
   else
* a3 p2 f6 g+ a/ W2 y  D& g& Y   link[i].nextp=i+1;6 |. m  }3 I$ ^8 b
  link[i].number=i;
, G' H$ F: C9 k' M- U. z- ~6 X}
6 W! B6 l; X/ u! r2 i, W; qprintf("\n");1 {" H( q# d. f: ?$ G
count=0;* w9 z; j3 G4 Z" m% M* c4 P+ S; z- |4 Q
h=M;
& ]. a* C: g3 B6 uprintf("依次退出的猴子: \n");- ~8 A' @. G( j1 j7 a4 Q
while(count<M-1)
/ T5 g8 X5 @3 S7 P{i=0;, H! p  {+ s9 ~6 h
while(i!=3)
# t" [) j" ~$ A4 S5 `. T{ h=link[h].nextp;
1 l2 m; C& s$ l  R   if(link[h].number)
5 y; v& N# Y9 n4 Y0 g' B$ y3 \7 z! ]     i++;}
" u0 _% P1 i; x2 k! a6 @
5 b6 x9 w, D% u! E5 E# n& W/ hprintf("%4d",link[h].number);, E, Q$ u6 F* W2 S/ \" Q
link[h].number=0;
- k0 [  \% ?4 b4 g) ], e. N9 scount++;
, s* R( D" U6 E- ?8 }6 L}
/ k7 ^( n: c% e* J6 j# ~, S" e0 U3 l/ n7 ]; {3 ?
printf("\n大王是:");- ~. U) e$ a6 ?# u8 i
  for(i=1;i<=M;i++)
6 ^7 D  S+ l) P  if(link[i].number)- K0 o2 J( Y) i8 I' _
    printf("%3d\n",link[i].number);( z2 a# d6 X( E9 c* {
7 [# _8 @: p. I
8 ~6 h# ~$ W+ K2 L8 `
}

4 `" i. r$ `/ K/ q! v第三种是普通方法for循环
$ P5 _. y5 d3 ~2 h
#include<stdio.h>
0 C" b: M: _" I, v/ [: Ovoid main()
1 g5 K! h+ ]8 |7 S{ int i,k,m,n,num[50],q,*p;, [" G# e& q" r1 r( E6 y$ y
    clrscr();
1 E4 p9 g7 ]5 R! f   printf("input number of person: n=");
- p/ A, Q1 s8 h    scanf("%d",&n);
6 ], V. g2 g6 i4 Eprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只8 ?% L( A5 U6 }
    scanf("%d",&q);9 w3 X1 h& z6 z$ ?
   p=num;
+ Z4 ~5 h6 [$ l9 ^  for(i=0;i<n;i++)
3 q9 V8 q9 ]: p  k5 U9 g    *(p+i)=i+1;" t$ {/ n4 r" g" V6 f, }
   i=0;6 S/ n; t2 P  [0 k7 i
   k=0;
: k# n( e6 I. [- s( P4 R* a   m=0;
0 Y6 r1 [1 f+ i2 c4 O; O' a/ A  while(m<n-1)
3 V7 |, V" e: a' P! _) X* C) n   {if(*(p+i)!=0) k++;& k3 I( {9 _; q( P
     if(k==q)  r6 t; k" R7 X; ]7 I/ x5 O5 S: t
      { *(p+i)=0;
: G! ~0 u  O/ k, e; L* x- z$ ~- @# y        k=0;! n! k2 K% B: w/ S/ ~
        m++;
6 i& F) |' U0 H+ {# |      }2 ~* Q9 [7 r" A
    i++;
* F! L' h& `# }. H    if(i==n)i=0;
+ B6 ^& a- l$ M9 o! b   }
7 \9 @* b3 @1 G: k  while(*p==0)p++;1 g1 C" J+ f8 w. s
    printf("The last one is NO:%d\n",*p);# O- O* Z3 z4 j" S5 P% @9 E
     getch();
# P/ u) T+ @9 [, ^! v  ?3 b& Q
; ], `* ?: Z# V" w! ~+ `$ b4 O}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;9 ~% @+ c/ o8 ~. }( G9 L
namespace 又费马达又费电
% k  s' v+ C! d' ~/ K2 \. s{
' l# ]0 C0 t7 J9 a    class Program
3 A1 Z' D# n7 {+ v  }8 A( p( q! u' ~    {3 N% x3 \( y$ p1 k0 j
        static void Main(string[] args)
& R# F! B5 G5 L' l% w        {& }& D# e7 a% S5 c% E
            int m, n;
% I3 ~" i# w( H0 o" c$ ~9 z            Console.WriteLine("请输入数组长度");
% b* u, R1 Y3 @2 Q            m = int.Parse(Console.ReadLine());//m为数组的大小, H+ i, p* ^7 u: w: r4 u  G8 P1 Z
            Console.WriteLine("请输入要截取数字的大小");
* c6 k0 @. P. w7 L# k; \7 u            n = int.Parse(Console.ReadLine());
) e4 E4 c% z9 V. q6 R9 ]1 Q            int [] numw=new int2 x* ^. }9 ~9 z& N; J$ G5 D
: n) j( a& P) H5 M" Q  ~: u; {8 E
&shy;&shy;&shy;;
& B0 t6 J4 U3 j8 V+ P" b8 e            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
: o# _$ B7 {) p; q            {* T& V" y9 I& z) t& N7 u$ T3 X7 X
                numw[j - 1] = j;
! z) Z; P+ b6 D! o            }
' y1 S/ D9 `, t1 a% h# f            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!* W  W, q2 o; \% V- l
            while (d != m - 1)
! k% C, }) l& V* n* V3 S            {
" B' r8 B: \8 D! H& e                if (i == m && d != m - 1)
" k: R* b' |& L9 m+ J) J2 Q                {
( K! Q# k! M; u/ m/ c4 K+ U                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
- i6 G* k+ u  y                    continue;9 k: ?. b$ ^- Z; U, Q$ C& u( p
                }
! _! q# V( {% p& _% s. L) ^                else$ L# O6 U3 b6 M
                {. f; \4 ~1 Q4 E5 {
                    if (numw[i] != 0)
! u: n& x% n5 G: O- \4 b" u. y                    {
- l$ F$ ?! ]5 c% x2 W                        i++;, o* a0 n: O% v# g# C
                        k++;
2 Z  _0 u- ]# D/ r! Z# x                        if (k == n)7 A# ]! M' s9 {- l6 z' T0 h1 N. V0 Q
                        {
/ E' ?7 m- I; l7 a" C$ q9 o                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
  `- f: j& X) |2 c- j                            k = 0;
' V6 J, a, a% s- e- T+ @5 f              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1, _/ Q! W$ Q7 O- Z* C
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);+ d( A* T- q2 |6 q1 h  G1 \
                        }6 \- `2 C0 f0 N( }/ {* s' S4 F
                        else//输出暂时还没有改变数组元素的值! h, H+ ~- o! h0 E7 D
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);2 m0 A2 {' W% ?  K
                    }4 s  S3 q* F% X& ^/ H
                    else4 m9 a9 z# c' g* N' h7 ^
                        i++;//数组元素为0,直接跳过,不计数。。。9 @  m6 T7 s, z/ J0 {
                }) O4 q8 P, K  n7 ]

5 K; B5 |6 L% N" B' I% @/ Y
& K" C  Z! k& U( G            }//结束while循环* g' ^+ C+ F  H' g
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦- J& x8 O4 e% b; W, p2 k! v6 [
           
, [% K/ T8 V3 g* d% M' ?                if (numw[i] != 0)% J2 |' X) N. R3 _2 F1 t; j( Q
                    Console.WriteLine(numw[i]);
4 B! Q& C* L3 ~+ g           2 ?2 Z6 F0 F/ S! C# }
            Console.ReadLine();
  A- x! k3 l7 c3 u2 A/ F2 G        }
1 A: o" T8 O* Q  }* I    }) B( O' l  @- t: \5 b
}
5 j! Q7 z: F0 E7 c+ D% 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-4-19 17:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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