鱼C论坛

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

猴子问题

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

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

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

x
大家好!
* K2 r: x- R- r  g2 d这几天我在忙着编一个问题,我用了一种方法编出来!0 S8 t# f) F4 W2 {, D0 X
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
# i' e+ |# D9 |0 r: y; v注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 % P9 D' F0 ?9 c6 I/ W- Y+ T

' k+ F( I$ J8 g8 R3 [) }, n7 H) N. c1 |( b1 e
                            题目( Y' |+ `4 Q" ]5 H7 t* ]
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。! f6 I/ F  r7 |: n0 J- V6 V( G
第一种方法:利用循环链表# B" |6 u; ^0 q
#include<stdio.h>' b5 T9 q* W  B2 G: o. G
#include<malloc.h>, ~# V/ v8 r# }9 A) p
#define M 8            //共有8只猴子
! G5 i7 v- X4 r& C8 Y6 `+ c#define N 3            //数到3只时退出第三只
) P) J4 F0 F$ |" Y+ h# g+ Mtypedef struct monkey
2 H8 J- D  V9 }( r, {5 _{int number;
5 V  S9 E- B+ ?/ B1 [/ {int flag;
9 A! F) i* j: |' M9 H. }struct monkey* next;
. |% S) J1 G5 i* S* {6 _}MONKEY;# t, R' e9 y' Y
main()
- I& e3 ]& }. r. K) p1 A) k{ MONKEY *head=NULL,*p,*s;
" s* C3 T  }. k& K' V; ^  int i,sum=0,count=0;: `5 m: k8 X7 w% e% c1 Z. ~, w
  clrscr();              //清屏  J& R: X2 r+ I( m
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
1 j. h/ X  G  b8 i) f. E  p->number=1;p->flag=1;- T! ?- R9 j  c. p7 i3 A7 |! M
  p->next=head;3 x+ H6 j. W  R# @5 C; U
  head=p;5 z! w5 Q: {; P
  for(i=2;i<=M;i++)
) g: S9 S% ~: a' y    { s=(MONKEY *)malloc(sizeof(MONKEY));
2 [  D: f% Z3 \8 g  j) L* j# S     s->number=i;s->flag=1;' z! f) e: |% o+ f9 A% i! n1 I% `, I2 ?
     s->next=head;% P( @' P, c& d, z
     p->next=s;p=p->next;
, i3 x9 W$ J* m; N( s+ a    }: J) l2 \3 R7 a$ M) e; d
    p=head;
