鱼C论坛

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

猴子问题

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

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

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

x
大家好!2 T$ P! o) B# C3 M  _
这几天我在忙着编一个问题,我用了一种方法编出来!
1 B; A+ u4 P( T4 V& I! G但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
; K  k* D4 d7 Q注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
6 k  {) T3 ]. \# ?$ y( Q- l2 b" W" ~6 M9 v& S; w
2 G/ }7 S& Y* m5 `$ s' ^
                            题目  ?. u, K6 y% a8 z1 |
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。) {; Y% ?; ~$ l) b! Y6 I& ]3 t5 S, S
第一种方法:利用循环链表% ^/ W: y5 f/ j( k) e% x( H
#include<stdio.h>
: a5 F% E6 I" C5 L#include<malloc.h>8 L# r7 D- `5 u3 W! y; ~- T
#define M 8            //共有8只猴子! E$ P% l# y/ l# j
#define N 3            //数到3只时退出第三只
* z+ v9 V5 S' Z% y+ ctypedef struct monkey  m; L; e* s  e" T
{int number;: E- U/ ]% a# U: s9 {
int flag;4 o1 O- G* c. I( N
struct monkey* next;  h7 F7 u3 c3 o  t+ L) t. p
}MONKEY;
; s$ r+ L( `! N/ U4 @) Mmain()4 Q/ ^7 `  i: N  o9 `3 Z
{ MONKEY *head=NULL,*p,*s;
9 X) F( b6 C2 R! [2 Z, M! t; e. z! o  int i,sum=0,count=0;
$ C" z" }: E/ F8 \3 W# o  clrscr();              //清屏
+ g1 e9 R5 A* ~, x9 Z. C( j" s  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
) B+ c8 Z% ]# B1 h* u7 g  p->number=1;p->flag=1;
# P, Z2 ]4 V/ ~& s% x0 r- Q/ @* S  p->next=head;
. U4 T; {# j. h" v  head=p;; p1 z  e9 N5 N) `# C/ W5 p- k
  for(i=2;i<=M;i++)
$ \9 ~& e% U" W    { s=(MONKEY *)malloc(sizeof(MONKEY));
$ o+ q3 y" y/ z  Z3 K; a     s->number=i;s->flag=1;
% Q& f9 v8 ]. q; f( j  s; z     s->next=head;
# J0 D7 I9 D0 A     p->next=s;p=p->next;$ e3 m' M' ~: G0 W$ A$ h- L
    }
