鱼C论坛

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

猴子问题

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

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

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

x
大家好!
- ]% f8 k: ~0 c0 \  _+ N这几天我在忙着编一个问题,我用了一种方法编出来!
) ?3 n' U, D! y5 ]8 P但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
! E- w" c9 Z6 D) N5 J- E注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
( e" A; ?; S" ?) ]* Q
$ k. e0 G- ]3 B8 |9 M) }# }8 h- j, }0 L5 M% A& Y/ _
                            题目
$ y9 f# D4 w5 k山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
1 _2 n7 f1 D' X0 e+ [' c  P第一种方法:利用循环链表! @/ K  O* P( [" t; e# s
#include<stdio.h>
* j" ]; ^( m! r( q$ S#include<malloc.h>
3 T9 Z6 ]' {: G. M7 h: S" H' h: S#define M 8            //共有8只猴子2 x( E' `' ^! @$ [
#define N 3            //数到3只时退出第三只
0 @- H% X9 @) H6 c( W' Vtypedef struct monkey
& S0 e6 d3 x, U, m7 t- S0 I8 T{int number;# z& m5 c( U1 p+ h- e
int flag;
" `1 l1 w; s8 Y) p( B5 Q8 _struct monkey* next;
) \, _2 H# B# U7 n" y' I0 g+ @}MONKEY;  T1 x$ ~, R) F
main()
' X# g+ m: h) A4 p# A8 U; _9 \{ MONKEY *head=NULL,*p,*s;
& p1 F" Q6 I, Q6 ]" |  int i,sum=0,count=0;' |; x; C$ Z; F% J. t
  clrscr();              //清屏+ A! g3 V0 b% E& Q
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
' D/ M. w' a7 F1 \+ w0 `  p->number=1;p->flag=1;+ L' u# n6 x9 u) B( e% r
  p->next=head;
. C2 f8 j* Q1 E. i: {+ U, a" Z  head=p;
1 v! l3 R. C6 O  for(i=2;i<=M;i++)' D2 v+ `9 k+ }3 M6 ]* ^) R* }
    { s=(MONKEY *)malloc(sizeof(MONKEY));
- E! y* ~8 w# Q6 k& `% J     s->number=i;s->flag=1;0 n! m+ m+ h$ F$ F1 J1 T; `
     s->next=head;
) A9 L" P: _3 r/ g$ f. N  T3 D     p->next=s;p=p->next;# q5 ~- T5 e' ]2 l; ^, ^
    }- h  s- R0 x7 T  V+ T" A
    p=head;3 L% z7 w  [" v9 u# }( r  e' X
   for(;;): u9 m: U# E3 {' a" M, `1 M/ B  ]
    {if(p->flag==1)/ {& k! ~5 ]# @
       count++;, V* v$ g. l: U
     if(count==N)
+ N+ w& q% x$ \8 n& p6 l        {p->flag=0;
  D2 _& V# K( _         count=0;
& P, s8 x. O8 G         sum++;}
: o9 M5 v- e0 X2 {     if(sum==M-1); H! s' Q; J2 y8 w$ Y- k
        break;! T' O1 f8 K' N
     p=p->next;! E. U" W3 t0 c* i  |$ P
    }
, w9 _& c% N3 I- p+ x3 r    p=
' F& v# K6 b9 C9 Y- I    head;
+ v/ `! x' U3 B    for(i=1;i<=M;i++)" i! e6 p7 H/ x$ P
    { if(p->flag==1)7 \0 ~8 w. j3 T: u6 r
        printf("\t%d",p->number);
, E* d# b4 A% R; }      p=p->next;
0 l' V0 M: e' \    }
) c. `% I: X5 J; R! |# T* D) p
6 I1 U* C8 |" g0 L
) `; r2 F8 Y5 c' d7 q( O1 F% y; ^- q6 |
}
) J2 Y! `* }- a, h/ t
第二种方法:数组
" g0 ?0 W4 Y4 w#include<stdio.h>
$ P$ T8 w5 X1 Y7 y% |#define M 86 e! r+ w0 |. T' L; C: Z
struct monkey( g; c) q1 m- v! m3 ^
{int number;
7 ?% ^1 r0 ]! |. e9 b- b1 Pint nextp;) _1 a, n3 M  n1 q% f
}link[M+1];9 S9 ^# }% ~( I) H