: z6 [1 `. k) }" l2 h   for(;;)/ L6 e& ?1 \# a
    {if(p->flag==1)% n7 e% _" z1 ~% D
       count++;
! S; E4 W; _; M: Y     if(count==N)9 R- K; r, p4 ^5 K) L& ?4 Z
        {p->flag=0;
6 ^" I* G' ]. n$ P/ k2 p         count=0;
! B( \9 |9 k1 q4 a) w# a9 ^         sum++;}
! R, x' S+ |' @# ^7 b1 U: W/ ?     if(sum==M-1)2 ~1 X9 ^/ D7 D+ H6 v
        break;
; X! k2 X. E1 ^( @! Q- j     p=p->next;0 g, \# o- J& F) i
    }
) l! `" j% A6 ~' f0 C    p=
6 H- W/ A2 l5 G6 D0 D    head;2 Y6 C9 O* r2 Y+ b! s
    for(i=1;i<=M;i++)  P* R: V3 w3 {. J2 [3 C
    { if(p->flag==1)
( w+ K( r% m# A' r( p1 v        printf("\t%d",p->number);
5 h# H/ g  j2 s8 F- _      p=p->next;
% J& ^4 }3 O! u    }
- B/ `/ S3 T* f, x0 v% S; X8 J4 l6 L- }' i5 u1 n( C

- y9 x  N& c* i0 Z  ^7 v0 B, t5 I6 w' x) X6 ~5 G9 W3 U
}
  F0 P  C" O6 U2 a; r
第二种方法:数组
5 P5 X1 L" g& e, @#include<stdio.h>
* |9 V# E- Z+ Q& |& b#define M 8
) `8 d& |; t3 X2 R6 s4 Gstruct monkey
5 l6 \: A0 c2 O{int number;
( ^- R: s* L: x# o8 ?2 Aint nextp;# w9 I' g% F; a& o1 f
}link[M+1];( P  _4 f/ x* t& I
5 V8 ~. K' w' i) l( Y
void main()7 j" g/ T8 k! z7 K9 r0 x
{int i,count,h;- R% n+ l' j. H" [3 B, J
for(i=1;i<=M;i++)
6 C0 ~( s( u8 g1 s. ~3 B{  if(i==M)
) f9 S8 L: e4 M8 b5 n2 s   link[i].nextp=1;7 ]; l+ b9 m  x5 _( }. R8 j
   else
6 {. [& y3 O0 ~6 M   link[i].nextp=i+1;# E  d7 T5 D8 C3 F
  link[i].number=i;
$ D; C  [' r, }1 K  ~* N}9 @* ^' _+ {  H1 q- h6 b
printf("\n");
) \. }( P4 F' V( Y% ncount=0;; T5 \. n# d7 A4 m( B" F
h=M;
5 ]1 ^. `! ~- ?0 u  e& S: Hprintf("依次退出的猴子: \n");
" W1 h4 l' n) K# O. kwhile(count<M-1): a$ I6 I$ t4 G
{i=0;% ]. P, v1 l6 z" I+ w
while(i!=3)
0 {& ?- `: t- _" J{ h=link[h].nextp;9 i  K& u( n4 |: l6 v5 i
   if(link[h].number)
+ Q* q* v& B1 w2 F/ J" s     i++;}+ B5 F: x* N. ~. m% e. b
4 U' O/ x! X) h
printf("%4d",link[h].number);0 m# f2 A4 Y8 F& v
link[h].number=0;$ p6 q( K& `% V: V# k; p2 Q+ ~
count++;
* C9 Z1 H" T% T}
9 n% _' Q: |2 ~) V% e6 l1 |# g6 J# N( T
printf("\n大王是:");
. N0 C2 U8 N" \7 S" E" K  for(i=1;i<=M;i++)4 c# i" m5 X0 O: b6 K/ R4 S
  if(link[i].number), w/ U# X0 ~' K% U) [
    printf("%3d\n",link[i].number);
) [. f0 S  z3 C2 {' U8 a- J+ h# x# U4 Q% a) I4 ?
) K) z! U& X# F* q
}

' T- g# e, E+ n& o6 o第三种是普通方法for循环

) {3 D7 x7 s  F& U* C#include<stdio.h>
, h( I+ _' ?# r2 ~! Jvoid main()! T( N, x8 `5 p  Z7 Y
{ int i,k,m,n,num[50],q,*p;+ r- q+ o5 Q) J" k( n- E
    clrscr();0 Q6 q# J$ a; l+ ~. R, C/ Y
   printf("input number of person: n=");3 k$ ]; k5 g; l2 J
    scanf("%d",&n);2 B$ ]5 V+ r5 x! L2 N# t) u
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只( A7 x8 |6 w& Y! ]1 w: S1 t
    scanf("%d",&q);- H9 ]' V, j; C7 J$ j
   p=num;; }, K% \7 a' P# O5 T
  for(i=0;i<n;i++)5 o9 L7 }$ J$ W  S; f$ A! n, w' W
    *(p+i)=i+1;
6 s( j5 ~" `" ?& d8 M, N  l   i=0;
4 M( r% T! g8 V  G* y   k=0;
/ F0 n2 F( a. B   m=0;
* p% H0 `  n7 X" t8 N. a* [* u  while(m<n-1)
$ X6 \8 T6 b8 `# b. H/ ^/ A/ F   {if(*(p+i)!=0) k++;
# Z7 e2 s' c% X6 U7 O5 S. h4 Q     if(k==q)
& i2 C, e. o6 |6 ?      { *(p+i)=0;
- v- n/ a+ B1 f3 i, o7 \        k=0;6 H. d+ z0 M) i4 t2 ]* l* X
        m++;4 }  a& E; d9 ]' V  F
      }
. x$ o+ O' ^6 m* U! e6 d6 d) O) ?    i++;4 Q$ {. W# G- n3 K9 l
    if(i==n)i=0;
* D7 ^% s' ]5 _) B5 v   }
' ]! d; p% a& i1 n  while(*p==0)p++;
% }$ }: t7 i. J$ R; W  V$ [    printf("The last one is NO:%d\n",*p);& Y' Z8 H. q- A
     getch();
/ x# H- u  R* j0 q
' s- o6 S. p! b3 Q}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
$ j" }; n. R0 b) M/ K% snamespace 又费马达又费电
# H9 W8 m$ C; e- B  [. P1 B7 X{: s: ]# n# q5 |8 y& H. b9 q
    class Program+ B  b! t4 n6 N: v# ~) C
    {
4 k% W6 M4 B9 T$ \" b( D( a        static void Main(string[] args)
2 i. {8 c8 S7 G! P( S* x5 G) S) h/ o        {0 p: N6 Q& j. `7 F8 u# y/ X
            int m, n;
3 i* g8 [  ~) K' @6 _            Console.WriteLine("请输入数组长度");$ U" x8 D8 x- g3 }
            m = int.Parse(Console.ReadLine());//m为数组的大小
! T. \6 S1 f; C4 o" j$ H5 H            Console.WriteLine("请输入要截取数字的大小");1 q$ O5 j# {1 {' |9 ]3 V4 k
            n = int.Parse(Console.ReadLine());
0 }) j' M& u/ V6 |7 z  ~            int [] numw=new int) i( |: l! a( M0 O& r  l

$ j# [5 C0 V/ G3 Q5 a4 {( ^&shy;&shy;&shy;;
3 W+ |  \4 v, r* L3 b            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
7 e% F, b2 o' Z! G2 L' I: z            {* x9 R; t/ F3 b
                numw[j - 1] = j;- r# D* p' V5 O" Z
            }- b7 ^8 F) g( E% O1 r8 c
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
/ A7 V1 v$ h5 G5 M* V- ^9 ?) `6 Z( q9 ]            while (d != m - 1)
1 |$ C) F  H  i5 Z            {
# N6 C; K* [7 V- M( Q7 N                if (i == m && d != m - 1)
8 K4 |) C1 z+ e( a' [0 d                {$ K+ E: O" H( v4 w0 Q4 C
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!% \$ U& p  n: n$ [3 [& r9 c
                    continue;
$ Y# x" e" ]- h; N) |9 y5 P                }
, M. R. z2 D$ v% P% |* y: E$ \                else, b! L2 D8 A1 `8 h* V; n
                {
9 E& r1 H( ], U/ F                    if (numw[i] != 0)/ T. M/ e+ X6 }3 i: F% I' V
                    {# O! r  \0 @# g2 Q8 v
                        i++;, x$ M8 [; Q( g+ \4 x
                        k++;
! \3 p4 Z. J$ O. X                        if (k == n)1 M' x- `9 o5 D* m8 F3 r! }
                        {
' ?$ O) y1 k1 ^/ \- H# Y                            numw[i - 1] = 0;//把在n位置数组元素的值改变了, _. q: w. b$ }) Q; o( i# ]
                            k = 0;
6 u! F" ?+ g# b$ H5 ^' o              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
, R' W. }3 b7 Z+ J1 W& T" q- h- m                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
' `' U8 |- k5 G8 S3 r: m2 u+ f                        }
' P% q4 k5 m1 f% o) n% J( V- u6 p9 U                        else//输出暂时还没有改变数组元素的值
% S3 o/ R% o" I                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
, l% E3 b! `. e; a/ X# [/ H' t                    }
. I% }9 C: v% j# r! Z                    else  f' G9 C. w) w( N; K  y7 c
                        i++;//数组元素为0,直接跳过,不计数。。。6 N- C1 p4 R" W' E. e: |& j
                }" R  C2 i  [1 m7 Q+ F& D- T# H! f' j

- o: k5 B& n; ?/ j* }. T" s# a. B! _* v4 \/ y2 \' @1 z. Y  V
            }//结束while循环: d) T* M8 Z' Y- V" K
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦) @; k6 H+ w" }5 C4 I) E
           
/ h/ y; ~2 k3 L  P5 i                if (numw[i] != 0)/ Q) B' E2 v, d% a8 X
                    Console.WriteLine(numw[i]);
8 s" |8 L( k) x  Y% u: `# y           
* e  }( K* S  @, a8 F3 _            Console.ReadLine();. U7 ~: L  V  W+ ~
        }
) v# g. Z4 c% s! @3 Y% h6 [    }
( }6 R& E. ^- M% A}2 Z* A: j* c9 ?/ p9 n5 f
小甲鱼最新课程 -> 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-18 18:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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