鱼C论坛

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

猴子问题

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

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

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

x
大家好!
7 i+ x2 M, q6 _这几天我在忙着编一个问题,我用了一种方法编出来!
6 M* l6 j$ i/ e, N3 j1 l但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
! M6 \  M$ l) S; x, L注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
) z4 e, y4 h) w8 C
8 h" y4 r! @& Q1 {* b& n5 u* ^5 @) b+ h
                            题目
" y6 p8 d. p1 R' I$ e山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
+ E) P+ q* }5 K8 j/ o3 b- ?2 K8 B! x第一种方法:利用循环链表: p* r  z7 I% W
#include<stdio.h>
/ z* @+ E& }) F$ P6 U8 O+ g4 [/ d#include<malloc.h>8 s, K- i4 y6 k8 o: R: `
#define M 8            //共有8只猴子0 ~) [4 O: v/ Z( B
#define N 3            //数到3只时退出第三只& x# f5 B! E. K' a
typedef struct monkey
: n2 B* T5 R) f0 O7 T{int number;
  A  y, _" [6 O% J5 O' ]" k3 K' m5 j1 ~int flag;
- G# {7 i1 J/ P, p2 Kstruct monkey* next;, g6 }7 g: Y* k4 M  [. L1 N2 Q/ o
}MONKEY;9 B% L. P* Y3 i1 x" V3 L" n
main()) N! i9 u0 J3 O7 G4 U7 m* i
{ MONKEY *head=NULL,*p,*s;
& t; O, y6 ~: |* ]- @  int i,sum=0,count=0;
- U. N' i5 H" I+ z' P1 a! T  clrscr();              //清屏
8 k+ i9 o0 B  K* f6 f) C, H  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
) ^8 R& @- B0 v1 i' T" h: d  p->number=1;p->flag=1;) j# m, w4 s8 _3 d# S5 i
  p->next=head;
; R6 q+ L9 ]% v/ c0 S, P  head=p;, c9 Y. ~# Z" n' b& X) D1 [
  for(i=2;i<=M;i++)
, \* d3 P3 ?! ^% @- A" U; J# ?    { s=(MONKEY *)malloc(sizeof(MONKEY));- f5 ]  \' J! J- h" y
     s->number=i;s->flag=1;
6 n* N1 I: M7 h8 u9 r     s->next=head;' X& }6 }" @% E9 J/ w
     p->next=s;p=p->next;