/ _7 T3 A- S9 [2 h' ~; e5 e# f( Dvoid main()
0 v# K2 B) R9 j; a) W( p% u, q{int i,count,h;9 Z. f5 t6 W9 ^7 h3 \- Y! W
for(i=1;i<=M;i++)
7 Z7 I# A( G( E. ~{  if(i==M)7 j9 n2 \4 e( V
   link[i].nextp=1;
! P! y, R( L- S5 e: o) N   else
/ V0 h/ d3 s+ R6 \* r" c, V   link[i].nextp=i+1;
! J/ }. i/ p- I  link[i].number=i;
+ D( B- @1 [& F}0 Q: O! k: C" h) N' G
printf("\n");
# z8 D* R: n! R4 W7 N5 T- xcount=0;
# g+ B2 T( y7 [' Lh=M;
- c$ ?& u# P# K0 y3 c2 zprintf("依次退出的猴子: \n");
) F$ J5 D& u3 O) U' W/ ~while(count<M-1)" Q/ s1 ^' e# J+ i' j( b
{i=0;
0 Q3 x% W: h; G7 n+ t8 }1 \2 @, }while(i!=3)' A8 _& R3 V8 R
{ h=link[h].nextp;
6 g$ b& F% o- k- z7 [2 p# l   if(link[h].number)
% X1 d9 p- C, l$ i- o* N) W     i++;}
( M5 W5 \# E; U/ |2 B/ p3 _& `- N* {
printf("%4d",link[h].number);. ^4 f! x6 h5 d8 _+ `  }
link[h].number=0;
" m2 h; h7 ]8 v& {) ocount++;
5 W& F2 s% E$ L, Y. c& @- a; G' _}' f) o$ @# k) a# S( E4 s. a

2 {7 s0 e+ h7 d6 }8 _* h, a2 gprintf("\n大王是:");. t0 a4 x/ t: l; N2 F3 n
  for(i=1;i<=M;i++)
2 O# h8 v$ E2 L! O  if(link[i].number)
7 X9 w" ]: N  W1 d3 K0 T  S3 W+ y( U    printf("%3d\n",link[i].number);/ B! F9 o: I8 R+ G$ L# F3 l

1 ], s& w- c! ~, L) A5 d! ~; P- _. c4 f
}
; O# p8 ^$ Y7 h: Y
第三种是普通方法for循环
0 ~( }" J, [; |' Y8 {
#include<stdio.h>
( f4 e; F& p* R% o' y7 E. qvoid main()
9 `' g$ S) {2 z" d{ int i,k,m,n,num[50],q,*p;  E2 a" o6 W) g$ @
    clrscr();
7 Y, W4 G" G/ e, h) C5 `   printf("input number of person: n=");5 `. C& Z. O. m
    scanf("%d",&n);
4 V7 _6 X- p% I9 c1 e8 Q2 Sprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
4 L) E! D! g0 F! g8 r    scanf("%d",&q);0 p$ R6 M2 A, H( T
   p=num;
0 p6 H% W, M2 t0 ~5 @1 Q  for(i=0;i<n;i++)
/ t7 y2 l& A) l9 T    *(p+i)=i+1;
1 i. v. k+ c: S  c! R3 R4 M% o% {   i=0;) L4 ]$ d( |/ I: q- r) E) K6 Y
   k=0;
