鱼C论坛

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

猴子问题

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

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

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

x
大家好!
+ U& Q4 p8 F$ J6 ^* i: G. d这几天我在忙着编一个问题,我用了一种方法编出来!: P$ }3 X8 e4 {8 F) W
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
2 a0 ]7 m4 ^& b! j) [! g; W  V注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
# l1 W" [( r3 C& U) i5 c0 P3 t# S

1 t# q$ M( L8 q2 Z; z
                            题目% C5 d, Q$ q8 }8 ]
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
) H$ Z) M4 e2 f第一种方法:利用循环链表
8 `/ v* h3 R1 d2 {7 v. q. \0 s% }#include<stdio.h>1 E5 T: G8 R1 c' d
#include<malloc.h>% Q$ e2 d( x% {
#define M 8            //共有8只猴子
9 O4 v! j5 h7 P  Z" ?; f5 Y#define N 3            //数到3只时退出第三只
# B4 v# ]6 E6 ^. T, stypedef struct monkey
* l, C& B9 q2 y5 X6 X* q{int number;. r6 ]$ i: d" \- g
int flag;
& Z2 j6 |+ Z2 c  Lstruct monkey* next;# G  i' q0 P; M
}MONKEY;
0 @- H7 Z1 T) O$ ]8 amain()
& ~  _6 D7 G2 Q5 J{ MONKEY *head=NULL,*p,*s;  s: W1 O# P% Q3 I# X" |
  int i,sum=0,count=0;
5 V, C$ e; b. T  clrscr();              //清屏1 d# _8 _  q! n# I6 t
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存, X7 n8 m7 O9 _0 l, ]
  p->number=1;p->flag=1;9 q+ i* W. U8 W% W5 M* q& p* @
  p->next=head;) S( [2 H1 @$ T, e1 f0 C: F
  head=p;
! m5 \" s0 w* R' K2 {9 I% p8 K  for(i=2;i<=M;i++); b/ ~; x, x4 a% |
    { s=(MONKEY *)malloc(sizeof(MONKEY));
8 p  D& D3 T3 X' E$ |     s->number=i;s->flag=1;
+ @" K7 ^* A+ o# l/ M     s->next=head;3 `# y: ?8 {$ z/ Q1 Z6 M( f
     p->next=s;p=p->next;
