鱼C论坛

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

猴子问题

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

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

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

x
大家好!
' a- S$ L* Q( Q6 X, S2 L8 M这几天我在忙着编一个问题,我用了一种方法编出来!
6 g1 F6 X6 M5 I) ~9 I, H但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
7 B5 n7 B! \' y  h2 v/ M; x9 P. e注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
7 ]( s- M1 c7 L$ A. t3 w: c# N/ v& O' e0 N
: L2 H: T! Z, P2 y& g- [- e, M
                            题目
' f, D4 C# |; o山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。* d" N' ]; D8 H5 _( Q% A
第一种方法:利用循环链表' w7 [/ T8 F! O- I- x; |: ~
#include<stdio.h>
1 p0 @8 H0 J! L( Y#include<malloc.h>" R/ [! h, {1 Y& Y
#define M 8            //共有8只猴子; a% ^2 x4 e. e  ]. I: O# W& x
#define N 3            //数到3只时退出第三只
0 P" i. r$ Z9 e- Z# ]typedef struct monkey: Q5 \* X; @5 W3 ~) ?- k: W  ~9 I
{int number;
/ h1 ?, D  M: D3 J) F7 ?2 w* Cint flag;
2 n% E9 u8 k3 B- s' X1 i8 ~struct monkey* next;
2 `2 y. b9 A* Y& i( l& s}MONKEY;% a6 D6 n4 J9 D! F! x
main()6 z% f0 V( b/ V' l! l8 y  X4 P
{ MONKEY *head=NULL,*p,*s;/ P4 W" i7 _7 O* A6 Q0 [
  int i,sum=0,count=0;
# v' u7 t- u- R* n0 u2 [& [/ ]  clrscr();              //清屏
4 n" ]8 e5 ~6 u: ^6 x6 i5 f  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
. g" C( Y* `) T$ _8 |  p->number=1;p->flag=1;
& h9 Y1 e4 g) S4 F$ O  p->next=head;/ s. P$ R7 ?, V2 N
  head=p;8 b5 u, F9 W9 x3 d5 q7 x) \
  for(i=2;i<=M;i++)
- b- ]$ c- d7 A: {) @    { s=(MONKEY *)malloc(sizeof(MONKEY));
' y) }# ], h" w, x! X  ?2 l     s->number=i;s->flag=1;
& |. F/ @7 F2 y( r  o( k     s->next=head;! Z4 B4 h' Y8 \. q
     p->next=s;p=p->next;
0 d0 w& t/ a5 M0 T    }
& C) J) y5 ?) C" Y. |) x* Q' t    p=head;0 q! j( F) r& G( z
   for(;;)
) e6 C+ p: S: h3 N( v# D; T/ _( W    {if(p->flag==1)
: e  b$ F+ g4 `" M- ?; J5 v( G. l3 F       count++;
6 }$ C# z8 k! M. H+ |# g     if(count==N)9 \. ]& h- s  K: E% I. n/ y& M
        {p->flag=0;+ c( R# q& }4 s3 E  s3 q7 F
         count=0;( x7 ?  j9 z2 [' g1 h. J( F. O
         sum++;}
4 Z! r) ]/ W6 D6 {* j3 d     if(sum==M-1)
% B9 S5 n4 r6 S        break;" V- Q, c0 A4 \) }: i9 e
     p=p->next;0 \( C3 b) J, o# x
    }
. H/ R, [) l% p7 u9 Z/ \2 d/ y    p=
# w( @1 ^3 W* C% U0 y0 B    head;/ }' D6 [- c+ d1 m& i+ W
    for(i=1;i<=M;i++)
- ^8 R1 ~7 o% |- R$ [    { if(p->flag==1)
) r; i2 t& e5 U" `6 r        printf("\t%d",p->number);
' D+ f# v* l" x  {" S      p=p->next;$ j/ b1 c2 H2 e/ X8 a4 h2 R7 T
    }
" v3 y) V9 u& L$ q) m+ m1 D- h7 E* Y1 F' r, T
: X, x1 B) h  m9 i% U

