鱼C论坛

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

猴子问题

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

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

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

x
大家好!
5 t9 m; @$ ?/ N6 ]2 ]这几天我在忙着编一个问题,我用了一种方法编出来!: n& T$ q3 E/ b3 D: O
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
4 c7 l6 F! {+ d+ ^5 y6 l0 y注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ; q5 a( W$ O. H( n  w
) v7 E, ^$ A$ m* w# _3 N3 u) |, s
2 q4 [, ^/ A7 `: K# q: u
                            题目
* o1 _8 N& w- w5 M1 }' t山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
  h5 |& p* [; g1 I# ?, @第一种方法:利用循环链表) z. D# U6 e2 g
#include<stdio.h>, ^2 X& ], K! f% }- L) D
#include<malloc.h>: k! @1 y8 r- ~! z$ ]/ {
#define M 8            //共有8只猴子
. P8 q3 A9 d5 f: m0 O1 v#define N 3            //数到3只时退出第三只8 [: |# F9 r7 e/ s8 C  y( g
typedef struct monkey4 n" r0 m, U: k' ~8 Y/ x
{int number;
6 ^0 c- E( U8 b7 Q1 Lint flag;, P7 ~" Z. @1 I
struct monkey* next;
6 R/ n- \! _2 k3 }}MONKEY;
7 k# A2 z+ q; o5 }$ [main()) }* v! {, G. K0 v
{ MONKEY *head=NULL,*p,*s;
! j9 r; Z: m3 d5 q  int i,sum=0,count=0;
- M1 [) _- U( k! o) J; F) g  clrscr();              //清屏
- |! D7 x: O& o& o% g! a* q  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存& e9 x, z6 m! }  O* N, ^
  p->number=1;p->flag=1;. w0 H0 _  H, c& N
  p->next=head;
$ C* I" L9 V% H. z, n* l  head=p;
5 S! i1 b8 x9 E- H0 W  for(i=2;i<=M;i++). t2 l, T$ x$ [2 P  R
    { s=(MONKEY *)malloc(sizeof(MONKEY));
" g2 A, _+ X1 A3 t5 ]5 J3 F* @- V( h     s->number=i;s->flag=1;/ G! X! g' g* Z1 D7 h$ a
     s->next=head;' w) l/ E9 L# T1 V) O1 G$ _
     p->next=s;p=p->next;
2 b8 ?3 H! L1 t8 n' m! L    }
) {  q2 z! O( c8 n    p=head;
5 ~! G3 e! c$ `6 u4 H5 y   for(;;)
1 {: Y1 _5 d0 D. d    {if(p->flag==1)5 k) W* M0 h/ F. B( D
       count++;
* c9 f% t! b, J% @! W7 p* K     if(count==N)
# B3 ^5 X0 \# n5 N  r1 {        {p->flag=0;$ V9 V; X% Y! p
         count=0;
7 Y7 {# i: p  @' Y) Y( W5 O         sum++;}
" O0 \2 J3 a8 z0 k5 V     if(sum==M-1): R7 g9 j! j2 [7 D% l! h
        break;
3 D; Q! z  u3 ~6 {8 `     p=p->next;
7 w$ H, Z+ \( D$ l  ?+ ]    }
. y2 ?. q5 L0 H" z! S3 P9 l) r    p=
. `. J8 f; E- Y! w0 ~) \: s    head;
( Q  n1 I) e; y) e    for(i=1;i<=M;i++)
& c% h/ B! c1 E1 t; Y! \. ^3 S. X. E    { if(p->flag==1)1 r; ?$ q: T; r$ z5 [+ M
        printf("\t%d",p->number);
  q9 p' Y8 L* m: K0 B      p=p->next;
0 ?0 c5 c3 U. C3 ]9 f5 E# e    }1 I3 e( p. q$ K: R, d+ y" l

1 M* q2 P( h/ X2 v5 z' E" S; V1 K+ F5 G  ^

4 D% b8 J0 i% I3 _}
5 q' D8 x& n+ X! Q& }
第二种方法:数组$ }6 L; Z/ Z, z* Z: r# W8 S6 P
#include<stdio.h>
4 f. n! e/ S+ Q7 T0 V#define M 8
7 e9 N6 Z8 |1 t4 H0 M0 S! |struct monkey, w& p) s) h# @) n6 ^
{int number;
# L: }# d* D& H" ^, |7 Uint nextp;/ K8 E5 @0 \7 o6 |; x4 S* y: l) ^
}link[M+1];6 F8 g  f' G6 m7 l9 p& L. Q% u( g8 e
0 U! b# s' v  J. q$ l
void main()
8 l5 r0 n1 q7 W{int i,count,h;+ d& R8 z2 K0 \5 h% I+ y
for(i=1;i<=M;i++)5 F- Z+ q( r0 |# ^, _
{  if(i==M)
+ Y$ `& Z0 Z( n" H8 h   link[i].nextp=1;  N% a$ F# B) g3 _$ b
   else
" S# ~( _% M. K" Z) U$ y3 s   link[i].nextp=i+1;: |) V4 S" U$ G! X9 l
  link[i].number=i;" {; k5 P3 |* E" Y
}
# s4 a+ e8 d- T2 Z/ J" kprintf("\n");+ x' _* R# H7 O0 s" E0 l' P: A
count=0;9 J; W1 {+ f2 M/ p
h=M;
! v4 c" h" ~& U3 j7 P: p/ F1 E* Sprintf("依次退出的猴子: \n");
: n) Y$ S) E* B0 d0 m4 g* kwhile(count<M-1): {  E6 l- I% f- ~# }6 _
{i=0;
9 [9 x6 K7 m# i6 g; M+ d1 ewhile(i!=3)6 b5 e* P2 H" O# h# [
{ h=link[h].nextp;& V$ h/ a" a) ]0 h+ l5 d" h
   if(link[h].number)
) Y1 o+ G1 a8 j( }     i++;}' m' X* V& M! v: q3 i8 D

+ y; ]1 N3 Y% r0 x' V& dprintf("%4d",link[h].number);
& ^# Y. u% F) Z: y7 tlink[h].number=0;
, F, ~7 l7 m' S( Z2 V! lcount++;: Q+ t4 N- q! F. Q& l6 Y
}4 A; b  U, [, Z5 N- v' o  x
1 O1 E4 e" G& x5 o. s  [$ s
printf("\n大王是:");
0 l; J1 j* ^+ {  for(i=1;i<=M;i++), j8 m1 O- e' C7 m  O$ f% @! O
  if(link[i].number)
! A: n3 w; k* a1 n% n) O, b- K    printf("%3d\n",link[i].number);" E" d; J. b" d, u
# a7 q4 N' s" J' u
1 c+ }! H7 ]4 U8 Y" K
}

5 X- x7 F( s' `6 ]% p* e' d第三种是普通方法for循环

+ l' j. X7 _$ ^/ U# Y! ^#include<stdio.h>  v/ Z' _: d( m! Q! M! X% u7 A
void main()0 F5 n2 e+ x! O3 v; X6 O+ [
{ int i,k,m,n,num[50],q,*p;
4 q2 F! @% d. Y6 G' F/ o    clrscr();6 a5 T! z5 y& M4 {2 |4 V  H
   printf("input number of person: n=");1 K" a' }$ W4 h/ I
    scanf("%d",&n);$ L- [7 d% c% H: R- ]6 b+ n
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
, N$ q) h. z2 G: Z( D1 ~0 u" a! i    scanf("%d",&q);
! F% |# H! `$ s# y9 @   p=num;0 R' Z5 u, z: x: d
  for(i=0;i<n;i++)
6 ~; A. e% d6 [1 x$ K  ]; O    *(p+i)=i+1;3 [" x  `/ w8 G, ^
   i=0;
% z6 a% X, A1 _9 V  c   k=0;
! s- @4 @7 Z- V. V   m=0;
4 N$ M. Y/ u( a8 u  while(m<n-1)3 X+ S8 y0 T) g( u4 e
   {if(*(p+i)!=0) k++;
+ }* ?2 q; ~  ]) s     if(k==q)
* I" X, O6 ?1 t. U      { *(p+i)=0;
3 N. a- V8 A0 G  M$ F" _3 u        k=0;8 W. u' w( n% ~' Y8 j# t" D
        m++;$ f1 T* B- U) G! M. L% G% t) C; o
      }# ~- p, p9 ^  w, w, N5 z
    i++;
4 e  G3 [6 X$ e$ K  A, ^    if(i==n)i=0;" F) X$ m6 Y) s9 e) ?) y: }
   }( `  |  r/ }) X+ H- {; M
  while(*p==0)p++;
1 v9 o6 u) U" {; j" S0 w    printf("The last one is NO:%d\n",*p);2 Z5 w0 S, _6 z
     getch();1 d! {$ T- f' V

7 [; s% P6 G  G4 U+ {}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
$ e/ p: F6 K& N) h! V- Xnamespace 又费马达又费电7 m4 I* l8 N) H/ v( X
{
! M# }. r* ^/ i+ P; O+ E! a8 G- @    class Program
/ C2 j3 y% A2 e& |- O6 s    {
6 X1 [( O2 h. J9 T        static void Main(string[] args)+ T# O" D8 v  ~, J/ E0 Q# g
        {
6 V: ^( \6 D" {$ u            int m, n;1 B& P/ P. H) H/ p% v
            Console.WriteLine("请输入数组长度");2 H' g1 @( |0 y1 N5 m# K. u
            m = int.Parse(Console.ReadLine());//m为数组的大小6 }6 X& z; A6 W$ Z2 F/ r! i
            Console.WriteLine("请输入要截取数字的大小");4 n" _+ t6 y" o5 P5 j  E9 Q
            n = int.Parse(Console.ReadLine());
: }! D4 R' p8 Z# r4 F/ j# g4 d( ^            int [] numw=new int
# ]: t4 O$ {' e. D( a9 v
' b& k" @- _) g* I5 n/ \/ |&shy;&shy;&shy;;" H9 O4 A8 [$ s; V; t0 e
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
3 F. }3 @2 s' A6 A& z2 ^9 u9 R2 D3 x            {
: D( c- ^$ @5 T! J1 }; `                numw[j - 1] = j;* {2 s* E) \7 a$ t
            }
) j- @8 m4 m8 j- H( r4 C            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
7 \2 l3 c# _* Z: N            while (d != m - 1)5 o6 Z( z6 e; B! s+ g' X0 t
            {
4 q) ?2 a+ r; f9 ^) U                if (i == m && d != m - 1)
1 E3 A! u3 I. q1 h+ r% _6 a                {& G) v, g; x% e
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
# I$ y' u6 g% L( Z7 Q8 D8 B                    continue;
& Y" f1 r0 ?+ ?                }
1 t) F5 a/ p8 J( E2 s( g$ F                else
7 L8 i3 X1 k) E                {
, n  U$ {( k7 W; u                    if (numw[i] != 0)
+ \; m) {3 j+ V, P# R                    {
  a, T1 S; \) L% T) @                        i++;1 x" j4 ?/ f3 n, F* r( a
                        k++;+ x) o, {( M% b2 e8 b! R" \" o
                        if (k == n)$ s9 O( V9 _: V+ z7 V! g
                        {7 B, g0 c9 K, p. o; T% g
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
' w5 V2 U$ \* F! c                            k = 0;
/ N2 n4 l9 R$ ]/ d) x+ ^6 C; w; ^              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1$ _0 P/ V2 l- a* v
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
7 h6 G' S1 b" }* X& m* z7 Y% A+ B                        }( k$ U# t) m, \" v3 t1 e$ ?
                        else//输出暂时还没有改变数组元素的值
. b5 K) J6 K& P5 b/ s                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
! P9 H& Z" ]7 J                    }
4 g  P& V* d# s- M" T$ c. O# u                    else! F4 A/ F; D6 [- Q, I
                        i++;//数组元素为0,直接跳过,不计数。。。
6 a  d) c' n+ G3 W8 u                }
; A3 l1 @6 R# X7 S; y' k2 p3 I/ N8 C, Z - z0 g# D) c$ B: @. X

/ N. |, H1 g% b& F            }//结束while循环
/ P* ^7 d; H. \+ G, P# h            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
! i; w2 f1 g' T# a1 _             W1 G. l) r/ o( j) G
                if (numw[i] != 0)
! p. f: I' _/ n/ y                    Console.WriteLine(numw[i]);) x; o& E3 ]! X" T
           3 F7 j3 j8 l( ^' V! [: t$ m
            Console.ReadLine();
4 f* v: u7 \4 `! r4 w        }
1 @& L0 l' ]5 B$ a1 L( ^# @& g    }
. z% O% e  u7 e. f) z% U4 K, w}+ X3 G9 j, c9 S5 O. U9 u) D
小甲鱼最新课程 -> 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-15 09:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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