鱼C论坛

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

猴子问题

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

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

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

x
大家好!& p2 x0 o% ^, a/ t7 C
这几天我在忙着编一个问题,我用了一种方法编出来!
, I: |7 j. H% p) n% }但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!6 y4 T  V+ L4 U' ~4 ^
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 * K# _* F% A3 \9 a5 F3 k
4 g( o/ n% H7 Y4 |. {/ [- O6 n! m5 @
" |0 o% i2 s6 b
                            题目6 T5 J$ Q* x* Q  }; K! E
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。: k* @9 u6 C! e) o/ M$ N5 E5 v
第一种方法:利用循环链表. O1 a, A$ v+ `! l9 n3 C8 [( [
#include<stdio.h>
4 X# Q: X0 o$ R* P( \#include<malloc.h>
" Y! j  J! m( Z6 |  T" x" u#define M 8            //共有8只猴子2 j& ^6 m* Q5 F! \
#define N 3            //数到3只时退出第三只
2 O1 h1 m9 a( w& r: @0 c  ptypedef struct monkey
2 B5 e- [" r* n& F6 |, b{int number;. b$ \  ^* s- K; ]- S
int flag;
2 b% F: n0 ?' |& f; Q. w. ^struct monkey* next;
6 E2 n2 L* C6 P% I/ J) ]$ Y: n}MONKEY;, U/ p! k9 N2 h0 a* O$ M4 b. U
main()
; X' o2 P9 v2 H% d{ MONKEY *head=NULL,*p,*s;: ?( i9 i0 c+ o. N4 N' ~
  int i,sum=0,count=0;3 W) t1 s( n8 G& J# R/ [; {5 D/ Q
  clrscr();              //清屏, g6 m8 P1 ], i) z
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
7 @$ X0 J, \) s5 D; v* V+ ~1 c" t  p->number=1;p->flag=1;' T; \% @3 `1 E" Z
  p->next=head;. k1 k3 L. ~% \6 B
  head=p;
; \+ R  v( t! C* c  for(i=2;i<=M;i++)) [- Q6 k: K, B$ I
    { s=(MONKEY *)malloc(sizeof(MONKEY));6 _! q3 _& g2 g7 R1 ]) @/ |
     s->number=i;s->flag=1;
. @1 U. M7 Y" F* \9 J% L     s->next=head;; E+ e: I9 ~6 O& \
     p->next=s;p=p->next;
& y! N4 E% M3 T- Z$ q) h    }
+ e2 H) M3 D" m5 w2 O9 w4 X    p=head;( v% n& X5 N/ F2 t7 {. o
   for(;;): ?9 g' |( A8 u
    {if(p->flag==1)
1 {3 ]8 I, t& G2 N4 ~  {       count++;
) n9 e. m, J5 c/ C7 y) [8 S     if(count==N)
5 H, U- }, \( P( B' x        {p->flag=0;& [% d- D4 X! X, S' c
         count=0;
' Y$ l1 Z% ~5 m  U         sum++;}
0 R4 c" a7 i+ k2 c     if(sum==M-1)
0 Q: V3 q# Q8 C1 M5 W. d) }        break;, ^+ O8 _" ]: [7 n
     p=p->next;0 v) A* a0 x; U6 k7 A
    }  d! o6 L8 H2 V
    p=+ j0 Y% {" R; X( b' F( w$ A
    head;2 M0 A7 ?  l5 w9 L
    for(i=1;i<=M;i++)  i- M$ T! p: M4 Q6 h1 t
    { if(p->flag==1)
, p5 G) l+ v( v4 L( }- V        printf("\t%d",p->number);
, p  W+ s; U! n: `      p=p->next;, I# \! a2 S8 r1 H1 w
    }% G, r* t/ \$ {5 H' T
5 l8 R9 e" I3 c3 i% H
; o- [  X& r# Q. D, D5 |
! D1 H/ J& R: a  B: y2 {- z$ i% d
}

6 g& _# ~/ m& a1 B1 _8 s2 q第二种方法:数组
/ K* c0 `; H# u- [, Q; n% ?#include<stdio.h>( `& W" f1 e* k7 ~
#define M 8
& w  g7 B8 u6 T/ J) zstruct monkey
$ b; F8 M5 P3 F{int number;
- L/ r5 K; x8 }; P, F+ E5 pint nextp;- v6 b9 ~: ?# w
}link[M+1];
6 O8 J& P4 q) x8 B$ d" M
* H) ?  D4 V+ i; j' a0 Hvoid main()1 U' q% U* d* u1 s. [6 V" f
{int i,count,h;
" q: J  F& \! p/ r1 `1 O7 m2 \" x4 Bfor(i=1;i<=M;i++)
4 L' V/ d* o+ G+ W" w' m{  if(i==M)
. I2 J: p* g1 O. M2 a   link[i].nextp=1;
1 S" O+ L* w; i6 R0 f7 ^   else
" W0 d9 M$ a8 [2 w+ O2 k   link[i].nextp=i+1;' b3 m- ?" ?+ u: N' b# K+ X
  link[i].number=i;
; ]  Y4 x& ^1 {0 N7 u; P5 J}
$ `0 T+ k, r# C, Lprintf("\n");
: P$ |) c* q9 a* |, wcount=0;
. }  _+ g. i0 z( Jh=M;/ G$ b1 l7 ?* }6 V
printf("依次退出的猴子: \n");
$ O1 m" ]/ K2 t! mwhile(count<M-1)8 M0 N4 }0 _$ ]$ z
{i=0;
* b0 |- }2 n/ p. N% {3 \" |while(i!=3)# E4 p2 W' M) `+ Y
{ h=link[h].nextp;
. T( O$ `4 \* v4 Y: u) C% @% C   if(link[h].number)
9 d$ b+ J3 ~/ _& o0 {9 v     i++;}# T% h0 ]/ t1 P! A
6 a3 K5 Q- b0 X* D& H# |' v# ]6 x
printf("%4d",link[h].number);
2 s* c* M1 O( C& R2 blink[h].number=0;2 i* h& W7 V  v- ~* ]6 \
count++;
+ A1 ]6 j0 l7 ~% C  W}. d& h* x( T# y4 U

8 k3 O0 J2 {, }2 i, \0 B, b$ gprintf("\n大王是:");  \+ l- @, D+ x/ X% h
  for(i=1;i<=M;i++)
: J) N% W( O% ^- ?% }7 E4 c: t  if(link[i].number)5 u# M" z+ {' ]# B. d3 b4 |0 Y
    printf("%3d\n",link[i].number);
" C7 h- x4 b& ~( S% O
. E  W1 A7 m) u+ Y! q8 @' M# h" D! l, p% l
}

% W/ S+ V0 E7 Q+ P, u4 b第三种是普通方法for循环

6 I3 _0 m0 Z0 Z9 P7 x9 O#include<stdio.h>! p' q% z$ X" |, F  l+ W
void main()
* w. o, ?( }6 S{ int i,k,m,n,num[50],q,*p;
2 \2 }: f/ H; t0 z! X% K    clrscr();! f0 Q8 K. M% C5 o  b# O
   printf("input number of person: n=");, T1 r4 z" X1 D8 }6 s8 c
    scanf("%d",&n);$ Z2 z) p7 ~  @, O7 W" `% U; w
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只& P  a. I2 u( D6 r6 ^& j" d
    scanf("%d",&q);8 u: z8 _7 d% f( Q
   p=num;; ~% L' D( D& m; L, ^# b
  for(i=0;i<n;i++)
! H5 e5 B! m0 j. i8 l& x* l    *(p+i)=i+1;1 q: K+ C- E: T1 m. Y
   i=0;
5 _- t) V: J, c   k=0;% j; c- E' k3 w# G, A
   m=0;
. I3 j/ v0 i  ^6 z& D  while(m<n-1)
: ?. y+ ^: g# P# n   {if(*(p+i)!=0) k++;" ]. ^* K5 j0 c! b4 w
     if(k==q)* K5 H( o! a' C! T7 i
      { *(p+i)=0;
8 a' p, C2 w; G: u/ w6 ]" F0 F+ }' H        k=0;
2 S9 V2 ^. Y' ~" n        m++;
. h6 P9 M1 c  d6 v      }7 l. K0 ?6 P! W$ r# H
    i++;; S3 k& ?  \% V. q
    if(i==n)i=0;% b1 S$ E1 |  a' x8 ~2 N4 p4 ~
   }
3 q+ q+ D, c/ M; Y4 I6 ]  while(*p==0)p++;9 S. s5 c3 L# }8 @% Q! U
    printf("The last one is NO:%d\n",*p);& V0 K$ }' m$ [. e
     getch();
" G& t' c. Y3 \, ~4 [, f
* `( f# K: G4 O5 c}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
; B( K7 s: }4 M9 I2 q# ?0 ?6 }namespace 又费马达又费电
; B8 g  X+ u2 i* n{
; Q* j, w* V) O& W7 B1 F8 Z! d    class Program$ ]- V7 a. O! A
    {( c7 l! }) ?: E  {. D! e
        static void Main(string[] args)
" u0 \3 C+ U9 D* i6 ~7 h  V8 i        {3 e( A" E- p" ~0 L6 _% W
            int m, n;. V, e+ h2 O9 B# C$ M7 Y5 |
            Console.WriteLine("请输入数组长度");1 Z$ Y' R+ G9 {" B
            m = int.Parse(Console.ReadLine());//m为数组的大小
+ l  T9 y6 O' @( e- C4 r0 K* \+ m" Q' W            Console.WriteLine("请输入要截取数字的大小");. M# t3 X$ w9 K2 t. h5 }2 q7 X. D
            n = int.Parse(Console.ReadLine());
* z! p7 \# u. ^  n7 X1 N& K! f            int [] numw=new int
& o  O% f8 l5 g9 C. O0 H1 f- K% L! N* x% m' t2 ~% x6 j
&shy;&shy;&shy;;
' c5 K9 @% e0 h6 ]            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数9 i) \) q" I( i" G
            {& }9 b" u6 v8 T/ H( X- w# D
                numw[j - 1] = j;
$ U- C7 }& T5 M  L' U- t0 H+ r4 ~            }2 A7 f8 O/ S8 P
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
1 U) i% K" o7 w5 J1 m$ S( N            while (d != m - 1)
) ^3 R0 Q9 `( O2 I5 w            {. U$ `$ j9 |% A3 g' e0 C7 n
                if (i == m && d != m - 1)
4 M9 i$ x) G, x* c                {) {# \. f  M; P, p9 b
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
) @/ ]- [+ L* X' y+ ^2 O: j- o* k                    continue;# I* H" @% Q$ R
                }; x( f3 i  f+ t1 }
                else
. J8 `7 s, K  s; W: \                {( r  g/ `1 U2 h5 k" s
                    if (numw[i] != 0)6 t) Z( W4 R) U# d- S5 f; X
                    {% ^' i+ r# U  s; o
                        i++;
) W7 J7 f4 K( |2 m                        k++;
; K' {0 H; V3 c3 z. ]" \& ^; r7 u                        if (k == n)( O/ s7 ~8 ]9 [$ s1 J: ]0 Y3 H4 }8 L
                        {
6 n0 ^7 b# k% d! u9 u. @/ e                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
0 O5 x2 Y' \- y9 @" z                            k = 0;1 b8 G5 Y; W# a* {& K  s3 \
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
$ S; U- _* s4 ?; S5 q                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);; ~# ^4 R9 i; N9 N5 Q8 z/ ]
                        }" O) h) z  ~3 H+ ^' ]0 A
                        else//输出暂时还没有改变数组元素的值5 J8 b6 L* Y. Z: T4 i! T
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
/ D1 n9 |$ N- d5 H" X                    }: R% j7 k5 Z" [  I1 z. G3 r
                    else
( S. T. j4 j  L: D6 m  x                        i++;//数组元素为0,直接跳过,不计数。。。; M) @. }9 ~: t, V. t
                }6 x" T1 L; v7 X4 f

2 L' h" S' S5 Q& {2 o, ^3 A. l0 Z$ l
            }//结束while循环, U% _" l9 X3 w; G7 r
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦! z8 x  g5 l& T8 R4 `
           ! V: `: @) A& v
                if (numw[i] != 0)" y: ]' p( W4 U- M# G
                    Console.WriteLine(numw[i]);: @/ O) Q# t8 D% Y3 Y( i2 _
           
) N/ h% J- k0 H+ t            Console.ReadLine();1 j  ^6 Z  U# d9 \3 \* M
        }
: g0 G, J" d; a4 o# Q    }
! v& g" I9 B# y, ^3 [}
. ~9 I6 B9 J( D: _6 @2 E* [7 C
小甲鱼最新课程 -> 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-10-12 06:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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