鱼C论坛

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

猴子问题

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

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

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

x
大家好!
2 S- Q. I6 ~6 d, E这几天我在忙着编一个问题,我用了一种方法编出来!
. `9 c" R; ]) C$ E* z) S但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
$ h4 X: [; z( F8 Z( q3 G& X, G) Z' X注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 " B# G# w: m8 c4 b$ X* G/ K
( ]6 Y/ K9 F; o$ E0 o7 [5 @2 S

( B6 r! ?7 l% G# I6 I
                            题目' C% @; u, }& |2 m& f5 T  y+ m
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。0 R, n- |9 ~9 ^7 a& a
第一种方法:利用循环链表; g2 E& v, A. m9 D$ `( Y  o& r% M
#include<stdio.h>. H2 t. ^7 o. e9 Y: x5 x
#include<malloc.h>( j8 P0 |; T# x! }
#define M 8            //共有8只猴子
8 d% N* e, I4 i; I  {: K0 p; B! C#define N 3            //数到3只时退出第三只3 a% w; Q. O/ o& w* e
typedef struct monkey
% [) ?; Q/ O0 Y/ s5 t6 q{int number;! _$ A# ^4 h5 G, |/ `. O5 a" L* Z' ?
int flag;
. s! G* ]6 ~" cstruct monkey* next;+ Y# U! t+ z& D5 n# g# r. @
}MONKEY;# `7 j8 ?& H6 w0 u, V6 V
main()
$ A* B* G3 I- n{ MONKEY *head=NULL,*p,*s;. ~! m' N5 \/ d, C9 {4 R) i
  int i,sum=0,count=0;
* T( _4 v+ P$ l5 u4 N  clrscr();              //清屏, p. x$ |" j! l& k9 R
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存& ~) g9 U- b4 T
  p->number=1;p->flag=1;& s) X) R3 P. D8 z; N# c; y! X
  p->next=head;
8 ?! A$ u$ X8 Z0 I8 C  head=p;
* [7 \3 z( ^$ ?8 e+ F! f  for(i=2;i<=M;i++)
2 O2 V5 z$ J2 \  c7 p7 F9 n+ u$ z    { s=(MONKEY *)malloc(sizeof(MONKEY));
. D, @+ f7 s2 P5 I1 ~7 D     s->number=i;s->flag=1;
& q) `0 B* ], @* G1 X3 e' \     s->next=head;. M7 T  y% W2 C
     p->next=s;p=p->next;
- m" R- a7 T# ^2 b: u. e+ b    }3 h6 F$ w; t: h& E( w
    p=head;
4 G* {7 C- W+ w& F; f7 M& w; o   for(;;)
2 {: M9 {# |. U. d7 w& J4 \% r& \7 A    {if(p->flag==1)  j0 g' }+ [0 [3 N  q* l) H
       count++;
% d- V  M1 n, `; G9 S     if(count==N), V% |2 |  ^+ v9 t$ A( m+ }. E2 x
        {p->flag=0;
5 ]1 w/ q2 w3 q* v6 o0 J2 I         count=0;
3 U! q9 d& z' T% B' _8 h+ q         sum++;}( I. O! M; D0 ~8 _& }+ u
     if(sum==M-1)
# F5 `/ K$ R* z4 J0 v8 x        break;
  [+ |! C" Q# v0 n     p=p->next;
6 Q" C! W& @$ Z& H6 R    }7 t* D: R! ?+ K. E" _
    p=
! c: \& B$ U, w  H5 x    head;
4 Q" c! k* w# V. q9 v5 t    for(i=1;i<=M;i++)
; e0 T# t3 n* a  _7 x    { if(p->flag==1)
+ V2 ?+ M0 J7 p# E, f' i        printf("\t%d",p->number);
! s- t* y# w  O# t" o  o8 c      p=p->next;3 w9 K6 E. x# x) s
    }
7 Q3 @4 a  k# `4 z3 B  x) |/ B1 }' W, Y$ g. {+ q
3 T& ^- M- O! C6 W5 V

8 I& K- t+ C0 n}

