鱼C论坛

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

猴子问题

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

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

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

x
大家好!. p  [4 y; u. m
这几天我在忙着编一个问题,我用了一种方法编出来!- ~. z: r6 e% K
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!5 i# d4 T% l" e. ?% l
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ( o$ h! `' E$ x; H9 z0 I
" r# v0 q& W: `$ F5 k& j
' y+ f- L1 W8 T: L$ v1 e- }
                            题目
# r8 c6 y, [. _$ }) m! K# r: o3 x山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。' }+ w, O9 r  \  G' H1 j! S  i* B4 K
第一种方法:利用循环链表+ |; {2 e3 ?( U3 M8 K. \  G
#include<stdio.h>
+ i6 ]' P$ e# p: u+ h5 {#include<malloc.h>
0 s) p5 n2 M4 w' ^#define M 8            //共有8只猴子0 a' e8 @  s" M6 k6 I
#define N 3            //数到3只时退出第三只
4 r* D& F% [/ ?typedef struct monkey- W2 {. N: L8 g4 x
{int number;1 y  \1 z/ ?  B+ `# ^
int flag;) t) f& _* B. A& u* |9 d
struct monkey* next;
2 I* t+ B/ G; @  X: Y}MONKEY;
' P: i$ T6 Y0 J* S; D$ emain()
' n: m" N9 l, g5 m: _{ MONKEY *head=NULL,*p,*s;
- X* p0 y% X9 u! J8 I  int i,sum=0,count=0;
  U) l8 H1 O# K1 _6 v! G, B4 a  clrscr();              //清屏! u% _5 c9 l* `$ B4 T
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
0 X: x4 s5 _7 e/ c+ r  p->number=1;p->flag=1;
& h. g4 S6 b" r" E2 b  p->next=head;
5 t3 X0 d, K6 U7 N) |  head=p;, U- M+ N) O  L9 r) H
  for(i=2;i<=M;i++)3 r& B2 l, z. \% W8 d& w3 [) r( ~
    { s=(MONKEY *)malloc(sizeof(MONKEY));# \$ l, H/ M/ ^# S+ ^' @3 M
     s->number=i;s->flag=1;
7 y8 H. b3 q  [: P5 i; \, D! f     s->next=head;
) @5 N. g5 `% V2 R     p->next=s;p=p->next;* `3 r0 m) X! ~- l( J( j
    }
) S& _% r* `- W1 I- @    p=head;
3 Y8 U) G  Z3 F; f8 ?+ F   for(;;)
1 }6 B% s- [0 h9 f% }: P; n    {if(p->flag==1)
, F/ s5 `1 j- z: w       count++;6 D6 }' g& L' g8 X
     if(count==N)% k) q. ~! x1 S6 r
        {p->flag=0;2 v0 \5 \2 l7 J2 s
         count=0;
! t- k) i4 ?5 D# I$ y         sum++;}
' ^: V2 l# H* _, ~* s3 h$ ~8 r/ `     if(sum==M-1)
, H0 k; W5 |) z" J        break;. Q2 k5 u. b2 L6 O7 L/ n6 m6 U
     p=p->next;1 ]9 d/ c# _5 x% @) M: u$ `
    }
7 `, s! T& [6 z: V    p=9 P' r3 Y6 j2 R
    head;
7 W4 h( B0 q5 w. W    for(i=1;i<=M;i++)
. o1 i0 N( M* ?/ H) q. f    { if(p->flag==1)% G9 K! R  D' \  `5 M  Q
        printf("\t%d",p->number);
% m5 j5 m9 ~; A: i1 W) E/ b! U      p=p->next;
7 Q% s* S$ M# p7 a- H$ [9 [# }    }
6 `& X6 P2 d8 b1 C
* v0 f: x$ M5 j* S
" a' A4 [8 G1 ?8 C! H3 @9 T+ V. i! M" v% S; `, {" ?1 f9 H* L
}

% B9 k$ _! Q. m. u' G1 @第二种方法:数组
* m" [* p% s" [4 d9 \#include<stdio.h>& \4 {4 u9 t' G% {0 q! k
#define M 8( f6 N% J4 p! ]4 e3 L3 G1 c
struct monkey1 M7 I+ z+ }: D
{int number;; t; U0 m. }! R6 {" b; ^% q
int nextp;
1 B. O- F1 X5 m/ b2 C}link[M+1];7 A, h: Z* C1 i

