鱼C论坛

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

猴子问题

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

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

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

x
大家好!8 R: E. b3 Z9 v0 s. t
这几天我在忙着编一个问题,我用了一种方法编出来!" t9 {9 ]2 l0 o1 m" I; W/ g
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
, x! _7 u* h# W$ o+ b' b注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
* Z* H% n" @2 a/ G) Q
$ a8 w2 d" X# a( @7 E" A1 M3 ~
% i: f+ H' j# u1 b
                            题目
0 q; J9 D. P: d山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
! k' q: h0 d, A0 U第一种方法:利用循环链表
: s; k- [! y! z, C' {8 Z! t- q/ F#include<stdio.h>
' f7 y( L7 G, L" O: I#include<malloc.h>
( y- K7 X/ h; q. M, W#define M 8            //共有8只猴子- i/ Y: m3 f- n4 ?! U
#define N 3            //数到3只时退出第三只4 P# _( s  a5 e; T2 |5 @
typedef struct monkey
* \9 C4 z; }, R0 h. L7 G{int number;! _) v- r9 B/ T, k+ }- @
int flag;, Q4 R3 U" u8 h& k1 t2 R4 S6 ~$ y; b
struct monkey* next;
& C! G, L" c4 R2 z3 o}MONKEY;/ O) L, b+ x' V' H* V) E
main()3 h" x0 l( U8 H% z
{ MONKEY *head=NULL,*p,*s;5 }% D: Y3 H3 Y0 j+ G2 s8 W( S
  int i,sum=0,count=0;
! B) _3 P' G1 m$ F; w. L  clrscr();              //清屏0 x4 H6 Z% Z! J: H. U7 V: B* W: }- t
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
6 G8 J6 o) V4 t9 Q; |$ y! n5 H  p->number=1;p->flag=1;
* m* K+ n; j( k  p->next=head;8 q  a$ W6 x1 u0 f2 E
  head=p;
1 n8 Q& ~8 Y7 k) h! q1 M  for(i=2;i<=M;i++)
2 s3 [% Y) W) f& }% R; H, O/ k    { s=(MONKEY *)malloc(sizeof(MONKEY));
, A  H, F* E! w$ u     s->number=i;s->flag=1;, ?( V! f) c7 D4 A( g9 D$ a. J% D
     s->next=head;
7 E: b' B/ h6 p2 M     p->next=s;p=p->next;
) c1 R2 m  w' ^5 L" K# A; c    }
0 d8 f/ i2 |' ?. ?    p=head;1 f* U/ {6 f5 f) w( n: Y9 j& x* J
   for(;;)
5 v' x. b* Y7 @' n    {if(p->flag==1)+ A: c" j, o2 X' n4 P
       count++;
$ D) B5 S+ ?$ @+ Q& T     if(count==N)0 I! z: r1 t4 K7 P* w* p- H
        {p->flag=0;3 {9 m& n: ^) e$ R, c- P
         count=0;. u3 i4 x- R' n" I) l
         sum++;}+ }  q6 U% j! s
     if(sum==M-1)3 R) _6 g) u( H2 Z% ^" R
        break;
5 A8 |2 Q- n, G- S" C" t' d     p=p->next;4 b/ N1 E9 W( m. }% q/ S8 s
    }  {0 {& |! C( L
    p=
' Q& A3 s5 {  y    head;
7 Q8 d! Q: [% R7 Y3 F' Y: e; G6 E! v    for(i=1;i<=M;i++)
8 C5 ~: R5 v6 Z" U    { if(p->flag==1)
% e, `1 U6 p  Y' s' \8 f        printf("\t%d",p->number);
- j0 ^2 O9 S! {/ G7 r' u      p=p->next;  I! @1 x4 Z  X, C2 _- z
    }
) `- n; n  i4 V6 M2 [5 j5 s% K( [; U0 a

  f; e7 _) x1 b/ y: X0 h0 ^0 W1 p! W: {! Z, ]
}
  I5 Z) g& R( U7 P- r" j
第二种方法:数组: b/ c1 I; i- s4 ^' E2 @, X
#include<stdio.h>. c3 O# Z; C3 L. a! }
#define M 8' ?1 f9 e5 k  g1 n/ m
struct monkey5 P) X( O4 `6 l2 _
{int number;0 s" ]. u5 L  o4 T
int nextp;
, J5 s& m- s! M+ M: T% b/ m}link[M+1];
" ~: I" w9 I' f8 E+ J* L7 H# m  C$ v4 ~3 j( H
void main()
1 f# a7 l' O2 \' u{int i,count,h;
5 D& h# [  h) Y& z* qfor(i=1;i<=M;i++)- c7 ^8 H2 w) |
{  if(i==M)
  D% V2 W7 X% R/ T3 [5 O/ A, b   link[i].nextp=1;" `8 l5 s) v- A& ?7 w/ m1 D+ [
   else
7 t' _8 f$ W9 u0 \+ r   link[i].nextp=i+1;4 `; h4 q& U+ F# s' c0 J& W  O7 @
  link[i].number=i;
8 `" b$ |9 N9 C8 B0 J$ l2 Y}- ^% h0 q) x+ ^; b" a! T
printf("\n");
! G$ N, C& V' d0 {count=0;1 T5 d; N- {) {/ L
h=M;7 L" j/ Q; Z" C7 C. J4 H/ e$ {
printf("依次退出的猴子: \n");
. a: J0 U2 s1 D6 p! U8 V& rwhile(count<M-1)
$ m; P" K# R# X- s8 \; @{i=0;
  j1 Y6 \; Z" ^# @- O4 _3 kwhile(i!=3)! V# t- ]5 M. Q/ C1 k4 b% G- h- Q
{ h=link[h].nextp;
" f- m+ B! J3 E8 o; L   if(link[h].number)
2 I: `- f5 {: R3 n- y     i++;}
9 ?/ f, i' D# P3 W
) s5 w9 o" A5 ~printf("%4d",link[h].number);" \3 I8 `. X& N8 n: f2 f* e
link[h].number=0;
* ~/ G# Z" c/ ~9 u) Q! P# Zcount++;2 R5 x, v  J, Y( i' ~/ C
}" k/ t2 z, o; @/ V
+ L. g. q2 s1 i& A* C; _4 w
printf("\n大王是:");0 [' W8 ]. M- }, @0 Z5 C0 _
  for(i=1;i<=M;i++)" G% h& ^) ~1 b: {
  if(link[i].number)
* @3 P' Y" `! V. c0 M" f# `    printf("%3d\n",link[i].number);
" m9 I. s$ H  o& N( X+ u! o5 h( c3 b( f9 J5 q- }# t: B
9 S& N: ~0 d3 r
}

3 E+ ^( |9 K" m0 _5 [第三种是普通方法for循环

( _  g# i( q2 P# @, m#include<stdio.h>  R  o: d: b  ~2 I( E& X. v
void main()
/ P/ d, ]% a$ c% O{ int i,k,m,n,num[50],q,*p;
1 S+ I  `& ~2 e% B1 G% X# l    clrscr();- |  [$ e1 C7 @3 r( J6 `* n: }
   printf("input number of person: n=");
& F( m! Q. Y3 R, l0 ?' a/ N    scanf("%d",&n);- Y* d: I2 U7 ~+ L, i1 r  {4 Q
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只4 [! K# j7 ?: _0 V( n
    scanf("%d",&q);
+ K, O/ e/ f; H; L5 R5 G   p=num;  O' N8 [8 q) y6 g: f
  for(i=0;i<n;i++)6 H( S, O0 k6 G0 _" G) B" H
    *(p+i)=i+1;$ [! e" Y* Q. O3 s/ a$ M
   i=0;" B2 W& [9 A# f6 T* I" [
   k=0;
  e9 D" p, l: X, s# w5 ]   m=0;( {* W( ~9 t3 U/ p4 [5 _/ t
  while(m<n-1)
1 s! d8 L% y0 N3 I   {if(*(p+i)!=0) k++;5 F" i2 g  q/ C' l; I
     if(k==q)
- t/ C/ Y) O+ w      { *(p+i)=0;
* s0 ]' g  H4 G9 V/ B        k=0;5 \) i9 E- o! x1 H6 f- @/ r: ~
        m++;
7 x+ o) o, a, U      }
  e: e" G0 i/ ^6 R# u5 l    i++;
7 J5 S: v5 S8 c) o4 R  t9 [4 @    if(i==n)i=0;5 b! Z# \2 @6 E' X! H& b$ h
   }
: D; J/ B) Q: ~, s& N% S1 W  while(*p==0)p++;4 x' r$ g) r" ^+ G* I1 x
    printf("The last one is NO:%d\n",*p);
1 d* a3 {* W- S! `     getch();
4 T: a- v& F' R
8 J) Z& ~1 n# s- z6 V$ j$ ?}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
+ T3 Y# R0 c7 unamespace 又费马达又费电
( V* g/ `/ i3 Q0 |8 y{; p/ x: S$ |) F
    class Program
! j3 U; b. X# q& {    {3 S/ W" O) m, N8 |2 m$ \
        static void Main(string[] args)
/ q, U* G6 [( A, y! C        {
3 X0 J" j. R! U            int m, n;
( X5 j% p8 z, e% R/ q            Console.WriteLine("请输入数组长度");
6 q' i5 l# F- V            m = int.Parse(Console.ReadLine());//m为数组的大小' K" L+ d" ~. M) h2 S
            Console.WriteLine("请输入要截取数字的大小");
1 U5 W) Q) a; R: A            n = int.Parse(Console.ReadLine());
5 d) ~$ }& ]- a2 J            int [] numw=new int
9 F8 K' }# K% h, J: E# h
8 r' P$ d" ^# q! c" R&shy;&shy;&shy;;
( |3 P9 }# b) P# \8 J- Z' V7 R            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
% a1 Z% U; e* W8 c            {; ]2 F- g2 R9 T- `0 Z5 R
                numw[j - 1] = j;8 d( L' E6 n0 B) a/ Q) t+ v
            }( h6 C" l$ w7 i  I7 N
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!$ G$ b% _# t3 u' j: B1 e/ z2 D7 o, o' Q
            while (d != m - 1). H8 m5 s6 y6 d; h2 h  Y
            {
9 A; a' S5 T; E* F                if (i == m && d != m - 1)' _9 \2 D+ L4 y  C* E6 ^
                {3 F* o7 S8 K' U6 G
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!$ j+ B" o4 h6 @6 b' y6 D7 h# G
                    continue;
, f( T4 \( I8 g4 I8 g- u4 M                }
: |4 r# V5 r8 |                else
: \0 l* s! P. z# h0 _; y3 q# m8 B                {7 K" m1 x& l% _1 y; g' H
                    if (numw[i] != 0)
3 h' ]' J5 N4 M4 j. F                    {
0 Q6 L3 j: a. [; w! k) F( b$ i2 C                        i++;
1 L) r1 I' R, U+ V4 K                        k++;% ?% A' J* u0 n: w8 M. g
                        if (k == n)# K: O& u) x. d; z9 O: f, e3 R
                        {
9 T" ?5 G: d3 D. G3 S7 w3 g3 |( p                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
5 s2 Q, {- H. L( ~  @                            k = 0;& |8 [# L5 [0 f) _8 o
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1! }# t3 O$ X$ f: `
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);9 E% ?" N. l- O/ L/ e  t1 u
                        }8 S% p/ u, e" I3 }$ w! P; I) J
                        else//输出暂时还没有改变数组元素的值) I! ^3 a* Q4 }& b% Y
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
5 e4 O8 b; I9 T( b5 T+ ?! b                    }' p. K4 r3 w& X* k0 g# s8 N* A. \
                    else
, \# R* E* N' z; z                        i++;//数组元素为0,直接跳过,不计数。。。
# a" `1 m( g8 Z2 b                }
' n6 u$ D$ c# W! H' V- o * ~) e9 A4 }& o) c) ~- U% C

/ P; I( G# k. V# c8 h            }//结束while循环6 M0 v- }6 q0 F5 z' g
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
7 U: e) D' F% u" n           ( x: e5 b1 k; A3 j
                if (numw[i] != 0)  F% }2 j5 `7 K8 W9 ^
                    Console.WriteLine(numw[i]);
. c/ y1 f6 u8 R6 d6 X; D! [1 Y           
6 b7 t0 X  a7 J0 a9 B6 s            Console.ReadLine();1 w7 R1 M7 s2 ^: \, n0 K
        }
  g; [$ I$ {7 _6 h$ a. i) M. N    }/ P3 t5 P5 m( S" I3 f' u4 Y
}
, a3 K* F* l! v6 I& Y3 z1 t
小甲鱼最新课程 -> 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-1-26 15:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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