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

猴子问题

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

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

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

×
大家好!
, o  r2 M' c3 r8 D2 V4 F) V# [& D这几天我在忙着编一个问题,我用了一种方法编出来!
9 }) G/ Q! {7 A1 L, D" z但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!1 q& h' O" i2 w# H( j
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
; l, _: v$ e0 P+ y# c1 c3 r
) p* o0 m/ l: ^$ `5 B( v  o% t$ O# c9 @
                            题目; l% {5 T5 @+ W+ p
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
/ R) ]3 T: i5 }# H2 ?. R0 T第一种方法:利用循环链表, C4 i; z2 E4 s) j: a
#include<stdio.h>
1 I" H+ T" o" l  a( ?/ A9 A" ?9 ^#include<malloc.h>' O! ]% z9 o* V8 {/ t: _
#define M 8            //共有8只猴子. D, y- D8 }$ B
#define N 3            //数到3只时退出第三只# j* q- v; G8 |* J8 E. d
typedef struct monkey# R* r: |. q1 p: r
{int number;7 k4 l1 D, L! D: D  x
int flag;; w( w0 U. Q7 V4 |. I
struct monkey* next;
" s/ ?, H9 |" h2 m. A( W" b}MONKEY;
- `4 d" s! l8 e2 D: W# Fmain()- y% \# v3 q& r. A9 q2 K
{ MONKEY *head=NULL,*p,*s;- k7 }& e$ X! T& @" ]$ z6 s3 e
  int i,sum=0,count=0;# `6 y& U. N" m. r% N
  clrscr();              //清屏2 M- w. h0 ~% J
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
! z3 c2 Z- t- I* L  \' N  p->number=1;p->flag=1;4 S/ r: t* H: [5 J+ I
  p->next=head;6 \$ m8 p$ |1 n3 e  Q
  head=p;% E. U' @- a& }) j( o2 X/ B
  for(i=2;i<=M;i++)