- ^) ~: W' q% A; X8 X3 Q0 A    p=head;
( ?0 j0 O6 C3 r* Z7 h. A- M8 F   for(;;)7 `: `" A* [: E2 C/ z; n1 r6 C9 ]* m6 _
    {if(p->flag==1)+ p* t- r. u( b$ ]$ w, Q
       count++;
5 C! m' R1 r3 j0 R6 Z7 x     if(count==N)
& l3 g, S; x, J9 z1 n9 R. ^3 C        {p->flag=0;
8 m$ r9 j0 ~' `: f         count=0;8 {6 m& `) C/ s
         sum++;}  a, u! V. c. @* C
     if(sum==M-1)8 V1 G0 o. ?( M9 m! d. J% e9 d" G
        break;2 H/ @# z6 b+ h
     p=p->next;
2 T* [' x" j5 p1 D. [; u) Y    }3 M5 H2 |& c# M0 `3 e
    p=
3 k5 H4 P  t8 w0 y    head;
1 w; X0 X0 d1 }/ s. P3 o% E3 h    for(i=1;i<=M;i++)# q3 Y1 X7 _3 Y% f: Z  Y
    { if(p->flag==1)
% o3 [( W: |# _9 j2 S# c        printf("\t%d",p->number);9 N$ D" ]2 ?  J# p  \
      p=p->next;; R4 T. z0 m& ^9 ?, W' @' P
    }% i. L* R$ O9 c7 S8 [
" ?8 l+ U; B# g7 t7 F' Y) i, v

* F4 R+ }: U5 u! t
6 i( c6 \4 F; d( m. A( y}

0 x- j# i9 K. a  |3 G第二种方法:数组+ p; m- S# f4 ~# |0 j( Z
#include<stdio.h>! x" i* S3 ~; S. f: p/ y
#define M 8
# m4 t$ Q  H/ `4 Dstruct monkey
0 A' Y5 @; T) }1 A- {# o/ R) G{int number;
' ?, H' W' K8 s% Z/ ?4 `: Vint nextp;7 I' c3 [9 y. B  n& T- g
}link[M+1];5 G9 w, Y; |! v. E1 E
2 L4 N( G; }7 U6 P
void main(): C" y- q, R- O- ]; h( [, Y. D
{int i,count,h;: r8 W7 ?! ^* X% A
for(i=1;i<=M;i++)  ^) I" v) J: K) x; Q0 E, |
{  if(i==M)
8 ^; o, F8 Q0 `' B/ B' H2 X   link[i].nextp=1;
: H. r0 O5 t4 ^2 U; _, Z2 [   else
( g3 G+ j1 u  L: J   link[i].nextp=i+1;5 |& b$ C& q/ i- }6 l# K. F) u
  link[i].number=i;
' U+ y- R) \8 I: f}
8 d* t: e! P( y, b: `  `7 K2 U2 yprintf("\n");
. y0 `: O+ k( d# C$ kcount=0;2 _. O( p2 w% ^$ ^5 ~4 ~0 o0 P4 T
h=M;/ P. [: ?# o, A0 ^, n- V
printf("依次退出的猴子: \n");
; z! t- s( a4 P( b* |" ^  kwhile(count<M-1); d. K8 u5 X/ D
{i=0;
& ^8 Q/ ~  [3 g) l; K2 i1 [" Iwhile(i!=3)
: H& l: q! _" i1 P& d0 D{ h=link[h].nextp;1 b* G! B# M/ X1 W8 i* k/ W
   if(link[h].number)
! C' w5 m0 T0 v5 C; x) p( V+ h: @2 R     i++;}* Z% ?  T1 y+ k7 ~8 \
; s; P( p+ M* z7 o( Z3 {  V. e. A
printf("%4d",link[h].number);
$ Y, @9 ~8 P' Olink[h].number=0;7 ~/ a3 l' l$ C" w
count++;
; A5 P( f3 t2 P4 F3 V0 Z}
! k8 X9 H" W- }/ X; a0 k4 A6 [: `4 ]( L9 O
printf("\n大王是:");( i% D- O' s0 z* ^9 x
  for(i=1;i<=M;i++): F4 ~3 L( B, j: V$ |
  if(link[i].number)
6 J+ p  A0 W. m& M    printf("%3d\n",link[i].number);
. J" g- v: K: {0 F2 |
0 u& f% T9 b0 b5 f
  y, t! W$ N  F. F}
6 ?, n. t8 `( N) R; w
第三种是普通方法for循环
/ @& U$ l% |' \- b6 Z
#include<stdio.h>) `! r- L- w! f7 ?5 I2 S4 u' q! b% s9 N
void main()
7 p; E6 ]# @  K0 L0 G# x) d{ int i,k,m,n,num[50],q,*p;/ H8 m: H5 n% V8 ^& R
    clrscr();5 b" t) P) C+ i5 u
   printf("input number of person: n=");
5 R- S# m- ^+ h  Z$ \2 S7 r    scanf("%d",&n);
- Z/ ~6 E# D5 @) v0 v7 cprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只+ U# H8 e2 o. L8 [- q' s
    scanf("%d",&q);* J) ]) K7 {, d' D! `6 U
   p=num;3 U" L4 E! T# S, Q& |" l3 [/ ~
  for(i=0;i<n;i++)  k( D/ Q! B9 M1 z, q1 ?+ l
    *(p+i)=i+1;8 j  Z  Q0 t- @) S3 @& c9 ~
   i=0;6 B7 u  G* `( `: {0 m
   k=0;. k: [! K3 Q/ n. X" [
   m=0;
- E( B5 r1 g! y; p( N* y6 ]- t  while(m<n-1)
* W0 q# Z6 |( D0 x/ @   {if(*(p+i)!=0) k++;
' y3 M; U5 K) ^8 ~# A     if(k==q)
/ q: t; H# w5 c- s& r- @7 O, s$ q      { *(p+i)=0;
" H$ k4 G- g2 i& q! m        k=0;' m) w( x9 x' z' O' K1 ~3 e: P% h
        m++;5 q" n8 }' I% {- T
      }8 F4 v8 U- S4 u1 ?" F8 A8 t. c
    i++;; N. X  y% I  j
    if(i==n)i=0;
  I; P, {, g9 A  E7 _   }
7 X2 m; Y$ D6 Y7 f' \  while(*p==0)p++;
4 ]0 b% i7 T% R    printf("The last one is NO:%d\n",*p);
8 y$ J- u8 a% l1 t) M     getch();2 z. }( g: E- I3 f8 t* H6 B

- O6 R* _9 \% w% \5 O/ S6 Z}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
# a- V* v7 s$ J0 mnamespace 又费马达又费电6 w2 e+ a% V$ D& G8 T
{
. d6 Q* s* b" l  m0 p7 ]0 M. Y$ h    class Program" n9 y, p; O, k) B0 L* ?1 ~9 X
    {
, F# N# I5 a( B6 M1 |        static void Main(string[] args)
' P8 \1 I: K7 k  V# g& @2 X+ ?        {4 d6 D" _3 S, {+ q9 e- ]
            int m, n;% T: X2 o( i$ A. {% d4 q! {, x
            Console.WriteLine("请输入数组长度");
  Q0 Q. H8 i3 S6 l            m = int.Parse(Console.ReadLine());//m为数组的大小# s) T: I- r6 y7 ~. O
            Console.WriteLine("请输入要截取数字的大小");
, V/ |3 }9 l6 g; s1 z            n = int.Parse(Console.ReadLine());4 \; q3 m/ ]- N. a( a+ x
            int [] numw=new int
- X, F  Z% [& f6 r* \
9 l8 h. H* p$ `5 w2 x( F&shy;&shy;&shy;;, D8 F7 F# ]+ d+ m& X! v- g; f
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
% n+ [7 D4 B/ ?& `$ o1 ?( k            {5 z. ]  q. l5 Y) O7 ]+ ?* N' `7 x) j
                numw[j - 1] = j;
! p  M  R& }- B2 {( x) L            }
/ f( s3 U/ y: ~            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
6 t6 o6 i0 U* c            while (d != m - 1)
9 E1 @: v, U1 `( J            {# [, Q( Q) g$ a2 F0 `) q/ z
                if (i == m && d != m - 1)
4 t. ~0 z# g, E' Y: Q( V: p                {& e# S/ L( h! T) N* c
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!4 n8 X' p$ i6 f5 _, E
                    continue;
. L4 ?" c' m# d+ b$ k/ n. Y                }" E* Q/ u, @7 V. n4 V/ |* k- E/ d
                else+ _* l: r# c' |1 y% M* ]
                {
: k; D4 _! Z5 _: `  z' H                    if (numw[i] != 0)
! O$ A' d, M+ _, l                    {
) _/ v5 X2 W- z- B& p  S6 H                        i++;7 [7 p$ v/ Q" E  P; [
                        k++;/ J  r( i3 Y3 s
                        if (k == n)$ \1 ~2 i/ \8 \0 w. y
                        {# S' a# D; w" K4 @# t/ y
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了+ _, x. x' _' f# @8 f4 {
                            k = 0;* N$ v4 ~: r* `! Q4 k- J! C6 \8 O
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小15 S1 [1 a5 I) j$ F
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
4 c. S! W% a- R' p3 y$ E; |' W                        }
3 y; H8 G: I5 t                        else//输出暂时还没有改变数组元素的值5 }" q% E! S4 l
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
7 G# q8 G" L2 q) M+ `  k2 T. H$ Y                    }
5 @& D, q# e5 U                    else
1 s0 i  G5 {( z4 u                        i++;//数组元素为0,直接跳过,不计数。。。" A* k+ M# [. o0 p- t
                }! o* d  ?1 l, H, r$ z  l; j& G

& t1 D8 I& O6 A6 L( @/ G/ N
# p5 |1 u- M9 s% q2 @            }//结束while循环
( ~5 }% ]0 F3 a. L            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
; ?/ i. V- s" Z2 h. x: P9 Q           6 K  x# O1 H" F: X: [! h9 |" w
                if (numw[i] != 0)4 L) D9 i9 p/ w- \- z! m! Y# M% C
                    Console.WriteLine(numw[i]);, d, P9 m* Z- u( {1 N, F
           7 B& n' }0 |6 Q. M4 @
            Console.ReadLine();. G- C! W4 X4 J. R
        }
/ e! j5 w2 p% b% X5 y    }6 k" D8 p  o' ^" R* Q3 k3 ?
}
1 V1 {' o  B- v7 {0 w/ ?
小甲鱼最新课程 -> 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-2-28 19:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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