. D8 S7 T5 g/ r8 e: f- @void main()
) ]; E1 s/ G6 `# ]{int i,count,h;, ]9 v# F2 F5 U8 W6 E
for(i=1;i<=M;i++)
8 [2 a* s7 ~' C" S$ }2 D{  if(i==M)' L) a$ w: W6 x8 G; g- q* S- B
   link[i].nextp=1;) ]! x- E; V1 U  s. _
   else# G. N/ a8 |/ c0 W3 F
   link[i].nextp=i+1;
  a$ |2 f& J0 o2 r  link[i].number=i;
$ f4 O0 ]; g) x$ t% A}
0 `8 z7 I/ s" Nprintf("\n");" }9 u9 D* J8 f7 \( m0 E
count=0;6 [/ ~: U: Y1 N" A
h=M;
" p6 E( Z2 r0 [# fprintf("依次退出的猴子: \n");
) y! O( z& ]4 H( b( Z- [; k0 b8 Jwhile(count<M-1)
$ |1 ^# p5 q$ u# n9 L{i=0;9 Z& e( C  q5 }: D7 v
while(i!=3)" I9 R8 o$ `" {# [  F. }( U
{ h=link[h].nextp;
3 z3 ?, f7 B1 u; ^6 X   if(link[h].number)
' T3 J, K) s+ j! v/ [% v     i++;}0 Q) K- g7 p( ^; t! A0 f( E' @# c

/ \/ d* N) x" _7 s' a6 sprintf("%4d",link[h].number);
% ~4 k" \2 f3 ^! U6 h8 f5 Q0 v, Plink[h].number=0;
" n- Z1 o2 B; ]. U1 V% c! |count++;0 g2 i7 C4 {3 @5 S5 C. H
}, I  ~: y- V! w; Z  s- X/ m2 v

& W* y) u4 B5 `printf("\n大王是:");
. s( ~( J$ J  v- {  for(i=1;i<=M;i++)
1 f. D. I/ ^/ ^7 p8 S' p  if(link[i].number)7 Q! o& a" l" @' A6 ~- d, r$ H
    printf("%3d\n",link[i].number);
2 C3 v: a, |% b$ `6 ~2 d' {" `5 }/ q/ E( c& U; q5 c
9 ]& c7 j5 Z  n
}
& t+ r. }1 o0 L$ a8 j# A- r
第三种是普通方法for循环
$ |; j$ c& E" x! ]6 q; C
#include<stdio.h>
! O" I. X6 i4 a- `void main(), F) ~9 m+ [9 ~* `  t8 B
{ int i,k,m,n,num[50],q,*p;
6 H9 y0 p' G+ a( v0 C' \    clrscr();! Z9 i2 e" W. G
   printf("input number of person: n=");0 g% S) _# ~% y, W4 u) n
    scanf("%d",&n);9 a! U' Y9 p' x" p! j& h; t
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只4 b! n  {: w$ m) ~3 t
    scanf("%d",&q);3 _4 {) o5 L# f" }$ n* Y2 X
   p=num;6 v4 o- B. f) d* u. C
  for(i=0;i<n;i++)
8 e. R% z( U- v1 M& r    *(p+i)=i+1;$ X9 B/ O; R) b' s" w0 r
   i=0;
0 O. _; R2 E/ I9 h! b& l' s& D   k=0;& K( d# z. Y( n  k$ a( S( P8 ?
   m=0;
  M7 f& O6 R; t) v: n3 b1 \$ t  while(m<n-1)9 ~6 i9 z/ B" a) Z6 E
   {if(*(p+i)!=0) k++;% n3 m& h2 A% {$ `5 e% o4 P  C
     if(k==q)2 y& m0 X# D( n: R- _0 `2 z
      { *(p+i)=0;/ X9 x+ ^) z( j8 W- p
        k=0;- z6 _/ E5 }: n% O- [, R0 m' D
        m++;$ j" e, D2 j" H
      }
! y3 U3 D3 j7 F$ {8 B' C    i++;# u8 W4 X/ l- v$ z, l
    if(i==n)i=0;
7 z5 b) P/ T/ B0 c   }
5 p+ C' w0 j7 U) [  while(*p==0)p++;* y! Q4 K) n6 s, w8 P; U' {
    printf("The last one is NO:%d\n",*p);
& ?1 f; g  B2 X7 Q) |/ S     getch();3 L7 h. n/ x7 F" k) F( d- ]

/ X  B8 y! e* f2 x7 d}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
" Q# O; k7 x# ?. q- fnamespace 又费马达又费电
7 O; Y0 S5 `! ~' v+ @{3 j3 g# R; m( C
    class Program
3 X  y8 U% P2 J    {
; u. y% m$ t* c; d1 I/ u        static void Main(string[] args)
" L, i) l$ X$ T- q        {
, @7 E+ y1 E& }8 b) W9 W6 O# I7 R            int m, n;* b, x0 \# s1 w* W6 Z0 J  U" v
            Console.WriteLine("请输入数组长度");! i* G5 ^3 |' i
            m = int.Parse(Console.ReadLine());//m为数组的大小3 |4 I* I6 D& o* D* H) x) `
            Console.WriteLine("请输入要截取数字的大小");