6 O0 a: z) u( J    { s=(MONKEY *)malloc(sizeof(MONKEY));) D0 R2 |# N2 Y" e
     s->number=i;s->flag=1;4 [; Q, D- D! k$ X3 n
     s->next=head;
% U' L% j+ b& L7 Q     p->next=s;p=p->next;3 J1 {- D/ W) E0 O6 r5 v5 A
    }
4 @! N0 {0 h, L( e  {    p=head;
, k4 N& S9 u  W4 S; |   for(;;)
  N& ?( h- J7 Q0 [! t. P) G) w    {if(p->flag==1)/ i, K, c, j- t: Q: r
       count++;' P8 o% E* _2 ]/ n
     if(count==N), {6 G9 c3 h% `8 w
        {p->flag=0;
" L7 l# ~: X% T# i: a' J         count=0;' o; O2 a; f$ M, T
         sum++;}
- |9 l9 G8 }  `/ Q" j     if(sum==M-1)# B# |% v+ `5 O0 M
        break;
7 \- B% ^9 p. A0 Q6 N  y7 q1 q     p=p->next;
% \. `  s3 s0 N1 H: Q    }
- i; ?1 M% I4 _+ w" a9 z3 K    p=
% d, n: \- I& I; M$ }/ d. }- ?    head;% f6 Q- O) D! K" x
    for(i=1;i<=M;i++)! p" g2 s5 A) m( V. n3 s' b
    { if(p->flag==1)) ^! N0 R0 {  f
        printf("\t%d",p->number);
* {( p1 e5 h0 U7 W" h+ [# H      p=p->next;
0 I# l- g: O. ~- A    }
0 _* e1 O  _0 X  x
6 `. n8 M) Z, \+ q; G7 u# u- c- y: X, P% g* V4 \

% l. L% @4 W4 m4 B$ c2 U$ U# {}

7 {$ C& u- e6 \' \5 }第二种方法:数组
  _( d) }6 q+ \, r#include<stdio.h>7 t6 |4 C  A& m3 C, y! {" c
#define M 8
% D& K1 y$ r- ^  |' X# M7 l- F+ vstruct monkey6 p$ _" l! Y  ~6 i
{int number;" i% k9 A( {7 s0 x, Z
int nextp;% b# R. {% E8 h9 w4 d2 V# L
}link[M+1];
" ^" H4 h! l# a7 Z! l( `: _) [/ R$ U0 V4 z1 T9 ]- K( q7 w
void main()" s+ u4 M; X* a& G
{int i,count,h;( r& l' [* r2 o! Q! G* E* D
for(i=1;i<=M;i++)
, M; i+ X% \0 v7 s{  if(i==M)1 Q6 X( Y$ G4 [; c# x: q
   link.nextp=1;
3 \  S+ V$ Z4 _* ]   else# \& _) h+ P" }# r5 q, d" A# ~# E
   link.nextp=i+1;
, }# M7 d4 o3 Y+ S3 T  link.number=i;
& K; e/ o1 {  t5 V& s: ?}
4 k! N: g, M( N0 g5 B1 b( c5 eprintf("\n");
+ h3 _! `3 |$ [- q! k4 ncount=0;
8 ~$ r3 o/ m, W/ B3 n# M  k3 Qh=M;
% x( @6 a, n/ J' ]printf("依次退出的猴子: \n");
/ I. N# K( G+ \+ r/ ?+ l/ Mwhile(count<M-1)
, @6 {* y" B" g{i=0;
3 y  A/ C# F2 Z' rwhile(i!=3)! @6 J7 y+ V; D: v9 X
{ h=link[h].nextp;
7 R0 i+ \; A$ N% E" u* T) ^   if(link[h].number)
$ d7 u( a* ^, C! H     i++;}
4 ^" Q) f9 ~0 r4 W9 O6 u  ?, R1 a6 s+ O6 E/ t! ]
printf("%4d",link[h].number);
8 q- B5 s) e: ?" S4 u* hlink[h].number=0;
/ H- G4 p& |6 e! Kcount++;
+ H: q! ^+ p" Z+ ?0 N- C}
# C- p5 g$ Q6 @  m
2 \6 m" R" q7 ^4 pprintf("\n大王是:");( E: d$ J/ I# T$ j
  for(i=1;i<=M;i++)
3 C0 |+ p. {' M  if(link.number)& G+ F: w" C' I
    printf("%3d\n",link.number);9 c; w$ U' [: ]: g" I
7 [4 M1 M/ [9 l& L' ^) s: R2 p7 U
0 ?: Z: N7 C: \# X0 l$ h4 B
}

3 O! Y9 ~4 Q7 l& T# L第三种是普通方法for循环
" Z: \/ i: p) c8 e) d
#include<stdio.h>
; V  x& {% C. L2 P# W9 v8 bvoid main()# t* x; T9 b/ C2 X
{ int i,k,m,n,num[50],q,*p;
  m9 s# D0 Y! C* [3 K2 I( l3 p0 h$ B    clrscr();
6 \2 B- j) I; D  O8 a   printf("input number of person: n=");4 }$ b- O' S) h) `" ^
    scanf("%d",&n);
- e+ v, u8 y% y+ v/ c& Y  [printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只% e& x: D1 x* ?, D/ g; A
    scanf("%d",&q);
) W, K8 }9 a: Q" Z2 A0 ?& |   p=num;* p/ o8 y7 h$ `
  for(i=0;i<n;i++)* H8 i' \6 ?' n5 z
    *(p+i)=i+1;
: F; d3 G6 A+ D% Z   i=0;( ^) t: |9 X- q& J$ j* A
   k=0;: U+ p& Y$ e7 G: Z
   m=0;8 B8 d2 z* T! r# ~& T0 `" ^
  while(m<n-1)
! R( z8 |( [8 O4 w/ ~. K   {if(*(p+i)!=0) k++;
3 R2 @# e8 J9 Y; S1 a     if(k==q)
) `! R  R7 {* L# [0 s$ `# `" |, K      { *(p+i)=0;
* K* y, X2 o- x3 U2 T3 \0 g        k=0;
* t( ~/ R% ?3 ?* b$ {        m++;- R" A) T) q, |0 }; A5 G
      }) y- w* i& {4 l( R; e" a7 g, b
    i++;
" l' T& x4 r) b3 c. z- I/ q# k    if(i==n)i=0;  v) W- u! n1 I+ ^0 Y
   }
1 `5 d- @1 D6 _% v' a6 S3 E  while(*p==0)p++;
5 P9 N" _* k5 [' y    printf("The last one is NO:%d\n",*p);' u: r+ S' Q5 D* ]+ i6 R
     getch();
: ^( W8 `# k. Q& a+ o3 A
$ P% A2 P: z- P# F# d% {}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
+ o5 y' S" z4 c9 R+ mnamespace 又费马达又费电( x6 M" m6 g) V& z1 ~
{. R3 h) X( h" k+ f, N
    class Program2 l: ~8 U: p7 M/ B" p
    {
" O+ x' O  ^6 K# s/ X0 V        static void Main(string[] args)
" k# O, A  R9 F; K: M9 }9 z        {
; i7 Q  }; ?$ n1 z' c& E            int m, n;& L1 l7 o( I5 R, K- i& Z5 X" ^
            Console.WriteLine("请输入数组长度");
0 W) B2 y6 r5 w: Z$ L( p# I0 \            m = int.Parse(Console.ReadLine());//m为数组的大小
! [6 Q, \" ~3 Q3 A7 a3 a            Console.WriteLine("请输入要截取数字的大小");
7 S; Y, V  I6 T- x/ O$ U1 g* J            n = int.Parse(Console.ReadLine());
7 @% C# U- Q1 h  c- R  Q# h- ?            int [] numw=new int
3 c* B7 O+ W8 V) X  s$ ^! F1 I9 w) \1 w8 J5 ?
&shy;&shy;&shy;;
- S* E+ z- E; U* u            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数8 W& `, O* Y$ L( g* Q% c
            {- e7 V' W1 ]! p. ~
                numw[j - 1] = j;
3 }7 K# y2 t: k$ y2 q9 K6 T            }
% I. J' b6 y7 ?, o0 ]            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
- L+ V3 m# M6 |. n% ~3 M            while (d != m - 1)4 f& R" V6 `, A
            {
; C- r! \4 I* L; B9 R3 d7 S! v                if (i == m && d != m - 1)
: _) `4 a4 {1 G4 m% k: _% i                {
6 n! K+ e9 }& X2 y6 t                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!: s% }# a1 @: Y- H/ j  T
                    continue;# {. k' a7 v0 M% Y
                }
2 I+ @/ _. ~. d$ G" ?, v                else
2 F- C- Q  o6 d0 D                {" O! b6 F  q* M8 I# P2 D. b
                    if (numw[i] != 0)2 Q" j. Z5 L2 s
                    {
; x/ c7 e6 f7 Z2 \                        i++;
) H: E" [# l; H5 }                        k++;- x% z& Y5 {( J# A; X
                        if (k == n)0 S6 H- E# ]8 S/ c/ v1 V
                        {0 M! W. f) h: C" B% w
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
7 O  J+ `1 r4 |( b: h# `                            k = 0;/ t" j( D2 W# v7 f
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
; G- F4 z7 Q$ E+ a/ ^                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);0 k, H7 ?0 m+ D+ C$ K' E
                        }
- Q; F( t6 a* s& f$ P                        else//输出暂时还没有改变数组元素的值
/ l2 [+ C) _% u, |$ h) M$ \                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);  w; l8 Y% r3 Q1 e: ^! ^' r
                    }
3 C6 M: I) ]0 H5 b& J2 g                    else
' R+ ^( T3 c0 a: d. K8 a% e                        i++;//数组元素为0,直接跳过,不计数。。。9 j" ~3 q+ b. I$ G* Q5 H3 h0 S/ u6 [" b
                }
. }  z' ?  Y* G* ^2 ~ $ k) S  t4 t9 Z% l2 Z

% ]2 n+ O; O5 l% J$ m. g* t            }//结束while循环" j: `9 A$ e$ c+ |7 Z& X$ d% s
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
/ g) Y# E6 a. d. k0 ~           % E- o% o, G  _& v
                if (numw[i] != 0)! d# v1 q1 N( J- v% I% a
                    Console.WriteLine(numw[i]);2 t: }4 g1 w. @2 d0 [5 L
           . s" y# ]! _" O2 ]( L+ o- f
            Console.ReadLine();
% q$ r* w; H3 e  {) Y; H3 W        }
, F: i/ n1 H+ B# c( I    }* o9 I  B3 a- z1 j5 }% y2 P( L3 l
}9 a1 R0 ?( H) W9 _' }* t, E# b
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 1 踩 0

使用道具 举报

发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

Archiver|手机版|小黑屋|鱼C工作室 ( 粤ICP备18085999号-1 )

GMT+8, 2026-11-14 08:15

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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