鱼C论坛

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

猴子问题

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

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

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

x
大家好!
7 ?  f( N# B9 [( s这几天我在忙着编一个问题,我用了一种方法编出来!0 B: o* B7 W4 ~( t/ n6 a8 v! D1 y
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!" }" n- ?* o% i* _, O2 S) G
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
  o- b9 _& t6 U& H& c; Y/ K; x/ v4 a, Y  N( Y& P! K3 B

! _2 u9 }6 l* p' e2 F% p+ G
                            题目& O, `$ f! u: S0 i) `) W+ G. A
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。% |1 M( R, p  p# {+ ?( f
第一种方法:利用循环链表
! w% D" n$ O; e  V$ \2 U$ J% G- h#include<stdio.h>
: U: P5 a. r  ?0 j! t#include<malloc.h>& b, ?$ ~7 L8 h. w9 c
#define M 8            //共有8只猴子
4 M3 ?8 a- W- Y. `, N#define N 3            //数到3只时退出第三只
& x8 P; Q* L5 j3 Z+ @* xtypedef struct monkey
; b3 z& v7 K! E0 O* c{int number;
; K( c4 o" [1 [1 Y+ o3 vint flag;
+ }9 S/ O9 `& e& v! j5 S9 sstruct monkey* next;
6 Q3 g4 c1 L0 c! h1 V}MONKEY;/ g' |8 a9 z6 X' T" m
main()
8 _# M" \4 U9 {6 W' O+ R7 ?+ y, I{ MONKEY *head=NULL,*p,*s;5 u: K! Y+ |# _9 _; c* b8 \
  int i,sum=0,count=0;1 ]) }$ h# u9 ~
  clrscr();              //清屏
" y4 m2 _- G- Z! }  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
$ x9 y$ l% l* X6 ?" c2 }  p->number=1;p->flag=1;4 ^/ h% f8 P0 f" \5 k
  p->next=head;' A- K+ [9 B- Y0 ~
  head=p;
' \1 I- y( V4 y. B% H  for(i=2;i<=M;i++)6 I/ `4 [" n5 }
    { s=(MONKEY *)malloc(sizeof(MONKEY));6 c2 O5 I8 _' S% O+ W. J
     s->number=i;s->flag=1;
; `) h4 z; P, T1 m0 A     s->next=head;
5 X) L2 Z; g% G     p->next=s;p=p->next;4 e0 u7 L) w, \" e, i
    }
2 J% d/ L6 W+ T' g- `    p=head;7 N% ]7 d) [2 d+ }; L) k6 e' s( g5 d
   for(;;)
/ i0 R+ F5 f1 P, m    {if(p->flag==1)
8 Z# W9 g3 Y& Y' A! y$ T" m/ N       count++;$ P4 u3 Y7 P7 x$ S
     if(count==N)0 _0 R4 c! f  m5 p' |& Y( v
        {p->flag=0;" j! F- [7 x. l5 Y& l; L# @) q: B7 Z
         count=0;
$ n1 D/ A0 J5 x0 f! s4 i$ v0 G         sum++;}$ W- ]; z/ U. n& b+ P% ^
     if(sum==M-1)3 m1 T6 _3 R% o' g* c
        break;6 Y8 E, r# v) z) F) k
     p=p->next;& t7 D# \, q) E+ Q9 p
    }
$ \, e( u- [$ {( a    p=
& z& t/ q8 u3 }    head;
' K1 v# V7 p! n" E7 n$ ]  h    for(i=1;i<=M;i++)
9 n( F# B& w4 ^2 c1 \( v    { if(p->flag==1)
0 r6 V! @0 L) j, N        printf("\t%d",p->number);
/ h0 b8 A5 c" @4 {$ |      p=p->next;
  I. |$ B: z6 h, w$ {+ ^3 z    }- y' f2 n* R) N/ U1 [4 P( K' }/ A

4 S- Z$ K2 w# ^, n
) N& k* @& v( J! o* n  q1 ~
5 X9 u! |% k0 t: ]: ?9 G}

