鱼C论坛

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

猴子问题

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

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

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

x
大家好!! [2 T' [  b  H
这几天我在忙着编一个问题,我用了一种方法编出来!
# `. m* E. b+ s3 ^) c- X但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
3 }( ~4 p: I! ~1 z6 e. ~: U6 b注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
( M2 A% ~2 L* D  v- A
! j& q3 n% w$ Z5 L. e6 a! U9 x4 S2 e; n) _! c# ^, ]$ d
                            题目3 M7 C8 F0 x3 L9 D5 D
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
3 M8 s+ n3 m3 H2 g; r* f' e3 ]' {第一种方法:利用循环链表: b& Y! m- v9 F
#include<stdio.h>
( l: t' w# k; y9 D! _#include<malloc.h>
, e) A4 R) Q  P* F; k- }6 B#define M 8            //共有8只猴子
" y- \" A5 f2 ]+ ]) E8 \) P8 @#define N 3            //数到3只时退出第三只
% Y8 x5 r4 \. U& b5 d0 Q" b0 k! `typedef struct monkey
) J9 E% V0 Q4 F% V( T# }' }; u{int number;
8 U2 Z: a: J4 b" ]  l9 l+ ~. xint flag;
; \% Y% [( L$ ]; ?' N& L9 J6 Wstruct monkey* next;
* g. C8 D+ X# L, F. z. o; I9 ^}MONKEY;
+ G# p; D( l  h3 C" E' `" C' [: G' O; omain()
5 Q# v4 k& q4 ]" }: R0 ~{ MONKEY *head=NULL,*p,*s;2 k/ y- W; `( `
  int i,sum=0,count=0;2 }: z. `4 S2 S. x, s! i5 N
  clrscr();              //清屏' [+ p4 ~) n3 E1 T9 h
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
$ P5 B: O, f& O& b' D' W, [  p->number=1;p->flag=1;
" C, d  N3 Y  P  p->next=head;3 Z. k( B4 r: W+ b0 g! }4 M
  head=p;
$ j: q# F; T3 k! r) ?* M2 j  for(i=2;i<=M;i++)$ g- m  Z4 E) Y1 N4 ~
    { s=(MONKEY *)malloc(sizeof(MONKEY));. V$ }8 E( b. M' M1 I, ?1 V0 K
     s->number=i;s->flag=1;
! r" N1 ]& j0 Z, S2 |3 c     s->next=head;( e; }* U8 F1 d) Z+ h
     p->next=s;p=p->next;
/ x/ Z5 L! U1 P# o/ B    }. O& n; s0 @* b3 B' j
    p=head;. M' {# p( U. _# T- G: j# `# s2 s
   for(;;)) q# \$ E6 a# p
    {if(p->flag==1)
9 j: T1 \# r6 z% W" F& S       count++;( y1 V0 ?- c1 o$ S
     if(count==N)5 y; e4 q! L" t1 }# m! Y$ b
        {p->flag=0;# G/ H0 d  p$ N' r9 k* L2 C
         count=0;7 v1 M4 [! Q% d
         sum++;}: `' k& e! L/ L* w
     if(sum==M-1)+ R3 S% E$ t$ A2 ~9 ^% x9 r) t* z' E
        break;3 I/ T* k- A- {& S$ I
     p=p->next;! \- g" ~6 }" w
    }
7 W9 Q  W- W. v9 @4 C" N0 m    p=) l; r" x/ l, a- J, z/ o: B
    head;
; O+ P, l% |. I, x    for(i=1;i<=M;i++)1 s) l- x+ L- b7 _' U9 c
    { if(p->flag==1)
$ u8 _( N/ e4 W- @- {        printf("\t%d",p->number);" G: s4 p4 T7 L( F4 V0 M" j4 Y
      p=p->next;9 V2 a4 ~5 N, s7 ]- X& \
    }& `# t6 ?/ _" b0 `0 b

+ Q# b3 q) V5 k$ c2 Z/ C* c+ r! k# G8 [9 Y3 Z

5 l4 Z7 \0 `& g, Z% U/ ~: N  V}
0 ^( ?( n8 `5 h, `, E
第二种方法:数组
0 E8 g* C+ r/ o#include<stdio.h>
4 F/ \. p. [5 O/ k3 z+ u#define M 87 b& o% m2 F& u$ F5 h6 i3 x
struct monkey
1 X2 m. r8 i, U+ Q' @4 L" u0 X{int number;: Z9 e: A! Z7 s1 w
int nextp;
9 Z/ X* l" u% i8 B}link[M+1];: j: D2 q4 z) a' O# Y! q  F
" M$ c5 K3 I$ p* a8 N& G8 E
void main()4 ]7 Q% M) @) v6 @1 C6 I
{int i,count,h;9 P, E  b  i! n( {) M. Q! s; Z
for(i=1;i<=M;i++): y8 X6 ]/ D9 U; a4 _
{  if(i==M)  E. {5 K% R% Z4 }4 o# z# K" ~* O
   link[i].nextp=1;
: v5 l, X$ O' x7 U. r7 v' @   else- O5 Y" g1 o4 G  |) `
   link[i].nextp=i+1;
9 L( Z* g% q% J$ K% u& p  link[i].number=i;
& s) s' @( }( A% P9 D5 ^}& ~, q& L) z8 g$ Y, j% P
printf("\n");
8 s- t0 D. W1 y/ Mcount=0;
& b+ n, E0 B  Y1 T$ D& ah=M;6 f9 F+ Z) b) c2 K
printf("依次退出的猴子: \n");; A; U$ W$ U( F
while(count<M-1): H+ {; n, e7 J9 v; A% L
{i=0;. `% R1 W: A. w& D" V! m
while(i!=3)
/ T' A3 @) M( F% {7 |+ `& G0 r{ h=link[h].nextp;
9 V' S/ Y  D6 d, G; @+ n* ?   if(link[h].number)9 |/ B8 x/ [, g7 a" c
     i++;}7 o; E5 Q, c+ L& D$ w

3 C$ V* |+ N; e: S1 K8 L0 O9 @2 zprintf("%4d",link[h].number);/ ?) V( ^) K4 t# b
link[h].number=0;
6 f! s2 e# E* M/ U% ?count++;. Q7 F3 o" Y1 u$ e8 @6 m! S% J
}
+ p! h* d2 o0 r9 o; v+ j* @( x  h$ p0 K0 a
printf("\n大王是:");
) e# @% t; l6 f5 H  for(i=1;i<=M;i++)5 R) L( M( _3 A; d6 _; y
  if(link[i].number)
& ^, a2 f6 K& ]$ J    printf("%3d\n",link[i].number);
; n) {9 \( a* Q) `# w0 z
% h# u+ L! h: r1 k8 b7 S) g! Y# y
. t) ~/ d5 J, k6 t2 v/ }}

" D9 q, G% r1 f. O. E2 A7 l第三种是普通方法for循环

8 ]& T. V& f, G  }#include<stdio.h>
' f4 q7 Z9 ^: u4 N: Bvoid main()
% I! w( \+ ^7 T* {{ int i,k,m,n,num[50],q,*p;# X% ~$ L  }- I- t8 R' [6 ~
    clrscr();2 P6 G5 p* ?$ l/ w
   printf("input number of person: n=");
( N: x8 N& c- {( S    scanf("%d",&n);# ]3 q+ [1 F5 e0 f- ^% G* X1 J! p
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只- s, }# D" I5 o# x6 e/ [
    scanf("%d",&q);
+ ?4 H  d9 y' {7 O   p=num;* z8 {! m5 b6 w+ Y' O
  for(i=0;i<n;i++)
& q/ K) a2 i8 y    *(p+i)=i+1;
) j# {2 B2 X' Y, }/ K   i=0;
# n( D3 M! M/ J3 y9 J. S+ [   k=0;
2 }) A+ I' Y9 L6 p, Q8 b   m=0;0 t; {# F4 q9 U8 A0 }* G4 C: ?
  while(m<n-1)
. m  z( I2 N' S1 V. f: ?3 {   {if(*(p+i)!=0) k++;
6 K& G+ p  [1 l/ h9 f     if(k==q)
! R% S7 Y$ ]3 A) ?+ g      { *(p+i)=0;
& a: h9 x, F0 q( T1 I        k=0;
, W' T4 @6 O: j: X) v        m++;1 Z3 ^$ W1 p# K% M
      }5 C, R; |; t7 E1 k  N, S1 V  X
    i++;
& Z% K: }" \8 k+ x) z0 z" v% h6 R    if(i==n)i=0;) W. P" J0 ^2 e) |. L" k
   }
$ U0 y" k% d" L8 t  while(*p==0)p++;
2 G# `; z, [! ~7 m9 W    printf("The last one is NO:%d\n",*p);0 |6 r( d! t! s9 t$ Y. M: o. D
     getch();5 @" j' s# {- p) q, a

3 ~& j4 Q+ u6 ^0 o3 [: s. k}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
& l0 d, a; o- r' Hnamespace 又费马达又费电! D. X" A! h8 J: r
{! ~2 C" r1 J3 [" @
    class Program6 }3 D; v- p# ~* K# c( e
    {6 e$ v  f5 Z0 h- g* Q+ r6 x" N5 D
        static void Main(string[] args)  S6 W- A8 n) \1 A4 s) m5 n+ |
        {& f$ `. |: O* P) G8 n4 F0 f
            int m, n;
9 [* O, Y5 \# h/ L5 ^. v/ X            Console.WriteLine("请输入数组长度");
. o2 t. D: X& U9 R/ A7 Q: D6 T            m = int.Parse(Console.ReadLine());//m为数组的大小* j; E) a) M  e- l; }+ `5 n! f
            Console.WriteLine("请输入要截取数字的大小");
0 t0 @0 c6 F: c# l; U7 }6 R            n = int.Parse(Console.ReadLine());
3 m" B1 R+ m3 G0 V- F            int [] numw=new int9 D8 o# R0 l; @# O

3 o2 O6 l2 ~3 V, ]. ^&shy;&shy;&shy;;0 r' \' ?6 |1 B0 v' A  B' ]+ L
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
: {  [# ?3 G/ V5 ?# n. g! q" f            {+ A8 |+ p- ~0 [% O1 `+ D: J( F
                numw[j - 1] = j;
+ s1 C6 o6 L) a! u) d            }
& `9 i- k- B8 F            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!- k9 Y$ ?. c" p1 U3 m* D
            while (d != m - 1)
. \2 R. n  L  j/ X& }4 l& T            {3 C4 N5 `* C9 m  p( w* `
                if (i == m && d != m - 1)1 q5 A$ Z/ w- d: v% Z3 l
                {
: I+ M) h# y* `) H' M                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!( ^3 f# @1 T2 F' x2 U& O. b/ R# T
                    continue;6 i2 k. \9 r! M! m! A' g. z
                }7 I$ k/ F8 N+ q# r' h
                else
