鱼C论坛

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

猴子问题

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

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

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

x
大家好!; Z8 x2 y+ w6 h: _' C; [
这几天我在忙着编一个问题,我用了一种方法编出来!5 L1 Q, A& Q9 T; p% O( a6 A
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!& p; N* o" F. M6 \7 u' e
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 / d0 ?' k! i, H  Y) v/ e! N/ \
0 d0 A: z# {6 G) r( b) |5 F
4 ?7 b2 C& D$ F  t
                            题目
1 [5 S5 w  o: z2 U1 X山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
" g& |5 S9 R* c8 f0 z2 A第一种方法:利用循环链表
( g; m- U) z8 c#include<stdio.h>
( D$ m# Z: _% d2 k/ i#include<malloc.h>% T% d8 S: B9 Q) l" p, I
#define M 8            //共有8只猴子% g% w7 i' P3 F8 o& p; j
#define N 3            //数到3只时退出第三只
, Y) R" p# c3 q+ G3 F0 V) v9 Stypedef struct monkey, G0 w* ]4 i2 a1 C7 V
{int number;
0 a' X" T# d9 l8 l& s) ]int flag;; E8 M  g% _) U4 e
struct monkey* next;6 `7 R) Y# A2 i7 u
}MONKEY;" ~: i5 X2 Y, n! ^% B
main()
, c# Z4 ^0 u) i' f  k( i' [1 \{ MONKEY *head=NULL,*p,*s;2 O2 m7 q: p. c: E0 ]6 c5 ~
  int i,sum=0,count=0;2 `) ]% M) G2 y& Y8 s# R
  clrscr();              //清屏