8 w0 T5 B% {2 ?第二种方法:数组) T/ E/ M# n. h( R
#include<stdio.h>  X! W/ n# J2 K2 h$ y, {
#define M 8" ^0 ]9 Q6 H6 A+ P$ L
struct monkey! k: L" [5 m4 u# W# D2 l& g$ j: @& e) _
{int number;
% \8 z* w; [) Q, H+ Qint nextp;4 L: t  X( D4 K# j4 R  c* v
}link[M+1];5 e9 g- Z; r* p$ u! C- {4 O: @
  c) o" i5 `$ ~
void main()
& O- Y, g' r) D8 m" A, F- q- B{int i,count,h;
/ B; V$ J( g# E0 G4 N9 R* m" efor(i=1;i<=M;i++)7 m2 b( E& T9 i0 ~
{  if(i==M)
( ^* ?3 w8 ^+ n   link[i].nextp=1;% I! O1 [! `; \: I: z. e
   else
( t" |' T: z3 y& E: l5 n; F4 C   link[i].nextp=i+1;
1 d# V2 y" M% A2 s  link[i].number=i;$ a$ x$ x+ j& G/ ]
}
7 S2 u& C/ _; G6 L% l% Q2 Iprintf("\n");( p2 k. y$ O9 K' N  v/ ~
count=0;
' D6 {5 F' d" x: Z2 E, x3 }* th=M;
  ~% K9 Y+ A8 P5 b# b7 f1 nprintf("依次退出的猴子: \n");
: }7 ?/ w3 \/ ^+ v5 J/ }8 Dwhile(count<M-1)  _$ R7 M! N) J% x) w: Z+ v
{i=0;
7 T1 t) Z* j/ h( z( H4 Rwhile(i!=3)
" E0 ^$ I: ?8 I+ u' @- a8 S{ h=link[h].nextp;* E% J- E# I5 l- u% T" _. t
   if(link[h].number)
' Y6 ^% @2 f6 Y, I& F5 e     i++;}/ t3 h+ S6 G: q0 |

* C2 j: q. J5 K" h6 D/ ?$ H% A  oprintf("%4d",link[h].number);
, Q$ a9 X" \% \$ Elink[h].number=0;
3 R) p4 j4 t) t% Acount++;0 H4 O: i7 H  _+ ~8 g9 |, U; N
}
3 r% K# _3 e, C
8 ]4 i$ ]: y8 }+ \printf("\n大王是:");4 ?: C! j8 W# v7 e* d
  for(i=1;i<=M;i++)' ^' A( \3 ~2 i+ [1 g, t
  if(link[i].number)
$ k& q/ c9 Z' V$ k* _" K8 ~    printf("%3d\n",link[i].number);
" X9 X# P1 P% L+ V9 E% u9 M1 L' Y4 h! L8 P/ g9 J

5 q" @8 \9 [  Y% m; U( l}

" S5 ~% {; M8 F: i% v% j. I第三种是普通方法for循环
- j8 V5 h& {; p$ a
#include<stdio.h>% ^* X; J7 Q/ s" i* s+ L: K8 y
void main()* |5 ^! \3 e! ?5 K9 Z
{ int i,k,m,n,num[50],q,*p;
6 v) z9 F  \# @  V9 j    clrscr();
2 X3 v, x* g  b5 \: T7 d4 P   printf("input number of person: n=");7 Q) f$ l: r. V9 n7 e" N: C
    scanf("%d",&n);9 X5 O* I$ }4 s2 e- m) }
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只! C) D  W1 v4 A' w$ K8 Z
    scanf("%d",&q);9 q6 @1 q. K1 p' W& J$ A( B
   p=num;
8 }) }) L! d2 Z% E3 A2 t4 ]& A  for(i=0;i<n;i++)  U$ `4 y4 e- |+ l
    *(p+i)=i+1;" u. N: B6 E) H% c( Q# X( \
   i=0;
; {5 v7 W$ V+ E& _7 t+ m- w  L   k=0;, z$ N* C* @4 V7 d. O
   m=0;2 E1 P9 h7 V; Q+ G" h0 ~2 Y
  while(m<n-1)
5 o; \* J1 c6 V% P# d9 a" v   {if(*(p+i)!=0) k++;3 \7 l2 N$ a) h2 r3 S( b* o
     if(k==q)
: Q( ^, N; e& c8 N) k+ H      { *(p+i)=0;* C, _+ w- e+ o4 i6 W$ I8 W& ?- y
        k=0;; l! ]" a/ C! F$ e, |  z4 g
        m++;+ O; k6 g3 H6 `* d
      }
4 e. d& ?* g& H8 i6 ~& b  e    i++;8 R( C- A7 R: p1 k6 X, @* Q
    if(i==n)i=0;9 k: P+ L' D5 Z
   }* Q% Q0 C; [6 `$ ]1 }( Z
  while(*p==0)p++;
; S3 K6 g5 J0 _$ R/ f5 \4 G2 M    printf("The last one is NO:%d\n",*p);
, W, v4 G  {$ [! c     getch();9 x8 `/ R- y6 b) \3 x: y! @7 n
  M8 \) p3 D3 A" @
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;4 c# r2 W3 H+ v' m# ?4 W- L
namespace 又费马达又费电
$ H% i3 g- k7 T5 F- W{& e: L4 G- I9 }- p% P& ]+ V
    class Program
' }$ ~  M) S( }2 v7 b    {1 t" D% w0 e  ?. W" [5 M
        static void Main(string[] args)% B  T: c' L  K5 D3 H/ R
        {# y- q' H: M; a6 m, F, M/ r
            int m, n;+ I7 h" J/ q7 ?3 }  B- v- J
            Console.WriteLine("请输入数组长度");/ n  \' X" A9 H/ U
            m = int.Parse(Console.ReadLine());//m为数组的大小
3 D2 C+ F" R, D2 T& ?            Console.WriteLine("请输入要截取数字的大小");* g2 d0 m. B8 d5 {# W6 }, L0 c
            n = int.Parse(Console.ReadLine());
" V2 V" C& q& b" R( T3 [  ~- \            int [] numw=new int! [( Y5 l5 _: T5 b7 O

# W9 i( X0 h5 z& c$ V& s7 a&shy;&shy;&shy;;$ K1 a& k/ Q0 D( ~' c
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
1 N5 T6 |) H* L# p, e            {
7 g1 t/ c& ?8 n& K1 u. g                numw[j - 1] = j;. Q$ B* x, _+ [
            }9 I( ], G) K4 B7 P2 i6 R
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!+ ~* O8 M3 c' i+ R9 D7 P
            while (d != m - 1)
5 a5 W- }# e6 \6 o: D4 ?3 N            {
/ e. R& \, f) R9 w                if (i == m && d != m - 1)! ]/ B  |8 M7 [9 }- T/ k
                {( ?) C8 ?  F) `7 J% b
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
) u2 X9 s5 Q& l2 u) K" M                    continue;8 G. e$ E0 M) E5 E4 j! j
                }
& f  ^& ~1 D/ I+ S/ i3 J                else
1 h" q% o+ L" Z4 B0 X& C6 \" t& I3 v                {4 S# Z6 f& c, j) K, i
                    if (numw[i] != 0)
6 ?8 r. D; c6 v& Y: c' x                    {
5 W6 Y6 J1 X0 |/ F                        i++;+ ^; i1 O4 a8 }6 W) a5 V$ C6 w
                        k++;. r8 `9 t7 X; X6 m$ O
                        if (k == n)8 N; l# `* o. ~  p* |% R9 E" [
                        {: |5 H& b* ^" O7 T* u; P1 ^3 V
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了  A' x, X' Q4 A# w7 T
                            k = 0;' M& A3 t; g8 B. d6 z: ?+ s7 Y8 U
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
3 x& u4 M# r. C3 W                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
1 u* A  K: t; Z0 n, @& V# }* L                        }* i( j5 R6 J; A' @8 m# y) p
                        else//输出暂时还没有改变数组元素的值0 i! G# D! O; v+ \' X  @; n, e
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
9 r" U- D0 C! t0 b                    }( w( n$ M6 O2 N" h5 {0 T( O. e4 ]
                    else
$ k; g, I- V4 R! p8 x* N& p                        i++;//数组元素为0,直接跳过,不计数。。。
9 u7 Y/ c; ^% w                }; h2 G4 ?1 f  q. R9 t1 g* \
) t( |- o! b0 ?6 L* X/ u

: K1 y6 z2 }+ G8 S9 w* {            }//结束while循环5 U" t; o1 N  b( y2 w- O3 I/ q
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦) \0 U* P2 V& x% E
           
% x0 G" U1 Z& r& Q                if (numw[i] != 0)! n' M1 c  u3 n& u& n+ A# k- k5 _5 y
                    Console.WriteLine(numw[i]);9 q/ c: x8 f' x3 O0 K, l
           ' L0 w. q1 D. X& w! U% n; d/ S+ c
            Console.ReadLine();
  ?4 d( y" N8 _        }+ h0 k5 C* _. A6 T9 k
    }
) S6 i# ?, S5 z/ f}
9 j) C- d2 g: Y$ i  r
小甲鱼最新课程 -> 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-17 06:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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