鱼C论坛

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

猴子问题

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

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

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

x
大家好!! ?9 P1 t- z% D2 O7 T! R5 k$ N! j
这几天我在忙着编一个问题,我用了一种方法编出来!
' ~% @3 o- ~$ ]! C3 Y. C" ]但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!- Y. \' P6 F& U% J
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
, t8 `( p* y, V( K
% l( @" R8 W2 q3 s( p& V# f  O
& o0 z, i2 B8 u- ?1 l- ?8 M
                            题目
/ L6 u2 H- A: y山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。6 |0 D0 m4 \# A+ m8 M7 ^
第一种方法:利用循环链表7 k% v) T+ p; T% y- ~
#include<stdio.h>
/ e  F8 f2 {# V4 }#include<malloc.h>* N- o7 D  `$ K8 L$ P: S8 N, H
#define M 8            //共有8只猴子, E$ r& e: `- d. o1 ?1 [, [3 A- `- T% G
#define N 3            //数到3只时退出第三只
! u$ U& k6 w2 ?1 Q, J* [* Ftypedef struct monkey
$ M) d( C7 s7 g& X2 s" J/ O) d{int number;9 y0 Z  W3 o5 s, T) F
int flag;
2 W6 w3 g. D6 q+ Xstruct monkey* next;3 r7 `  {" h% w: a9 C
}MONKEY;" J" a  [4 c! e' p
main()
, ?  s% {( d% O# a8 g; {{ MONKEY *head=NULL,*p,*s;
; o. ?! }- p& W' W  int i,sum=0,count=0;
+ u5 x; y9 `% g8 S: V# U& u  clrscr();              //清屏& }2 f0 {9 T2 e" W7 @5 Z3 W3 S
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
* Z+ N1 r, _+ a9 M1 @  p->number=1;p->flag=1;( c( `. [- \; |3 P; x5 h
  p->next=head;! i* l8 r0 v1 x. F& w6 L7 Y' S
  head=p;, t1 c% g- j6 B7 j! G% G
  for(i=2;i<=M;i++)
. s3 {( W6 l1 O+ X2 W6 w    { s=(MONKEY *)malloc(sizeof(MONKEY));
0 D+ J7 f' ^6 \& q" M5 E3 q4 q5 b     s->number=i;s->flag=1;
; z, L% v/ U- N3 e* d1 o9 u     s->next=head;
1 L) X! X) d3 U1 a! }. Y     p->next=s;p=p->next;5 H# [6 p9 r! w8 N* V& n7 g
    }: U2 ^9 y# |( R  r
    p=head;! F. w; H6 T+ e( w5 M) a
   for(;;)
9 @. K6 z* ~  d7 _    {if(p->flag==1)
; Q8 ?0 o/ R' [% n       count++;
) B0 _' F. }: u3 n5 `9 B     if(count==N), r! W" _% w$ k6 e* H
        {p->flag=0;; h  ~' Q& P! S: C) @: l" l
         count=0;
* q8 _( C" G  V! M* M1 L         sum++;}6 A6 M' ?6 {5 `, O, X7 j. @
     if(sum==M-1)1 p: L6 `+ M& S# z
        break;
7 B6 p& d% ^: m$ p$ [/ r. F8 e     p=p->next;
+ g7 W/ R# y3 Q( X& l    }
8 V; g2 A) J( h) F. G    p=: B6 O& N1 j' r
    head;
' {; P  I8 x! P, ^$ }5 H+ c. K    for(i=1;i<=M;i++)4 L2 N/ l% q8 w9 Z, r3 T
    { if(p->flag==1)2 g) }, _* F4 k6 s+ E* \- D
        printf("\t%d",p->number);
# D/ f( |- `( r+ D      p=p->next;
0 O8 ]7 ]. J4 j( V    }
" M/ {/ x+ n! f6 H; A0 e* \  ^$ M" ^$ [8 V
+ ?/ R/ D. t1 N: [3 v( d5 G

4 s7 h1 ^  x0 E}
5 P* E3 Z9 G  d# b: j
第二种方法:数组
3 J, R* G0 n) j+ B#include<stdio.h>
. O7 C" }! y1 d* t4 E#define M 8) m2 k' a: c6 @
struct monkey
' q) O7 U  W+ e8 p; K  v% ^8 t{int number;: y/ b1 T1 R% \( m4 n0 L4 D
int nextp;/ `) \- T! e4 q5 B$ _: y1 _# ~
}link[M+1];
9 e3 t+ K9 ]- ?, \- E6 s* [9 m2 }; D' g0 a) z
void main()2 z) q- t$ B+ [8 A  g5 z
{int i,count,h;& T* T4 C9 g) w) x
for(i=1;i<=M;i++)! Y' C" A  A7 y' T; h1 y4 w
{  if(i==M)3 t% B& d9 ~# k/ F/ J5 r
   link[i].nextp=1;
; |. ?& |: @% w% g) v& E   else
8 O4 L! \5 I9 e: @- L: g   link[i].nextp=i+1;
# s5 c/ E3 |& g& Z  link[i].number=i;
5 @& S4 @) }0 @+ C0 K}: p+ T5 F, V2 \
printf("\n");& \. N4 S$ k1 z
count=0;/ e& j& R3 k2 P4 X/ i( ~. m
h=M;$ l1 b8 b+ i6 a1 h, n6 J! M, l" i
printf("依次退出的猴子: \n");$ y8 l; {7 C' @/ y( f+ w
while(count<M-1)
1 t9 {9 }9 Y3 T) k/ ^{i=0;) F* p" ~  j! i
while(i!=3)
/ m' u1 `% _9 s1 B; Q  ^{ h=link[h].nextp;* k+ g. @- v# h1 U
   if(link[h].number)
" p# {- W# ]0 `* _; C% [+ p     i++;}
, B; Z( n9 {" e/ I1 g3 r" p9 b, d" Q/ a3 |) _1 z* v
printf("%4d",link[h].number);5 R8 g' ]2 X3 B& F0 k& J
link[h].number=0;
9 B, d; t1 Y( K0 S1 j) lcount++;. p5 j* r4 `* `" [) {& d
}
: E5 _3 W( _$ m9 N' Y1 ~. C9 J5 |: v% h! a  y
printf("\n大王是:");0 A7 H+ w4 e& q7 r* Q# R
  for(i=1;i<=M;i++)0 h2 P- W# l" B$ t: z
  if(link[i].number)
5 c. z, W: V7 A% y$ k! D0 g    printf("%3d\n",link[i].number);6 A: u1 p. C; b, p
4 o3 O2 l7 F; n
' M0 N# g: x; |; ~0 q  M8 Q+ h
}
8 a; D- ~  ]: |
第三种是普通方法for循环
) a/ ?0 i  Q) |1 H& x
#include<stdio.h>
4 ?: \. Q1 _7 m$ lvoid main()% ]8 B) H2 K+ z
{ int i,k,m,n,num[50],q,*p;
5 B0 w* x" {! {$ B1 f  t' n    clrscr();& p2 y" F+ n" ~% l( F- m' B6 e
   printf("input number of person: n=");
6 H: N) \+ ~, y8 S5 U2 E    scanf("%d",&n);
; A* Q6 V9 N+ T7 m+ {$ |printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只( d4 O7 K6 ?8 [8 e! t$ u- g
    scanf("%d",&q);5 l: \0 o0 K1 J( w
   p=num;: B6 G! t" L( t$ N
  for(i=0;i<n;i++)8 Q" Y# J( O, D: k
    *(p+i)=i+1;$ w% s& Z, C  B: X/ j
   i=0;
$ T. q! v' y- d% G# t   k=0;
* `4 n& ]( p. o+ F: ?) n3 C   m=0;* D1 b( H* ?; q. R1 l1 H
  while(m<n-1)6 F) s3 u$ k+ {7 F2 q$ k- F
   {if(*(p+i)!=0) k++;- y0 t! _: \  k* r2 t+ V9 m
     if(k==q)
4 P3 y7 l: ~5 m0 Z" Q; i9 W1 U      { *(p+i)=0;
) X0 P7 N3 O/ c: K& Y# d        k=0;: ^: v1 A% ~3 a0 [' O  U7 S$ t
        m++;
$ ^7 Z% U* ]: k- U      }
$ T* s" ~7 |2 Z! `1 Y8 G    i++;9 Z" |9 a, \2 B. I% V8 r
    if(i==n)i=0;
- z% r& q: u3 B   }' L& e, R6 f4 p3 `6 P
  while(*p==0)p++;
; {$ j! U& X3 Y2 ^7 {  R6 q    printf("The last one is NO:%d\n",*p);* o" l* X: }! [3 k3 o# o5 P6 d0 d
     getch();* ~6 K( l9 T1 ?. H! ]5 T
/ E4 i0 m$ r: Y
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
6 w- ]8 t8 y0 }. R& xnamespace 又费马达又费电
3 O6 O% a  ^1 {" J+ d/ q( ?. e{
1 T5 h; M& m- c    class Program
$ t9 h/ h0 y3 Z' E6 q    {
5 @* S6 I& t& h2 ^        static void Main(string[] args)4 f' `4 C' l4 W. n
        {
: x0 c1 f* u7 ]5 J            int m, n;
( B3 S8 V! y' o3 ~  r+ r            Console.WriteLine("请输入数组长度");
  G3 t) G+ P- t( C            m = int.Parse(Console.ReadLine());//m为数组的大小
8 K. p+ U( t- G: C# h2 T            Console.WriteLine("请输入要截取数字的大小");4 O, V- r2 d! R. }* E4 x9 ^: w
            n = int.Parse(Console.ReadLine());. z( h; S9 }' z5 \2 g$ y
            int [] numw=new int
! m0 ]2 f6 C( o% [; V! J0 P# K) c  S+ m0 X- n
&shy;&shy;&shy;;5 z/ Q) G! C' E' W, J6 s
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
8 J' F, [  q+ l            {; ?4 j8 }" R/ F1 F1 V
                numw[j - 1] = j;9 L2 L4 \7 I- Z: O2 C8 _, P
            }* s& n. z& Q$ p/ }! U6 S( b
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!5 f  ]* V7 I* S1 H
            while (d != m - 1)& r  d7 s, M* F3 X
            {' G% M; F/ ]& r+ |2 f  n* e
                if (i == m && d != m - 1)
$ ~4 x& y% L- [% ^                {' \0 O5 |2 R: B% U/ t2 v+ c
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
2 o. M5 _! i, `' p8 b                    continue;1 M6 d6 [8 j: x/ C; L
                }6 H2 u0 K0 S0 H6 f* O
                else2 w; M* F5 l1 X0 v* B
                {" G  c, b* g4 ^( ^; H
                    if (numw[i] != 0)- t/ ^$ g! L6 q
                    {) _3 w3 S% s! K4 N% c/ Q
                        i++;  Q2 J* u4 R' m% ]9 f# q
                        k++;
6 T' q6 p; o- }, w. W- l                        if (k == n)# G0 \, r6 n; z5 }: y! S1 V
                        {# L9 L7 j. c3 C& V& |
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
, y2 E2 P4 K0 T5 b/ h                            k = 0;
5 A8 ?* K& G9 i: \! n5 I8 j3 o              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
9 g0 f& p7 _3 D& a$ E  i, B6 G                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);( ^2 C# W$ s: v, u# Q( V
                        }
- \7 B# t; `  v0 P* Z: }4 T                        else//输出暂时还没有改变数组元素的值3 \% _3 N7 t, y0 b
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);0 e5 e9 y7 D8 }
                    }' V" T# ~; J0 f' }
                    else
! Y3 i8 F4 A% L% ^. e% ^                        i++;//数组元素为0,直接跳过,不计数。。。
5 ?& x3 t! K; ?# M# [                }7 w; C4 v; v: D3 N( W' L
, A7 z9 N8 _( p

+ g& h) v3 J- I; K9 ?3 C; n% k            }//结束while循环2 c" Q: ~# u% ]% [- ^
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦  _) v4 r5 }6 i) i
           
& x8 M! Y, z, t% d  F( d                if (numw[i] != 0)4 N' G4 x2 Q: k/ R# K. c" _# C7 S
                    Console.WriteLine(numw[i]);
$ C+ j. e9 s6 n; }: i$ l           6 I& ^0 A/ e5 x( A. d
            Console.ReadLine();9 @, S( s+ }7 p2 @7 @) p& @; _1 J4 q
        }
0 u! I" g) n# n, p' w5 \    }" F2 x+ n' O& c; h6 g
}1 @1 i9 Z0 |$ I: S3 M  S( Q8 N- P
小甲鱼最新课程 -> 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-3-12 12:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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