鱼C论坛

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

猴子问题

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

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

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

x
大家好!
/ f0 `9 a7 o( s4 S. ]这几天我在忙着编一个问题,我用了一种方法编出来!
9 I' s6 x3 A1 O2 z+ Z4 n+ z但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
; G- G0 E1 a: Z3 B, n$ R' B注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 & \* I" D; k$ V3 L* |9 o" O

. C5 H, j) }2 a! q
# R$ H3 z8 S5 A+ ?: b& X0 ^
                            题目0 s# _9 f4 z( W9 g4 O
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。# M$ I& X" E+ R) @7 U) `9 O
第一种方法:利用循环链表
0 O3 b! P+ B: o) s#include<stdio.h>7 _8 o9 ~; K' U5 C3 O9 @
#include<malloc.h>; o- z8 G  P6 z7 }* U6 M
#define M 8            //共有8只猴子
$ C% S0 l$ Y. h$ e) B3 d; t#define N 3            //数到3只时退出第三只
8 _  D4 f$ H8 V. C: s, ]4 Ftypedef struct monkey# b8 j9 I- r; }' H9 u$ c  L1 o  \3 b
{int number;( K0 |4 H) O0 E
int flag;' q% p1 ^7 i% }' T7 U$ P  @
struct monkey* next;
$ E  x: i# ~6 J! u7 |}MONKEY;1 ^8 r: j) N# @8 m
main()( [- ?. Z, e  B1 }: M( `
{ MONKEY *head=NULL,*p,*s;9 L8 ]) g- ^4 _: V3 [( A; T
  int i,sum=0,count=0;
- z% w3 R; o4 M7 ]: S  clrscr();              //清屏
4 C; r+ B+ F( u( M  z  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存& o. h/ N, [& D, {
  p->number=1;p->flag=1;
& L- u8 j7 g4 R$ {  p->next=head;
  D1 f4 L! S9 s7 j5 B  head=p;, M/ W# y0 ?$ h) ]
  for(i=2;i<=M;i++)# x( ]/ J6 K" M6 _% T
    { s=(MONKEY *)malloc(sizeof(MONKEY));3 [, |* p9 n* [) f) @* M" T2 i
     s->number=i;s->flag=1;
* |6 A5 \! e# j& K$ d     s->next=head;* [( t8 z( Q6 X8 @. @* i
     p->next=s;p=p->next;2 }* a9 N6 j; h9 x& h
    }; Q" ]4 P9 g3 V' A2 n8 h
    p=head;0 U2 S7 j* n  y0 D4 ^
   for(;;)
7 ~+ H5 A, D5 `( z: ]+ |    {if(p->flag==1)7 Z6 M; {4 t& R/ r1 C6 c' }) D+ d* Q
       count++;
9 N3 w  o' l% r, O8 A( k     if(count==N)/ T# [7 ^9 @. E: \8 H; q' i9 R0 q
        {p->flag=0;8 {5 G' O' [( E( n9 m* E
         count=0;8 D" F  g' s" m7 _: w/ b+ ?
         sum++;}
# n1 o/ A- w7 x- L9 Z. b! b     if(sum==M-1)& g( C3 b' T( i: E! U0 F
        break;
' M  X' i& p1 L9 A# I. K) A     p=p->next;, o( X) ~% A) i1 L
    }
0 g" m) U0 C# g. I, M; X    p=
4 W6 m6 }( \  w$ v3 M# @7 X0 [    head;
; k6 I/ r3 w5 N) \+ C    for(i=1;i<=M;i++), Z% w3 E  h' b: _8 C, u) H; F/ t
    { if(p->flag==1)
3 E. E, O/ o* e( {        printf("\t%d",p->number);
6 o' Z5 a" o. b) Y: o% Q      p=p->next;! L5 i1 w; ?7 e  n$ l3 o
    }" T0 @$ ]7 ^; H- L# X

$ I$ U; h/ X& V# G' k) g8 w, ]

& X! U+ t) ]3 }" m# B5 s- l}
$ ]/ v5 E" l+ C9 ^3 p# _
第二种方法:数组
8 c3 c" R: @* v, U3 A0 x#include<stdio.h>  ?  z4 E4 e" u, d9 h
#define M 81 g/ b3 `/ e1 b: Q; V6 Z6 z* X
struct monkey
. D/ Z1 _2 ~/ W. w8 e9 c{int number;
# P4 N( J# P8 `. U$ l7 r% y3 ?int nextp;' s$ B9 T' z$ _, o% U
}link[M+1];7 ^! x: g+ _) H+ f" M- M

( k4 i! g! P. }1 jvoid main()
1 ?7 _- _8 ^  m. p{int i,count,h;
7 ~: g. x* `- x: z6 d$ s1 }4 n1 Afor(i=1;i<=M;i++)
2 ^: q! h+ X8 U5 o- I. n3 t& `8 _{  if(i==M)
6 O1 t! d& }, }  @& j   link[i].nextp=1;
* P& z! p0 V. p' K$ m4 u0 C1 q   else, H$ u1 s' s3 A" F1 E
   link[i].nextp=i+1;
1 K2 t9 x/ s% N4 r& C8 w$ j  link[i].number=i;+ I& g) _5 s* e7 r( e  s+ ?. ?
}
9 j- ]9 J4 s( s# [! h! b3 g8 y9 u' lprintf("\n");
% E( \$ h" p4 U% B; `count=0;0 y% M  T- j8 R: S+ f) H. }0 t
h=M;: n$ n" L1 V8 e& j" ]: w, s
printf("依次退出的猴子: \n");
+ {( S- O8 r" V6 U! Owhile(count<M-1)8 X8 l" _9 b( ~& r- Q8 E/ c
{i=0;
( J1 g! ?$ ~: fwhile(i!=3)% V6 |- O7 F! @( A; A; @
{ h=link[h].nextp;
3 i- r. s8 K7 f   if(link[h].number). G$ ~7 H& P$ n- O! Q
     i++;}
/ Y$ K. x& m$ Y8 S$ l
0 ]$ Z" T+ _. N% y+ B7 Zprintf("%4d",link[h].number);
- B  j" M" W/ d- z  ]) t( F* }4 J# U6 Nlink[h].number=0;" {% u) o, l  X. E! u+ V5 @3 X. L
count++;6 h/ K. |& W  V, N
}3 C% Q& a- H/ [, P
- d* E4 z. n! _$ m; f4 J+ T
printf("\n大王是:");
' j: N! t* X7 }* j  for(i=1;i<=M;i++)+ l* m( i  r% G
  if(link[i].number)' W: ?# T! J6 h$ q( Q
    printf("%3d\n",link[i].number);
) N3 E( ?* q+ G+ T$ ^; B( d8 U; U8 y7 _9 U$ v) {- r% a: n+ r
, P: [0 n$ L9 W" B) r
}

! X; Y, M4 P4 k$ e第三种是普通方法for循环
3 W4 M8 J9 P2 W- W, C- ]  x
#include<stdio.h>3 Y/ x0 O; V- s
void main()
8 Y6 y( E' ]+ q/ }6 _! g{ int i,k,m,n,num[50],q,*p;
  r* H# S+ A, y/ R, U2 a    clrscr();
6 `$ ^& x2 h# w! N+ U   printf("input number of person: n=");
5 ^  V% |! ]! p7 ~1 u  O/ m! k    scanf("%d",&n);! k1 ?" a) i* K8 s) h
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
* w8 [- ^! @0 D( S    scanf("%d",&q);2 c+ q5 ?' {: L) U* F
   p=num;
1 q) b7 |+ t2 E  for(i=0;i<n;i++)! b# j% M: w0 V! `
    *(p+i)=i+1;
; K% w3 ?- \, m6 I   i=0;
& `# L( h/ X) ?$ ~1 G   k=0;
" s3 C* P& z6 m$ M   m=0;
/ v: c2 V9 t0 G$ z' C* r/ v  while(m<n-1)
9 Q% x/ l# f) _   {if(*(p+i)!=0) k++;
7 A; Y9 G" O$ m1 |* b     if(k==q)
- U+ h* p3 _. r" H& z$ u      { *(p+i)=0;! }0 x1 R; ]$ ?" a0 _& y+ V
        k=0;' s3 o9 i* l. t3 d
        m++;
; W( ]/ @4 s. ~9 _- M" Y      }
$ l* p2 p9 {5 r9 H7 E    i++;
( f) S. t- @0 m( K0 q6 V- \9 m; X    if(i==n)i=0;
9 }4 F( i! J5 x: P1 B4 r   }2 d* `. V0 a2 d, l! A! L! |
  while(*p==0)p++;# q2 W6 G+ o2 c; u2 i
    printf("The last one is NO:%d\n",*p);) F. c( O" ^5 C- u
     getch();6 L! u. _6 E# b) ^6 N7 N

5 @: ~# [, S/ `% F  A6 }8 }; L}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
2 {* }2 [4 w. F9 lnamespace 又费马达又费电
' {& s& q1 `8 N1 m+ j0 }1 F# o{) Z1 H$ @0 R: ]& E9 y, a
    class Program7 h5 L: H" G9 ~3 W" d
    {
$ k) U3 e4 A% r2 {: }$ A        static void Main(string[] args)
3 Q4 b& h; J$ p; W. d7 N, I9 {        {
: h$ q0 L0 \0 ~& y7 X" O# m. w% }            int m, n;3 @4 V3 T. }% g' n& h% F7 u$ z
            Console.WriteLine("请输入数组长度");
4 x. }: i' E0 S# ~- Q            m = int.Parse(Console.ReadLine());//m为数组的大小, v$ F9 o; B2 M! j5 h
            Console.WriteLine("请输入要截取数字的大小");
' g% e' x/ O' ^8 A) [            n = int.Parse(Console.ReadLine());
/ S. P6 h* ~' w! Q/ D& E2 l            int [] numw=new int
8 ~2 e3 H: S% }2 h& e; l5 k  E) J+ x2 y1 x
&shy;&shy;&shy;;
! i6 m0 d  l& O5 C; i            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
) T3 k* [8 @+ Y6 M# K+ i2 N5 F            {
% {) `- ]$ C" b5 M  G9 K. j                numw[j - 1] = j;! I( k6 n6 e( N
            }
( q  u! m" }# n" o0 M            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
2 x, Y% e1 Z9 R* Y* B" u; A2 ?            while (d != m - 1)
! k/ t/ P3 ^' @2 M9 j+ h, s            {
# n+ s- A9 k4 r7 V                if (i == m && d != m - 1)7 Q( d5 b( U2 T4 G- K
                {$ `9 @, e  q% m! f# ~3 @$ M' N
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
! {: |: Z! A! T                    continue;4 Q9 J7 q+ y0 Y
                }
2 r( ^, o! |0 u                else7 F* r- f, f+ [
                {
( o9 s7 y( [" i8 N. x                    if (numw[i] != 0)
8 ]% ^7 q3 S7 Q1 Y7 m. w                    {
" ?( e6 g1 i  ]# _0 u                        i++;
& r! A% m+ q  D+ p8 z! J+ |                        k++;" ^$ q1 Y1 x) T( T$ c: w4 r$ F
                        if (k == n)* x# F2 X- H' c* m) C  F
                        {
, X" R7 I; @6 W% r' `                            numw[i - 1] = 0;//把在n位置数组元素的值改变了1 M3 @( U7 I2 o0 ?( [
                            k = 0;
1 U& l+ J9 K( q! b              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
3 O" h: @/ D5 p0 c; G4 U                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
. J' z5 w- o* C+ I                        }* ~/ ^, M: r. n& L2 y9 D* D$ n0 ?
                        else//输出暂时还没有改变数组元素的值
9 q$ _$ {! r2 L' C2 p  B                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
6 `* z  t8 ?# I, z! P                    }7 l) d  e8 m4 E5 ~2 j& a
                    else/ V0 Z% V  g1 b# L) {- D9 F* L
                        i++;//数组元素为0,直接跳过,不计数。。。
3 }* I8 j# y6 w7 R0 G                }$ \- a' I7 V0 X% D& T
; H! a# h- {3 q1 U6 U

0 c8 t$ Y" ]# R, ?0 p( \6 G* g1 D            }//结束while循环8 l" E4 e( j  h  G: n/ U
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
& y1 J8 W' s4 D1 p           
* Y% I5 K+ l6 |' g- c                if (numw[i] != 0)7 ^: x3 ^/ _  h' G( j% T
                    Console.WriteLine(numw[i]);4 v( [0 o* M2 {3 ]9 h# q/ Y9 U
           5 S8 ~6 E: e1 [2 N+ U9 N
            Console.ReadLine();
! R+ L& i+ k+ s+ v        }
. J' h7 H# C$ |/ Q+ R8 G    }
' `; u; N$ `1 K: k" M& i! o8 V}( ~! d* @' x6 @2 Y5 o/ E
小甲鱼最新课程 -> 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-6-30 21:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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