+ f& P; R+ n5 r" ]# t! i! _1 v: c            n = int.Parse(Console.ReadLine());
2 b6 N1 l5 b, ?/ D( k* C9 k            int [] numw=new int
% O6 l4 ^' l* S1 ?4 w6 x% c$ N+ o8 a+ k9 \5 o0 o8 J9 b
&shy;&shy;&shy;;' o/ W8 z1 b& w: u1 ]
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
  i+ e. Q! y! M            {6 c5 M( I5 L) V- Q7 \) B9 v8 x' d
                numw[j - 1] = j;
8 q- Z% \' C- Z; D. D- {- u- Z+ G6 f            }+ Y- |+ v/ e& {+ V# G* r, l
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
' o- o* ^, y* V6 `/ s  t2 k            while (d != m - 1). r- x. g& ]. t2 K+ x. q
            {* t$ s- X/ x. w: G
                if (i == m && d != m - 1)
4 b  g; }* m4 ]" L                {
5 j2 Q' N( X6 m, ~  i                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
+ d0 l3 i" D( s* z. [7 ]                    continue;* E5 n4 ^8 A- a' m
                }
1 Z3 l  F  U& K% K  z: Q' P                else* O% F* [! |# m
                {
5 ?7 ~& n0 p+ z* L% g1 c                    if (numw[i] != 0). T2 J8 p* I) _7 W$ v) Y
                    {5 ~: @& N+ A& t5 d0 {
                        i++;3 G0 {+ z: c3 |% L* @( ^+ d- a6 u2 Z
                        k++;
: J  I. i1 o$ S/ y7 v2 Z# {                        if (k == n)
- W- L4 I8 |1 ^% ~) T, E- g3 w                        {5 q3 [# G4 l  m2 F
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
1 `0 E/ l" Z  x+ ]1 H                            k = 0;
/ J3 S, E, U- ~. z" l              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1# K+ p1 C+ r( B; q. w* l
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
7 q5 h8 X- `* ]5 `. Q7 I                        }6 l) ^, j4 u% j2 V8 m" P
                        else//输出暂时还没有改变数组元素的值, G  n2 h& y' ~" W" ?$ D
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);3 b+ G2 ^9 F0 `# c( \' p0 r
                    }
4 {" A6 E$ ]/ ~# [' }                    else
- `! b$ v" m8 w# d" j" Q$ k                        i++;//数组元素为0,直接跳过,不计数。。。& [+ b! N+ m. X2 D2 g
                }
1 M0 f1 X2 D1 b4 X3 e& a0 T $ T1 [3 ?; I: H2 S* e% W
5 P$ _' |( Q0 V' R# x6 {
            }//结束while循环
* z( P2 X9 a2 H            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
/ k( |7 g3 i$ w0 \+ Q/ M9 k6 b           # ^; x! l5 w* S1 \! b
                if (numw[i] != 0)0 x- e7 C1 K, ?& j# R( e2 p0 ^
                    Console.WriteLine(numw[i]);
! ~5 a1 E) I3 ?, O7 a           3 m3 G1 ?- i# S5 j8 @
            Console.ReadLine();
/ m/ e. R: ?* m+ A% @  k0 [        }0 x, c6 X1 @# n+ V
    }; t- I0 u. Q- T/ ]; Y
}
# R* I" O/ S( d$ q% ~  i9 J* {
小甲鱼最新课程 -> 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-8-7 23:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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