( w1 _5 m, L/ z1 K0 _1 h( W0 q                {
  {  O0 l! W, F# A  }  H9 K                    if (numw[i] != 0)
- Q" c) R8 d* ]; t                    {
2 f- f. ^+ X4 [) [9 ?! s! V7 U                        i++;6 a3 ]! X+ _5 w6 @, x$ s" m2 A7 c
                        k++;
" x3 k" e8 b3 g9 }0 P! Q; {                        if (k == n)* z( \. s$ c: c- Z1 E" F
                        {3 U. R$ H. z  K3 O
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
3 B6 Q: `7 j% x  L& e                            k = 0;% |# R4 F! U. B5 c2 `$ N+ ?
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1' g2 d7 H  q! ~7 G+ B
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
, f) L/ y  Y! J3 C/ P3 X, a: ]; O                        }# M8 q' k: z: A# h6 z
                        else//输出暂时还没有改变数组元素的值
) y8 ^- x: a; \) ~                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);% Z& I1 a6 H: g8 b8 P' }
                    }9 f$ ]4 \! z6 v* E; m
                    else
" P8 J) n" e0 e' e6 V' @  ~; L                        i++;//数组元素为0,直接跳过,不计数。。。
$ R  d; ~, K' Z: P7 E" A1 d( v                }; m- u1 L- M& G& N

7 e9 g" R3 W5 r7 _" R' E. m+ a% z+ [7 V& v( O
            }//结束while循环
: w! [/ z# D7 {# V2 i            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
) \2 O& _: B% _           
. \* L) |/ k0 D. v0 k% _' E                if (numw[i] != 0)
( H* d5 S5 v0 ~: P( s/ |                    Console.WriteLine(numw[i]);( S* z! b, h8 o6 w# h* W9 z
           
. Z/ }* K6 d* d/ Z: _( Z' C, o, R  ^            Console.ReadLine();
" m# T1 n! I" [" c+ k2 W        }- N2 Q/ M- e  z! ~9 }, j' K) q
    }
) M4 ^$ s, ]. w) }% t6 U}
! H1 [7 @: ^6 @
小甲鱼最新课程 -> 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, 2025-12-31 02:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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