, \# r3 K* l* `5 _, r' S2 U1 l    }
1 h, `4 e; g8 X) }: e9 n9 ?3 d9 Z    p=head;! \0 b- g; _) ]5 Q% F, p
   for(;;)$ D" K# \* M) @, W4 }
    {if(p->flag==1)' T4 X; @! O6 \% S% F
       count++;
* G; g# R0 R$ K# Y' H6 p     if(count==N)
+ k6 G  B* A# V; m        {p->flag=0;
1 A7 Z) J0 _; X% u         count=0;! l  D1 U* N& z) ~9 I
         sum++;}9 r1 p8 y6 W- e) f! V6 Z4 w
     if(sum==M-1)
# x9 |% m: O' q        break;' z) }, C% S. f* u% j
     p=p->next;
1 J' a$ D0 w8 R, n$ e" \2 Y: z- a9 X/ q    }! z2 |% k, K% E& j3 L4 O/ A
    p=! q3 Y. P8 o$ `, Y
    head;4 e  \- A6 ]4 P3 l
    for(i=1;i<=M;i++)( s2 H% S! B: l3 p  y2 y/ T
    { if(p->flag==1)3 c  d& \0 w* j+ k
        printf("\t%d",p->number);( e) b, `+ D# q/ x5 t! c/ e; F* s$ s5 K
      p=p->next;, U6 x8 ^4 D$ k: K. o0 i$ w
    }
: P9 i7 c& }9 W
5 ?% L+ s9 I: [: i0 d- t
! [* C, M4 u, p+ }/ v& T
0 p+ O# L: F- b: u6 d}

" |0 c7 g- [' x/ k1 ]8 ?2 Q第二种方法:数组
2 O8 g2 K; `% Y( q4 T8 Y#include<stdio.h>
" b  v" e3 r* }5 ^* l& I2 _#define M 8
- q+ Y$ _/ \5 Estruct monkey
) W& h, \; v2 {. m5 V4 a{int number;, K. p( }; ^  v" ?. W/ o
int nextp;8 b% w, J3 r" D6 |
}link[M+1];
7 Z: |9 C; Q1 b5 s" F. y# k" d. F4 T  V* P. a
void main()
0 T5 q+ G9 k: a8 `{int i,count,h;
# e! ^% _, }; \8 w; Z: C1 y2 I* Dfor(i=1;i<=M;i++)% H0 f& J# `+ q. D: z% \
{  if(i==M), T# b/ \/ c6 C8 ]' w7 M
   link[i].nextp=1;
6 m# s9 g/ K: h1 C, Y9 C   else
# r& E, Q# V6 b   link[i].nextp=i+1;7 o! i* ?# n& V3 ~
  link[i].number=i;
2 o( [( [+ l: `9 C, i* P}$ x; k: A9 ]  ]
printf("\n");! f; @/ g. O- c* _
count=0;6 I; B% y+ z4 E5 H# d0 \8 k3 t! k
h=M;4 ?9 k4 P" M# O6 o2 H$ L
printf("依次退出的猴子: \n");
/ m' H7 j9 N6 n( y' a) P' }6 Fwhile(count<M-1)
7 j" |! \0 [0 G. A{i=0;
* y' E3 H  y# c9 z5 iwhile(i!=3)
* F! }+ }% c' R* |2 G( v8 n{ h=link[h].nextp;
$ |( g: p: R$ q/ @6 K' Y- q/ S   if(link[h].number); ^/ T4 `4 D. t( f2 F' M& l9 M
     i++;}9 F4 Q8 `) h* t2 [% T: M
$ a. Q) v0 y# P0 s5 J! i0 j
printf("%4d",link[h].number);
8 c  _# R2 H3 S4 Zlink[h].number=0;
$ H4 n* R3 [" o. n' x, g+ ocount++;
! d1 ?5 t* x# {( P}
" n. @: e. w0 V8 ]6 ^& R7 G- a. `. B. {7 z7 P' @/ y
printf("\n大王是:");
; M( _3 ]& s+ @% P( F3 [  for(i=1;i<=M;i++)
0 P2 B# A8 s2 W' a8 U( b6 j  |  if(link[i].number)* c4 U. @1 K3 E) I6 u+ i
    printf("%3d\n",link[i].number);
: R9 e5 I: m- W4 _
( l; y( o+ m" J1 L# \1 p; |1 ~. b5 B
}
3 |% }& l, C" z2 Q% q1 v- ^
第三种是普通方法for循环
& M5 F( T9 I$ x. `0 P' M
#include<stdio.h>, u  d  f8 ~  U: D/ V/ n3 j
void main()
8 E2 J% U0 {  a) ]; C; |{ int i,k,m,n,num[50],q,*p;
, y* {# M- w# M! B+ w0 P    clrscr();
4 f: ~! t* Y& ]) g1 G( I4 r   printf("input number of person: n=");" [3 F2 u* b6 Y! e! a) O/ Y$ y" P
    scanf("%d",&n);, K0 v+ |1 D+ `3 f& B$ O# R
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
( ~+ n& ?" Q* K7 w3 G5 y    scanf("%d",&q);
4 p8 K0 p$ o/ }: d8 G1 l* V   p=num;
3 I1 u$ Q- m- `( T2 H  for(i=0;i<n;i++)7 i9 d& l) u. L; b+ }( o
    *(p+i)=i+1;
" K: B3 Z1 E; n: s3 I" J   i=0;
4 S* p" Z/ q% }   k=0;6 T; Z9 N: d7 o; e, B$ D
   m=0;
3 c! E  p# p/ S% W# ?- n  while(m<n-1)+ K1 X% {: C. h9 j" b9 c3 M
   {if(*(p+i)!=0) k++;
" T3 ~) {' L* E, i' z     if(k==q)* Q- f4 H: {. ^, t
      { *(p+i)=0;7 T9 d* ~6 e/ l* F# d
        k=0;1 e& J  e$ ?, {; ~( @+ Y3 j( U/ N
        m++;
# P1 c0 Z3 b+ t+ {& }) n$ M6 [      }
/ F1 S, m2 s" x+ v. q# |& r    i++;8 f& Q- f/ r, z+ ?
    if(i==n)i=0;, ^0 g+ w  i) i" }8 l# s
   }
" A7 u# v- a& ^! m6 e$ K! Y7 B  while(*p==0)p++;
+ M0 y- c! G7 U; W  g3 |; n, c    printf("The last one is NO:%d\n",*p);
, E4 S. O; z$ Z4 D. g     getch();
+ m9 c0 I9 D. H, c; k- L# H
4 I7 u: }1 i# N4 o* U}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
9 j2 y/ l8 }! Pnamespace 又费马达又费电# c' O, m* ~! Y! l% u! Y  [6 |8 A3 A
{) V* ]+ k5 t) E! [
    class Program
8 V0 s) s$ C8 k) H% d4 Z+ F& X    {) ~5 ^2 a# `6 H
        static void Main(string[] args)
; p* G- D; J" P8 k        {
+ a, i, f( d9 G) ~            int m, n;; r1 g: t' h% R# M* x& K
            Console.WriteLine("请输入数组长度");: t$ Q1 G$ [2 x8 l' q/ z
            m = int.Parse(Console.ReadLine());//m为数组的大小
, M/ j. H1 t0 V2 ~2 O            Console.WriteLine("请输入要截取数字的大小");3 X6 r: S( r. G7 h1 O- G: [7 n% |
            n = int.Parse(Console.ReadLine());9 W& y1 ~* u  Z" b8 {% N
            int [] numw=new int8 W. B- ^8 p5 ~- T( Z' s$ g
' O# r0 N+ L" t+ ~. R0 }. y* j" J4 A
&shy;&shy;&shy;;
& E% K7 h; Z1 G* w$ |. w            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数6 b' Z6 W& c' q9 R' ]0 `
            {
  o7 E- s9 P. U- i                numw[j - 1] = j;* W* |0 i! z: t, H- w) ?- W
            }9 N6 t, l" y. S7 [
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
  P. f9 f: K. w            while (d != m - 1)$ M; C* b' V9 d. C" A" M" J
            {
8 V2 N8 \% G! Y: y; N                if (i == m && d != m - 1)
1 Z* P& c! q7 t1 b1 t$ Y/ H8 `                {
) t5 X$ s4 Q3 C$ G, w5 @/ C                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
$ a2 s3 x  F0 }                    continue;
' p8 H. a; g; H                }0 Z2 s0 E1 M/ i5 j* J6 t
                else8 g  k8 t1 w: o* Q7 f/ t  S
                {& R0 f3 ?7 ^; n& W/ T
                    if (numw[i] != 0)- G+ e6 z# I% w
                    {3 n  \& w0 V6 ^  r
                        i++;
% |5 d) m0 G* P, @                        k++;
5 A! p2 f5 t: K! g. [                        if (k == n)- }1 A. P- X" m3 l3 L
                        {
8 K* ]6 N# l6 T8 ?  p3 T5 ^                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
+ F1 i. w+ Z) Q& C                            k = 0;: O# v2 }0 h  I1 p1 x0 v5 j
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小17 K" U* t0 {0 N: k6 x
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);. J* ?/ Y- A* _7 t. A4 y
                        }- `8 l0 @, P! ?  l
                        else//输出暂时还没有改变数组元素的值3 V, v  v5 T4 P- \, q
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
% V. ]4 U) P% `# ]8 J$ p1 e1 U% N' f* F3 h                    }
' z7 b& E4 g1 W' h) d- v9 }: F                    else) l/ G4 Y1 p/ y* g7 E
                        i++;//数组元素为0,直接跳过,不计数。。。/ k3 L; k$ f" s+ J
                }, h7 _3 W5 n" @/ F" ?9 P7 Q
8 [% |# ^4 o; x2 ]7 g! Q6 w) M8 `

+ N9 M  Z; J7 i9 S2 ?            }//结束while循环1 K% r" O! E) ]& h7 p
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦# T* U) M+ r) l3 j7 e
           
1 ]' e- P) i* Q; S0 X' g                if (numw[i] != 0)
$ N* b( o- a+ [3 R5 b) B                    Console.WriteLine(numw[i]);
! R* m. f7 e  q5 N8 [, k0 l           ! Q1 e% h% G$ Z: R( |
            Console.ReadLine();/ M9 \+ k6 J: T+ u; ]" ^/ x1 ]- d% j
        }
/ w! C6 @3 i, c' x7 r% n    }: B; X6 J+ H$ z. A9 \* W5 a9 w
}
& b. X+ \) G) N& o4 r
小甲鱼最新课程 -> 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-11 04:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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