- Z8 d# E, g% r: l8 B}
8 Z3 s  s, D( [5 U3 G
第二种方法:数组- i) _3 q- y% ~2 k: m+ Z7 r) Y
#include<stdio.h>2 |, o$ s- G  S2 D2 H: b0 T5 H
#define M 8' p6 N" W$ p" z( ]+ V4 _* T
struct monkey
1 \+ V3 B# h' l5 j; ]+ j* N+ @  u{int number;
; S% P, L& M8 tint nextp;' M3 [6 g" {; n6 Q6 N/ P
}link[M+1];
9 @4 y# q7 i" L! ?. h8 V, B. Q$ z
$ `* T8 Q2 j/ G0 `- ?2 b3 E7 R$ k! dvoid main()/ v! ?2 G* \4 J6 X1 s
{int i,count,h;
3 H% k0 |( [* dfor(i=1;i<=M;i++)
. w, L' S5 b: x2 _{  if(i==M)+ L9 c3 ~; m$ D! @2 W2 ~* T1 w9 J
   link[i].nextp=1;
+ F% v3 t8 N  ], c2 D; T6 ~8 u; x   else1 |' `* X6 F4 R
   link[i].nextp=i+1;6 P& r) u+ c2 h6 I' g
  link[i].number=i;
, h- F1 ]  w2 D" N, M}
+ t, f& N! j: M* Tprintf("\n");
, s, k* J/ U3 v4 O* n* Mcount=0;, ?" Q$ \  Q; r# ^0 Y# d5 {
h=M;9 _/ v% m- ?- y. I
printf("依次退出的猴子: \n");
2 E  u* z% e, Z! K" Q! T6 Fwhile(count<M-1)$ T: c/ v: I6 C9 p2 A! u
{i=0;% a8 [* |5 J. P3 I9 o+ N  e
while(i!=3)
+ Z' b8 z0 q* `+ w7 ~) {{ h=link[h].nextp;
2 K+ t/ e% a! \; w  v   if(link[h].number)( H* G4 P6 H$ ]! C* S* S* c& r
     i++;}" M/ \3 o9 V, b1 @6 b2 O, R
4 }  I, V+ I0 R- q
printf("%4d",link[h].number);
" q- ~+ {) ?5 Y& Rlink[h].number=0;
6 ?8 k$ s+ e0 I  a! k6 F4 _count++;
# B& L% w0 z$ c; v7 `5 W+ O6 p}# w! ~# d7 [$ @) D/ Z, ]

5 R" k+ k; U& Y: N1 ^printf("\n大王是:");
. M0 e, W0 ]5 Q" j1 W. c# ?  for(i=1;i<=M;i++)
! I6 x& ^3 N' }  if(link[i].number)2 U( _2 B# ?" N# c$ Y  k3 E
    printf("%3d\n",link[i].number);
/ k! T5 r1 I4 s9 n
: U% E+ c( u: b/ q) G7 R
8 J/ s) l( t5 a3 \}