$ P2 B: }' O9 i, ?1 ?& l    }
0 @" ]0 M7 D; W8 w- W' Z    p=head;4 v4 i; T0 @/ o9 r2 h
   for(;;)
) X' ^- M# ?; c    {if(p->flag==1)1 h+ @' z0 U2 y% Z
       count++;$ u, C) k2 {) w& [% y
     if(count==N)% f9 Z5 C+ X0 I* U9 N( N' s
        {p->flag=0;- q9 e$ A* ^3 @0 t+ J( f' V- f  @
         count=0;
$ i! v2 O3 O  y- |9 H: A* y! k         sum++;}
6 c7 K7 `, O9 P' V1 U2 F# f/ G     if(sum==M-1)
& ]2 @) B  Y& h. F        break;) V! t& S4 X' B  U9 N
     p=p->next;
! G' Q7 z# }% r    }
) o( r- I0 {7 J% }3 c6 n    p=$ I, [& L; K7 c9 Q1 H) T0 b4 i5 [
    head;
* G, S$ V, x1 U2 U( C) p) N    for(i=1;i<=M;i++)
8 I  @; t( ^3 [5 T    { if(p->flag==1). R3 `8 u- A  V( N' A
        printf("\t%d",p->number);6 N& b5 ?8 t9 g( ]- Z8 a! ~- ~% U
      p=p->next;
% A2 A. s; t7 \/ v- c- d: N    }
2 |( G; _2 M- ^  H* Q2 W; s' f
0 l4 D' E% t8 r! I6 Q
: R) r& n: b! j8 Z$ B& u+ G; X3 F# g4 u1 E3 U
}

3 Z" Z/ Z! l+ `. O% M6 {8 d9 F第二种方法:数组
4 p' C7 ~8 J( Z) @#include<stdio.h>
) Q% B( N0 f. q( L$ G! k4 \#define M 8
4 t' P% W6 o7 @$ K' Ostruct monkey
4 T3 a. F  t8 U4 d! s{int number;" \0 {" _5 F1 Q
int nextp;
. T4 t9 d- v( R6 L+ w- l; n}link[M+1];' ^6 ^; b# C6 m  w7 k0 y
( y2 |' S4 p0 q. C; a3 U3 `: F
void main(): Y$ @1 N( R8 d2 y
{int i,count,h;
+ ~- q3 `7 `3 O# ~7 `8 z6 H( afor(i=1;i<=M;i++): y4 U" C6 L' s4 N7 g- q
{  if(i==M)
  G, N0 l4 X: s: x   link[i].nextp=1;
2 M  Y& M( K/ M/ X  S   else2 I8 X/ E& I% B3 i' D7 V
   link[i].nextp=i+1;
. l+ @- m/ l5 z% j1 R( A  link[i].number=i;9 y& g! w4 a2 d% G# s
}6 r1 ?2 A" e- d  M9 p, r
printf("\n");) {" U7 ?+ Q; S' E7 g
count=0;* F, Z& K) ^8 }3 |* W3 j
h=M;
" T5 U: \4 j. d6 Q* z9 Gprintf("依次退出的猴子: \n");
/ ^8 s- B4 w2 ?+ w: F  Zwhile(count<M-1)
2 ?5 A7 E0 v( c, |* y{i=0;
4 i0 |) @* V. u" Y2 D" \while(i!=3)8 C. ~9 F# X3 E  Y* I7 N) z
{ h=link[h].nextp;: ~! ?- h6 X3 n
   if(link[h].number). ?0 s2 w' {& I6 J: _
     i++;}
- e  g+ o  b& x1 t0 Z3 J2 U
0 V3 r6 W5 p& k* s) y' K7 tprintf("%4d",link[h].number);% X1 @1 C" F" d/ c) W: ?
link[h].number=0;
( b4 z1 n- t8 U( q3 A; [7 \* d! `count++;
! O& ]- y; m% p% Y}
: t- V1 w: L; W' c4 U/ X( A
% N# @0 G2 [7 a/ j, Nprintf("\n大王是:");
  v3 {# z; g9 w  F( b* D  for(i=1;i<=M;i++)* ?- v! Y) A3 C. C- a. f9 W3 Q
  if(link[i].number)% a( F$ i" |& d! D
    printf("%3d\n",link[i].number);
% t$ @  ^% }" }4 {: l1 V. M( S9 u7 d% s) M: |

+ f% L% g: R. i6 y3 m}
: V2 i: I$ x3 y% s0 E% f% }' A+ [
第三种是普通方法for循环
3 s% t$ J7 v- X- q7 E% v
#include<stdio.h>7 ]' e6 t( u' p% c3 R
void main()4 S4 F/ n# W- z) [0 G# ^, Q
{ int i,k,m,n,num[50],q,*p;2 ?, P+ B$ H4 Q
    clrscr();7 K' m0 l3 |  e3 J- m6 M
   printf("input number of person: n=");
1 G  M, [, X) u    scanf("%d",&n);5 k% q& R8 Z4 l3 |" c3 c5 e! g
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只0 N& e, H" S! \8 i/ Y+ p  P$ G
    scanf("%d",&q);% s  Y' e8 g9 U* \
   p=num;& e( D$ a" @! A9 |/ V8 y2 k4 s+ E
  for(i=0;i<n;i++)
4 x2 w' q8 n2 i4 F6 t    *(p+i)=i+1;% U# a3 h( s  c2 B4 s4 [
   i=0;" `6 j6 w' @% B
   k=0;
& H/ t8 \2 p$ I3 n1 _   m=0;
4 g  U' f! M3 T) g; {  while(m<n-1)
! ~. M& f5 D$ J) ]   {if(*(p+i)!=0) k++;
9 `9 ?+ p; R' G" q+ x. D     if(k==q)
; G) |, l, @6 v& k  t8 w# ~3 I      { *(p+i)=0;
! e/ `: F+ Y0 k0 L9 u        k=0;
1 w( T) m9 S6 ]' C+ b        m++;# g) m+ u- i( T
      }- m9 V; h% w9 D& g# T, h4 a8 K, n
    i++;
( i7 `2 h( x5 L. C9 ?* ]/ K    if(i==n)i=0;% v' {, l* C" v0 A$ x' }* m7 k! E
   }. o3 c" x- d/ K! [$ E
  while(*p==0)p++;
. J- e. B0 s1 p    printf("The last one is NO:%d\n",*p);
* _8 }! h7 O7 X0 P4 R% h     getch();
; E$ t$ K- `- p( q4 ^3 L
0 s; K- ?/ P* N" c. W* ^! g2 U}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
: R3 H2 Q; @  q4 l- R  E; Lnamespace 又费马达又费电
; v0 V! o& G, E* ~4 R{4 o1 o0 A7 h! t5 E3 u$ X& s
    class Program5 d* x$ r4 d' H& {$ \8 O
    {
' `" v8 _# j3 |& x1 e        static void Main(string[] args)) A/ F, P: A8 v) y/ o) v
        {% s& {5 {/ }/ o$ d$ G' f6 C
            int m, n;( x9 g3 Z- p5 O) X
            Console.WriteLine("请输入数组长度");
. q, E( x+ |, L) ^* A            m = int.Parse(Console.ReadLine());//m为数组的大小
$ n  c+ C: x$ A2 P* M            Console.WriteLine("请输入要截取数字的大小");
& x" q8 K5 K/ O$ O            n = int.Parse(Console.ReadLine());
, e* S0 s. O! l. x            int [] numw=new int
7 x+ ]5 Q/ k  @6 d1 T- i  y+ o' o2 r4 o- @& N2 f" n
&shy;&shy;&shy;;
. }/ @& G- ^1 h: Q7 W/ l& j            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
- x) T; u4 D9 o            {
5 x% ?* J9 C6 ^% X9 v0 N7 w                numw[j - 1] = j;
" U6 v9 g4 K( V1 S4 _9 s1 \            }: u3 }- ?5 E1 o, S3 ]- Z, _6 u* W. V
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
9 r% {$ a4 J" y( c, [            while (d != m - 1)1 Q) p# E* P, X9 K& e% `* j
            {( E- k) n) \# T8 [
                if (i == m && d != m - 1)
& W& H( e( ], {3 z% }! p                {! Z- s9 p. D. M9 f# @
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!7 A; `! z) g* ^. W2 \# q. ~
                    continue;
% M' L- l( T) c4 h! [4 Q6 z                }7 r. q  }' H3 a! Y9 Q3 d+ q+ c6 @
                else
5 [) c- ^" \# W3 s                {
9 m- _3 i) V4 Q7 j/ u2 `6 b                    if (numw[i] != 0)8 ], U( m( P3 r# i: E! c1 {
                    {
# B1 m$ k/ [+ k* v0 ]/ b: t                        i++;
7 b/ f( ~! a. v                        k++;2 k+ m6 c6 ]$ }$ y
                        if (k == n)
' k0 v7 B$ }' e4 }9 x7 z                        {
8 p0 _8 Z& R/ j, a                            numw[i - 1] = 0;//把在n位置数组元素的值改变了& ?9 M" Q9 E8 y( {' V2 V  ^
                            k = 0;
# l9 j$ N. P3 W. \" o( \3 y1 t              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小11 r' ?5 u3 P& P) @; ~3 i* a
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
, |6 k% q: k* ?6 G9 p3 A                        }
# ?; E+ x4 y) J. r* R                        else//输出暂时还没有改变数组元素的值
3 r# Y- x2 z$ ~6 k3 ?3 c                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);: o) F. n* P" s
                    }
2 F! F% q4 M% v                    else
# f8 e  F+ f! C( g" R+ @' l! |                        i++;//数组元素为0,直接跳过,不计数。。。
6 a8 w- c* j+ x" f9 Z7 {; E$ l# b3 M- [                }" o, j& s; i9 d! j9 |8 k" u; w( k
( I5 V, d% X& l: o2 P0 Q" y; O7 [
( P2 u1 }  d& N0 ~4 m# o0 S( j
            }//结束while循环. x8 R3 D' m8 C- H  y2 C$ ]
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
$ x0 p9 \; T; p8 j2 P# c           
% y& D: \7 J) p/ Q6 {6 A                if (numw[i] != 0)
, }& F+ }+ ~0 f& T% S5 U                    Console.WriteLine(numw[i]);
2 O0 ^- o' L; @. E- R& e- I           
& [& Y& Z& H0 B3 ~1 B            Console.ReadLine();
: _8 u/ J7 x0 a3 F/ \" B( {        }0 Y8 j/ G6 x3 x6 t$ D
    }; q: r& R5 u5 o
}
8 N1 a2 Z* Y: 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-7-30 19:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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