/ T. O7 p6 t0 K: [1 a- ~7 `   m=0;- n; K" k. `4 w: R+ m
  while(m<n-1)$ O/ c; s9 b' V( `! `# L
   {if(*(p+i)!=0) k++;
9 r/ o( ~! ~( u. R     if(k==q)- u# D4 ~& ~3 s' ^
      { *(p+i)=0;
; y- Z) ]: X! |9 j$ K        k=0;
" b+ |$ N2 H4 [* K        m++;$ x- W2 |6 N% I( i$ |1 W% u& S
      }
/ ^' e5 A: A# Y$ E7 X    i++;4 \  s! O+ d" X4 y# w6 A1 K  b! c
    if(i==n)i=0;
$ v% U5 }/ @# l* A9 S0 f* l   }4 ^) s8 O; F) Y; c7 x" ?$ V% F
  while(*p==0)p++;3 K$ \! F; d! |- X9 d6 i: S
    printf("The last one is NO:%d\n",*p);
' m' ]6 @$ B1 T: x8 L9 L6 w     getch();9 W# z" q0 R. P  n
" w. E! ]4 j, w! l% w* z/ L
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;. H7 \, _; h6 M  L; h. _
namespace 又费马达又费电
) j8 l5 \& J; z{6 B2 z/ D. w$ q: b; q5 P
    class Program
2 e/ H" e7 \# }" O& P( o: t% k    {
8 O0 x+ f  M2 t7 P* p5 h5 r& H        static void Main(string[] args): u; i) m: h+ J1 J
        {
: H" `8 y  n1 J( Q& u5 t# z9 ~9 e            int m, n;! o  a! n3 E: M$ ]3 g
            Console.WriteLine("请输入数组长度");9 H3 ~. ?, a/ v
            m = int.Parse(Console.ReadLine());//m为数组的大小7 {/ ~0 L; u+ \1 H5 D
            Console.WriteLine("请输入要截取数字的大小");
7 Q% s% C0 B$ F1 [" x            n = int.Parse(Console.ReadLine());: D6 ]- U8 V8 W% d! F+ F, ?
            int [] numw=new int
5 b" M- _7 R: F1 i6 a4 Y' i
; z" g# m( b6 |* x4 d: K&shy;&shy;&shy;;0 t1 {" x6 s/ ?* K- d4 `
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数7 s. j4 I; y" f( V" t
            {  n. s5 ^( I! |
                numw[j - 1] = j;6 [; a4 {' f) a. Y
            }" I2 a5 _& I( G$ P' _5 d  a
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
1 G  o! P, X- ?6 t* N" |            while (d != m - 1)
6 [7 b2 C0 G$ z5 Z0 T            {
" r! A1 x" M  f# \7 B                if (i == m && d != m - 1)" g9 v! @: L+ r
                {) E; p+ t+ y5 H) A9 |$ Y
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!& }3 I( n0 d# [/ R9 Y& I0 w
                    continue;, f4 \1 h) S$ p. R9 ^
                }. |. `( W6 H3 `3 E/ z% K# L
                else7 s8 D0 l, v% N9 p
                {9 ?, }' X- C. a: v
                    if (numw[i] != 0)
6 j2 D: }2 n4 p. }" g                    {
0 a% ~+ t+ E# p2 B                        i++;* f+ u# t& S. E3 }. L9 l; m! d, v7 X
                        k++;: f% U6 r5 U/ |# S# ~
                        if (k == n)
0 Q, ~# e1 y$ c8 [2 ]                        {
4 A  g$ ^" t; u/ E. r( Z# A                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
/ t- ]2 x6 c2 y: }7 _6 h* I+ R/ O0 [7 a                            k = 0;  Z3 r! S- d7 e* }0 H
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小12 ^, s$ ~1 g  ^. {
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
8 \, A7 f- l3 x: d# p0 i                        }3 t, k1 L; ]  ^8 m. u
                        else//输出暂时还没有改变数组元素的值
9 T8 ^+ @  w* z! C& f7 U$ Y: ?                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
' P1 g9 K# m+ r6 D                    }
( a: ^7 }$ G* {: J0 X                    else4 M' n8 O4 `' o
                        i++;//数组元素为0,直接跳过,不计数。。。
) I4 f, h4 G7 ~* _8 m1 N# N  L( `                }5 c9 G/ @; |6 H9 i! o1 [5 t* \
) D$ l( E' v1 h$ I
6 ?. t8 K! C) @
            }//结束while循环( Z% b9 k, ~6 a' P! A, ]1 ?" Y
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦; N; O2 x3 @2 v) {% _
           , I: a* N+ s# M
                if (numw[i] != 0)- {- r8 m2 g6 S& y6 S
                    Console.WriteLine(numw[i]);2 U2 _; V: Z7 x! u
           
5 e1 H% ^# k( p3 q% f1 o            Console.ReadLine();3 V: l5 L* f4 R! i
        }/ ?& |( f# G- N" s3 c) i
    }
+ m) [# B1 a5 _}
# G* }! B$ M3 p* H, p* }" 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, 2025-11-10 08:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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