, P( R( o  c0 y  b# z第三种是普通方法for循环
4 F2 l: v& {) }* j* o- S
#include<stdio.h>
9 `9 B! I: v: Rvoid main()2 F# Q# q% r* ~1 s: s3 S0 M
{ int i,k,m,n,num[50],q,*p;! U$ Z* X, v6 W- M
    clrscr();
/ H* A4 E( c! I' L% y( W9 X. d   printf("input number of person: n=");
- n* f' ^& |' K( r6 z$ G3 R    scanf("%d",&n);8 z( J- f  E3 r3 X6 v& L
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
4 h2 }4 K) \0 k, _    scanf("%d",&q);
9 H0 A; c  R  P2 x, r& d   p=num;
- ?$ f1 ?" X2 \" C  for(i=0;i<n;i++)( q/ J" [$ _% X- f7 _* }
    *(p+i)=i+1;6 C5 Y8 u2 U5 _4 b
   i=0;7 [1 z' a, L& f& a
   k=0;# t5 P( W: i* V( r) V2 F
   m=0;
; s1 g( ]$ u' r2 ?6 T% t8 I. p  while(m<n-1)2 n( C% |! \& Y, ^" X* h
   {if(*(p+i)!=0) k++;7 `  T4 r7 g9 Q
     if(k==q)+ f& J; r% H, b7 P# [2 I6 m
      { *(p+i)=0;* ?; Q% l. x  F5 `9 V
        k=0;
- a8 w2 e/ V+ c, c( p" i        m++;0 }9 j6 |2 }! g# N$ [
      }" d0 a! W8 ~) ^% X  ], d: W  `# e
    i++;0 F$ e! @9 O6 ~9 w* T
    if(i==n)i=0;
  s. d. Q6 j  P   }9 G5 J& R  K* I1 z8 A. [
  while(*p==0)p++;
8 D5 A/ }2 Z( @$ O9 }, ^% @/ z    printf("The last one is NO:%d\n",*p);
% G+ T, P# q, k5 t     getch();4 h6 W8 A- ]* X$ j$ m
' b3 D7 m( P0 S
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;5 B. i* D/ z8 G# ~* _* ^2 E
namespace 又费马达又费电
3 [9 C% H& `4 X2 L3 J+ D2 \{
4 X' ?+ j" I& `3 R; p: \    class Program- H" v! r. P, G
    {( F( l4 O8 d" b8 u6 V) J, x% r
        static void Main(string[] args)
0 r* F6 y; y( X' l/ g        {# a( _; R* M6 X; T! \
            int m, n;' ]# i, Q, J. _
            Console.WriteLine("请输入数组长度");
  q, @$ i$ \! p* q            m = int.Parse(Console.ReadLine());//m为数组的大小
+ y" g% l9 B  g" N5 X. t            Console.WriteLine("请输入要截取数字的大小");" D# O7 }9 h) ~1 @' i4 |9 z" M# j
            n = int.Parse(Console.ReadLine());9 |9 Q& m" u5 z  @3 |' l
            int [] numw=new int
) q9 a' |$ v5 h& D1 x' J0 ~& q3 l9 \) `  @9 _8 W: p" [3 G' z2 Z3 |
&shy;&shy;&shy;;4 O* S4 C: f! H# j. V2 R0 \( h
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
/ p3 R1 e! }# X            {
8 K, F/ l6 f% y5 Y: C                numw[j - 1] = j;
4 i  j# K6 O/ \) {4 M5 y            }
3 m8 Y! H, k2 I6 n0 h            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
9 b% ]# e4 _. k, @            while (d != m - 1)
. C; \4 F+ R3 Q            {
: J+ [3 \0 @9 L* ^: ~                if (i == m && d != m - 1)
2 I' E) M3 M, A+ \$ b/ v9 O                {! l6 \6 q3 P4 H3 V
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
" h/ m6 ?& O) _# q) d3 A7 |                    continue;
6 W4 c0 \, F; Y7 E' W. R. ^                }
6 n0 N& l& R% L7 ?+ ?( \' [                else5 _' V! C! E" i
                {
" E( ?, f' R* [( h% y% U                    if (numw[i] != 0)
" z* F7 P# v2 Y& D  v$ A7 i                    {
1 E- k( X. u5 E9 k                        i++;2 z& r1 G8 i7 g5 B, }4 V' F5 f) D
                        k++;6 _$ }: b9 t( O/ q
                        if (k == n)# l3 R& u! K4 m4 s
                        {
! t; i" g/ t, T7 }  `                            numw[i - 1] = 0;//把在n位置数组元素的值改变了7 ~; f0 ]3 r. O2 C7 U4 F$ \
                            k = 0;( d3 K% _# n1 N* u2 M2 [: Z9 t
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小17 G5 o! y9 `: x2 e5 ]- V
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);0 A* W! O" q1 L. |2 p
                        }
8 s3 t$ ^0 h! q/ c' j5 U                        else//输出暂时还没有改变数组元素的值
1 _! q/ Z: `$ {! l' @% d5 Z                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
! A4 y. A. E2 L% Y* p- j                    }
& Z4 @# x- J. O6 D                    else8 U- i5 z5 D+ P* L' U+ C
                        i++;//数组元素为0,直接跳过,不计数。。。9 Q: A: {$ F5 ?) O
                }5 a6 U* g  u. Y
' e3 h, J. Z1 h6 c1 o

' g; Y$ T1 K! G  E            }//结束while循环( V* e. F' o' v( Y. L  ~
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦. h# \2 b  K- U& u2 h$ y
           
6 B' E* d- c. k) m                if (numw[i] != 0)# W4 Y+ S9 P* E3 c
                    Console.WriteLine(numw[i]);% }7 R9 {, s1 v5 V
           3 z$ K/ n( w, m  a2 w, v( ~. ~
            Console.ReadLine();4 W) ~1 O+ g; s& O
        }7 ?7 G. O6 C* {5 b
    }
9 ]# P1 @5 U2 E( h/ K}
( {" }6 K- Q) N1 e+ M
小甲鱼最新课程 -> 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-22 13:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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