5 n5 L# U  R, P  R  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存/ ?' Q# W  w0 B- l! ]
  p->number=1;p->flag=1;9 I+ A! R0 K5 J3 M( X  j
  p->next=head;
% {+ @* `" Q0 q  E) b+ E* c- c  v  head=p;
! T  Q3 ?5 R7 x0 y( V, W# z  for(i=2;i<=M;i++)+ _4 L6 }, o  n% D5 y" x
    { s=(MONKEY *)malloc(sizeof(MONKEY));7 m, \) a  k: u( \) a7 [
     s->number=i;s->flag=1;) l5 s* t" _6 `
     s->next=head;. L8 y9 B+ k  p5 z
     p->next=s;p=p->next;
8 b5 {9 i7 N# v! P! U8 f+ y    }9 p1 r8 [, y8 [+ ~! H$ S& e
    p=head;' z1 q: ?; Y$ ^- }' n& O/ W$ G, H
   for(;;)
8 m; G( ?! C/ B    {if(p->flag==1)
. _! r0 Z$ ~$ D$ R% F0 f       count++;6 R* ^$ f% U" ?1 r* D7 M
     if(count==N)/ I8 i) N! s" W. W$ h0 {
        {p->flag=0;
6 ~6 O3 C( t  S( |0 j- Q         count=0;
( u# q/ U, w% f- b( }         sum++;}
& Q1 `, o! k) ~& b     if(sum==M-1), p2 A7 T, {$ K8 t* ]! i; k
        break;2 @! a6 c7 L9 t: p
     p=p->next;
( j1 H9 Z- k) g/ |" S1 w* ]) F    }1 y+ q3 P! `0 L; g3 s: N
    p=! V8 R0 D3 z9 O( b8 g) F
    head;
( @. l9 x8 g: \. \# y6 \4 y& b    for(i=1;i<=M;i++)
2 x5 h) k# q! b; \; P% w    { if(p->flag==1)- W( ]/ B+ m; h- O( P
        printf("\t%d",p->number);
2 }& I: Z5 D7 M* L      p=p->next;$ _6 ]# H; h& d7 O2 v# G+ ]
    }, H/ L; H: k# }, u
  R, j( s1 y" M, M- c9 G4 c, N

* A( r4 Q* Y  K! d* q/ ~( q, q4 v, L
}
4 a3 _# f  b6 [" o
第二种方法:数组# l: f, o. \5 W
#include<stdio.h>7 ~) l9 b3 b9 H$ U! L
#define M 8
" f2 P7 Q4 @  R7 Ystruct monkey
2 X, a: z4 a) c: K& D6 l{int number;0 F$ V& C% z1 W0 \
int nextp;- _; A! L: R+ }# x5 b
}link[M+1];8 @, _4 ^5 D7 E, n

: T+ l; X7 o( Q; o8 N) z& X3 {void main()
7 m; i9 d* c+ a6 \7 b4 {( v8 u' h{int i,count,h;4 \1 m9 V) O* `& S( x* I
for(i=1;i<=M;i++)
% D* P% }* q  h" ^+ B$ t9 ~{  if(i==M)8 I% f/ M0 p: B( v  R
   link[i].nextp=1;
6 w7 r, D! O% i9 \' N' H   else
+ h# W4 i, ?5 q* q- V   link[i].nextp=i+1;: V7 i/ J8 v0 ~' g' X' B5 g% X
  link[i].number=i;* l# E4 ?! e; S0 Y1 i4 n
}
2 i- w  Z7 O9 a8 r6 z% yprintf("\n");
0 F) {! h. B6 U. ]- ?count=0;, h% N( o5 J& Q2 j) q6 W0 k
h=M;
; d$ ?% j* s/ M" _printf("依次退出的猴子: \n");
" u6 Q( P9 |4 p( o% X# |; q3 Gwhile(count<M-1)
- \5 L3 q  a, s! w{i=0;( W3 c9 t- Z7 c. C, j" M1 v0 ~5 s
while(i!=3)- x$ J0 m6 f! ?9 T
{ h=link[h].nextp;+ G3 v& K2 C; U5 h
   if(link[h].number)* P% H$ f4 S; f4 I
     i++;}
. a& Z2 U' Q/ a, P4 c& H$ X8 }6 a( R* l+ }$ }  e
printf("%4d",link[h].number);4 _) k- v$ [) H) k
link[h].number=0;9 \8 T) P  R) K9 f+ X1 D
count++;& t# l! U5 S: H3 u
}6 w8 K5 u, |! A1 L
' }3 J/ y) R$ t
printf("\n大王是:");
, T; f. U# l& M( c  for(i=1;i<=M;i++)! f5 Q8 g" N, I  M9 o) @* c
  if(link[i].number)
$ S+ F' J- H: a* U$ p    printf("%3d\n",link[i].number);7 _7 i' k, V# M* i: [2 S- w
+ T" l: P3 W# A: Q9 J

3 q9 S5 E( t9 A3 s; l) S, {: G" _}
8 c9 c' ~6 @; Q$ s
第三种是普通方法for循环
  T; s! N7 R% i8 E' ^
#include<stdio.h>
# ^# ~( `: c- n4 |void main()9 j- l1 T$ _# R" x; g9 e
{ int i,k,m,n,num[50],q,*p;' P' ?1 M7 U8 f! f3 g% q
    clrscr();, W8 c8 o7 q3 f) ]/ P+ S
   printf("input number of person: n=");. n; m' u/ a$ s- `5 o
    scanf("%d",&n);7 X/ C9 U! H$ n  G! B* ~+ V
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只; f$ _# j$ g: ~+ x; J# ]
    scanf("%d",&q);
2 L" \/ H8 z; U, }   p=num;* U& T, m7 `) |5 u6 T/ w
  for(i=0;i<n;i++)
" I/ m- o0 T% I    *(p+i)=i+1;
* V, U( U9 y2 j; b* G2 {   i=0;0 Z) g( n! n! C- V2 h6 [4 i
   k=0;
0 y2 B' v+ N: F4 b7 R   m=0;
6 i4 D0 T% v  q6 a- J- K  while(m<n-1)% z, J# \0 k& f! C1 W, c4 x
   {if(*(p+i)!=0) k++;4 Q# e# U2 W% p2 i' c
     if(k==q); ^2 j* L* f% }6 h
      { *(p+i)=0;& q6 y$ N& c1 f9 Z1 u7 t, v
        k=0;
0 E" v$ {" O+ N$ K4 l! V+ m* l        m++;+ h" Q, I$ d5 M" v; s7 K. b
      }
) P8 Z: d7 \: J/ \8 A& E    i++;
; C3 X6 ?& c/ Z( Q0 I. K    if(i==n)i=0;& @" c. \! v0 H6 }' H3 p. a
   }
5 c9 D! I0 g. |0 F  while(*p==0)p++;( f4 w4 [' h8 s2 ^
    printf("The last one is NO:%d\n",*p);
' x1 z6 e5 \; {* ?% f     getch();3 N+ f# w" @6 {
2 ^7 ?% K( l# ^# h' X
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
* A9 R8 n6 z- H* Q+ \% p: ?. mnamespace 又费马达又费电, e  E! S( k2 s+ ]) L4 q
{& Q# i5 n8 p" _1 E: ^
    class Program
1 H1 w& m) V- S: n/ o, x    {
& `( b4 ~$ t6 V' q/ u; O        static void Main(string[] args); W: j7 m; n' B6 D2 J
        {
  M# m/ i* n3 b( T9 a            int m, n;
+ w% k" G1 m8 m& b/ t& ~  S            Console.WriteLine("请输入数组长度");1 |1 @* ]% s5 t4 o, L7 O% L
            m = int.Parse(Console.ReadLine());//m为数组的大小
' p. m" U$ W/ Z/ i            Console.WriteLine("请输入要截取数字的大小");/ Q: h( }. E/ K
            n = int.Parse(Console.ReadLine());' M. |, I" c: v! \$ [
            int [] numw=new int" C$ ?% z; n1 q% e9 \6 y  R. g

8 j/ r+ Q/ Z* ^. _! {1 M&shy;&shy;&shy;;+ E  }3 K, g+ H, R+ a$ O+ x
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
. {+ Q4 L0 f4 E: X: ~% i9 \            {' O+ u" Y! s' V+ m# c6 C6 ]
                numw[j - 1] = j;/ Y; e4 B! f( v0 R/ S4 D8 q
            }) |5 b5 E0 U  w
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
$ ~- G$ I4 n& I) s6 s8 p! e            while (d != m - 1)
9 E* @0 {6 ]6 @% z% s. }6 E) G            {* I- c% S# l& g
                if (i == m && d != m - 1)+ ~6 k) @. ~1 U! p" r( S% C+ }* t
                {
, L/ v7 [+ E# X4 V7 ]                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
- Q! R5 V6 U) C" G3 y                    continue;
' h7 ^9 I. F+ l: ]                }
; X8 _3 I& r: [, q* n                else
+ E& n& c% D7 Q3 |/ Y" @8 ]                {2 b% R$ |6 I! H& ~) ~; M. g
                    if (numw[i] != 0)
! D/ d  g4 ], N* P7 W                    {6 x8 m: e0 u2 {( ^
                        i++;3 h7 a+ S$ Y" j( S0 R4 l4 h  N* A: O
                        k++;
  u( g) q! y2 f+ D: Z                        if (k == n)! u6 a' s; t6 o, n7 L; v/ w
                        {" A: f3 K$ s; _
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了4 `! |1 k) q4 s8 N& g; }
                            k = 0;6 t0 U, E; d/ R. u3 v  c* z
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
' l6 `1 G. R3 ]& l                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
7 W7 g2 M( O: f  `- Z# D                        }
, ?, l; d9 }; h# E' i( h                        else//输出暂时还没有改变数组元素的值
+ Q$ y, {, u4 C                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
3 N! J! R( N) F1 J. I                    }! U( t; B6 c4 ?+ q. \! R
                    else
& i: V9 U. R+ ]3 q                        i++;//数组元素为0,直接跳过,不计数。。。- r! d- r0 O( P. H
                }
/ U/ V5 g* M+ ~0 S) j- j ' x& {5 |( `" C/ `5 O7 X9 J

1 y+ y/ ?2 y* F7 Z& O: B            }//结束while循环
) v6 m4 y" ^3 m" w9 d% f3 F- d            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦1 A* s3 Y4 C8 e/ A
           ( u* d: o4 _! l/ o4 _6 R
                if (numw[i] != 0)
( K1 H' M& q! t( Z/ ]: f: i6 ]2 u9 q7 M4 K                    Console.WriteLine(numw[i]);: j) `! C  C0 h4 t
           ( t" c/ C6 P/ \* n4 |1 l: `1 b& R4 k
            Console.ReadLine();
0 Z  d; P+ G8 q4 y3 {* Z6 a2 w        }$ H/ @/ ~4 U3 R
    }
7 N6 O4 T( A+ H}
4 o4 l' |. ^7 h/ P% C6 |; i
小甲鱼最新课程 -> 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-21 14:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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