: l# r9 k% D% I- v2 f第二种方法:数组  G7 z" j' U8 x% \; m5 }: E
#include<stdio.h>
* S' C3 @# `  y1 V2 l#define M 8# U; M! ~+ I# d1 w; J: H
struct monkey# C0 c* f. p9 o
{int number;7 \8 @4 e/ K2 Z- \0 Y$ [- I
int nextp;
0 ]4 L! h5 O/ M/ j}link[M+1];7 `" M% s4 w' ^0 z. E% v

" a) c( u/ e4 r8 s$ R- e" d5 jvoid main()
- |1 ^- g& P$ p7 B. h- d9 f! ~6 i{int i,count,h;
- Y( R; ?9 g% ?) q) J& ~for(i=1;i<=M;i++)
% v* r+ c) |0 n( R9 Q) k{  if(i==M)
  E2 S+ }) _+ @- b& C" `5 a: p   link[i].nextp=1;
( y7 ?1 V. E8 ^) a% r   else
+ m- a! E+ z3 j( l8 ~6 {+ o' ~) {/ |   link[i].nextp=i+1;* e6 E6 g* R: e5 J% D- j. z8 L
  link[i].number=i;
: V! W) c5 o8 _% A( v: s8 \}
8 J1 _9 g# m6 O1 \printf("\n");2 ^% K0 e- L* j3 n+ w
count=0;
# F2 L1 F& b" r- M+ |& Kh=M;* K& o7 g' \6 n% A: H9 t3 j3 j7 w
printf("依次退出的猴子: \n");( I! S2 |. n, t& G9 X
while(count<M-1)& U& l& ^; L# |
{i=0;
- b+ K& f1 b3 v, Y2 N/ x& J+ Y7 q' Ewhile(i!=3)
: \0 n, I; p4 i. b{ h=link[h].nextp;
. e7 \  v$ L; v) [8 [   if(link[h].number)
9 H& G8 I3 f- S: V8 i5 `% [# u5 Z     i++;}
  c/ K: s. _) |5 H* b6 a9 E0 t' I+ ]4 {: p5 ^. c1 L9 C& w6 T5 a
printf("%4d",link[h].number);
- m% k3 x. L1 p# x0 ~$ nlink[h].number=0;
! A1 e: N1 y* X5 kcount++;
1 ~+ |) Y. m& _) O! U# q}6 v* u  \9 b/ v

3 Z' W% p- b' @2 I! c# S  Gprintf("\n大王是:");) n3 D7 z1 g7 ]! C6 V  U
  for(i=1;i<=M;i++)2 F/ g  C. ~# A3 w" N$ v
  if(link[i].number)
: L+ u% O% r7 i/ Z. x9 e  q5 ^$ b    printf("%3d\n",link[i].number);
) o* V! }% _5 a8 A6 m& b$ _* b% l
7 m/ ^  u# P, F0 l! E1 y1 b8 v# R1 m- R& D6 w1 n) R
}
: M4 `% a! i' y% f  }9 Z/ ?
第三种是普通方法for循环

) u9 H2 k9 y1 t! F" P, h- y% q#include<stdio.h># D& b& h5 p+ {, U/ v0 I2 c
void main()
8 b* c0 ^/ r. P3 i{ int i,k,m,n,num[50],q,*p;
$ \; q2 B2 U4 G; x0 F' E: U    clrscr();
# L; ?% D! q6 ?+ ^0 o% h   printf("input number of person: n=");  [  F# \: B& d6 a6 ~. X. t
    scanf("%d",&n);. O# ?* e; x1 }. e; ]
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
7 X/ C9 X4 {1 f    scanf("%d",&q);8 J; w: _+ v! P6 b+ n; K
   p=num;$ `! U+ N' p& d2 l
  for(i=0;i<n;i++)
2 E2 y* V- v3 E7 T8 {+ W    *(p+i)=i+1;
* U  c+ A. e" b2 ^, {" V' @   i=0;; s; C6 C8 {% L# _  W
   k=0;9 C; R+ J* p, i( w" M, J
   m=0;
9 `* h1 b) n7 r' W7 p: d+ G  while(m<n-1)+ T( I! P- A/ @2 H, P8 e
   {if(*(p+i)!=0) k++;
6 D) i. g; D: M3 n     if(k==q)4 u- V4 A) S/ I  C2 m5 u
      { *(p+i)=0;3 H, p( x5 X( \+ Q' w, O& p0 L
        k=0;4 d/ d1 w  Q/ |% C
        m++;
7 n( l- Y, e5 [* `      }
5 I: n% ^2 n( Y" w0 _    i++;
2 J& U: s4 b1 l+ A    if(i==n)i=0;
+ Q  {$ A' g) U+ P% ~5 q# O! D   }% ^3 U8 x& L' k- O6 h0 T
  while(*p==0)p++;1 T$ X* u9 ~! R' Q. D+ f, K- H
    printf("The last one is NO:%d\n",*p);: H) d' u$ D7 q7 f
     getch();, M( S$ H7 p/ N+ L( k# i

! R+ v- {8 p9 Z5 F2 C}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;" K" V8 E3 j% X; M! Z5 f# x( O2 e+ Q$ N
namespace 又费马达又费电
. D- ^) e: J. P- w3 T0 C( ]4 M: C; ]2 @{2 b" b6 Y1 i$ h# `
    class Program
+ A/ ^  T0 G) d% d: m    {
5 ]/ M; Q3 o2 B0 H* ^8 a0 X( H: }        static void Main(string[] args)
+ G( q# u; s+ n* t! S! l  G        {' L" C" B" }+ [+ {1 h; b0 _$ j6 a
            int m, n;' [: r4 d$ R! `8 F
            Console.WriteLine("请输入数组长度");
# d4 v+ ~5 H  s9 h( @* V# P# x7 _            m = int.Parse(Console.ReadLine());//m为数组的大小2 y! J0 p! n2 U! t( F5 P5 P+ O
            Console.WriteLine("请输入要截取数字的大小");# c9 d9 F# Y1 k
            n = int.Parse(Console.ReadLine());1 A5 ~3 E8 l0 e1 U7 u
            int [] numw=new int
, D+ @0 n9 M  n2 M9 J
/ w9 z9 A1 m( v0 ^  C&shy;&shy;&shy;;& |+ \! G, c6 j) v
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数( O( F! X) o5 O- v/ J+ ^
            {. Y, X# `/ D$ {4 f( D7 l
                numw[j - 1] = j;
. B/ b; G6 h! C  G: {7 F2 }; b' C            }
2 S- W) H5 _! P/ i  ]6 p            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
8 c! Y" c. E0 R: \5 D: |( v. C            while (d != m - 1)
) d2 g7 W7 e0 C/ {  ?5 ]6 g            {4 a9 i8 T+ G6 }& j- ^+ n2 a# d! z
                if (i == m && d != m - 1)
  \4 ^$ c  L  t  q                {/ t+ H; D& c3 @9 I& k5 }6 a
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!" T9 y4 ^6 s9 m1 u+ \' r$ l& v1 ]6 a
                    continue;' N5 d" p1 w& S9 |$ G) `7 c
                }/ g2 |0 ^  E+ N2 O, K( d
                else
: P2 {$ `) m. @                {/ P! Z1 a# ^: c5 P
                    if (numw[i] != 0)$ H/ ?$ _' H( D
                    {
8 L: j/ j. P$ J                        i++;. Z8 V; J, v0 S$ S8 T' t5 B
                        k++;  D6 G0 T$ |4 ?( o6 W
                        if (k == n)
5 J) M( @7 _& M3 }                        {0 c5 U  v& i( Y! X+ o" P3 l0 P
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
- A+ U5 l( P+ |# w; z1 m                            k = 0;
3 t: x& A+ a8 c, c" F: i+ ~+ ]              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
# V/ D  V( Z3 h2 g( f1 d                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);( r( i8 [1 ]" Q/ e9 r$ c
                        }' F  M  R7 O( y! @6 X' ]- D
                        else//输出暂时还没有改变数组元素的值
+ E0 q0 k" P" Z) H8 n. h- m                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
+ y: ~7 m- }% I                    }
& [' Z$ g2 r7 x- [% e                    else
/ f$ a; k4 Q! ]                        i++;//数组元素为0,直接跳过,不计数。。。
; j  E0 m) q3 \                }
5 K" A( B+ c3 [4 Y! U
" z8 @# ^# B5 @) \; b2 `4 {/ t! B! J# r, Z6 o: D7 G2 ]
            }//结束while循环% q) u( y2 s: l; T
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦, l* T4 Y. j5 N) r# }# T
           / x9 |, Z# N" {% U
                if (numw[i] != 0)8 l; }: z& n! i' C! g6 J0 r& z; ?# j
                    Console.WriteLine(numw[i]);8 x6 H3 d3 g% v, }& Z  n  h
           ! W2 k, {. O' U. W5 v
            Console.ReadLine();
/ B, J8 y8 W2 M, O5 b        }8 y! a  ?7 D7 |0 u. `
    }
# M* f9 _% n# L  d- ~}6 @& e( z+ r; Y
小甲鱼最新课程 -> 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-10 12:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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