鱼C论坛

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

猴子问题

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

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

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

x
大家好!5 [- k0 z( }  H  L+ Y- e% P
这几天我在忙着编一个问题,我用了一种方法编出来!- H+ M8 H# a& t8 Z/ Q
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!! [8 m6 E! r; w7 g) ?/ \( x
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 $ M7 j: {/ S3 ]' G0 F$ p( v; A8 Z
/ l0 s! V6 c( O# j
9 \/ [/ D: x/ l5 D; ?  L
                            题目
2 L* O5 I* b, }( G5 R; v. H" C山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。/ g6 ]$ r  n# G2 H# m
第一种方法:利用循环链表- a* u' i& j1 B. `+ w6 X
#include<stdio.h>* P  ?2 f5 R* a) S/ u( q
#include<malloc.h># `: R$ J* a( X
#define M 8            //共有8只猴子' C7 b( ~1 `9 ^/ T9 p, ?2 C! g
#define N 3            //数到3只时退出第三只* \/ S! Y8 F, T. b/ [
typedef struct monkey
5 O2 Z6 }! C4 s2 n: [{int number;2 N& e; \8 K. X' S  `
int flag;5 a  b/ {) ^. L7 c6 D/ {5 U
struct monkey* next;
2 G2 ~. X' T6 i}MONKEY;6 ?& c# U5 {' \6 q+ {
main()
$ Q' `% I; N& ?. V{ MONKEY *head=NULL,*p,*s;. W, u: `; v/ k( a" a; ?* D
  int i,sum=0,count=0;
% d/ L+ d! p& L; p! S+ j4 E  clrscr();              //清屏+ y- }4 F! O8 B: H
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存# s1 H( }9 _+ _$ J1 C/ t# v
  p->number=1;p->flag=1;/ F" B! b( t: U
  p->next=head;8 o* |# P- @2 J& c: @* S8 `  h
  head=p;
! a3 X  G1 e/ }& n  for(i=2;i<=M;i++)
) A1 ^2 O4 Z7 e8 ]    { s=(MONKEY *)malloc(sizeof(MONKEY));' U; @. J6 h# |
     s->number=i;s->flag=1;' f4 _2 q4 y: v4 h
     s->next=head;) o9 k! O3 L( f4 T* N, a
     p->next=s;p=p->next;
, e; B  N. i+ K$ b! p' ?; Q    }
  P5 M* M0 Q7 t+ X. A    p=head;" y9 g9 ^- i, ?/ D; W' ~5 D% w3 D
   for(;;)
- h% Q/ R. g4 l0 W. }    {if(p->flag==1)# \& R0 Y% b+ W. q
       count++;
0 N, _4 g; `! j6 |     if(count==N)$ P5 x5 P$ y1 E# t
        {p->flag=0;
8 s3 |) j9 W$ p         count=0;, y6 p7 a0 B+ J- Q, C
         sum++;}4 M+ M" j' D, w9 V6 a3 L
     if(sum==M-1)' X0 j2 u) E$ g: P5 V  I% o0 w
        break;
' T3 `1 y% N' w9 Y  Q/ [8 c1 M+ i     p=p->next;
/ b. ^2 g. ?+ F* g  O  T    }2 [* D5 [3 U2 P1 H
    p=
0 N0 B% B4 G; M( `6 Y6 B/ o5 u: W    head;" Z2 `2 {. v. @/ X" N/ d
    for(i=1;i<=M;i++)
5 Q% j' B# n  Z6 D& R5 [6 O& @    { if(p->flag==1)
$ x, Y" ?3 k, b& W* c. w: q) f        printf("\t%d",p->number);
* G0 P4 {# X+ _8 L" Q* n6 L      p=p->next;5 X! Z3 ?9 w3 A! P! ^7 {/ I2 u
    }
" \0 @1 D+ E" I: Q: [& z1 t% u0 g; g$ s7 K" a. q5 a2 l

  h* k6 w: ?/ U
, r) T" p$ c8 {& U}
- x( r0 _" X+ E/ }( H+ t% ]
第二种方法:数组0 a) j0 t9 k. p* C0 K! ]
#include<stdio.h>
' [4 X% x, j6 y4 s: a! h5 s/ v#define M 8. Z, [+ _* C( F$ r9 e
struct monkey- J4 T  a1 A5 n3 B
{int number;
0 Q' M  l0 Q* P4 `6 ]& K# w1 q! Bint nextp;9 _/ [+ Q. B* Z( A; N
}link[M+1];& g4 v5 }! J5 F
6 b. m1 `7 j3 n9 |9 t  d! `8 F4 A
void main()8 h; N, p$ f, e, X, P' r
{int i,count,h;
: Z3 v$ N% D" y5 q& {0 ifor(i=1;i<=M;i++)
+ w# |, x9 e5 p0 w' `' H{  if(i==M)
+ H; J1 U, Q! Y  k( Y2 ]  i1 Z   link[i].nextp=1;' k  N; s1 N# p; S1 V; f- j
   else
" E/ h6 N9 G% x9 e   link[i].nextp=i+1;
0 D$ v  d" `: z* v- K& o  link[i].number=i;
: ]7 o) X. x  w) ~}
& d$ t0 U$ n  F' q6 ~printf("\n");
  _; D- a+ x4 x- Y2 kcount=0;% C5 q+ R; ^  S# I
h=M;% v4 ]" |. H" t5 Q; {( y) N, G
printf("依次退出的猴子: \n");8 ]7 n3 B1 M" f# z7 k1 E
while(count<M-1)
; u& ]  s% O$ C. P+ ]* a0 L{i=0;/ C; E6 I8 j3 e/ H5 f: B( K
while(i!=3)- i7 ]8 k7 ?" U8 _
{ h=link[h].nextp;, f3 A# c; q' C% F$ G& h& N
   if(link[h].number)
- e. E9 H7 ~; ~" n% @! t     i++;}
, ~( E$ z* W9 q0 l; k. b2 G9 m3 a; q9 q6 q2 Y8 q
printf("%4d",link[h].number);8 ]& E9 g' @; ^( z( l: F% u( F
link[h].number=0;- f) C' d1 ^" U( {5 u: Q
count++;" |+ @1 K, ?( U+ y
}# p0 s7 d0 S  U' _% _' ~7 ^
, S; B; M% m1 H! {7 D4 X
printf("\n大王是:");- n6 ~8 Z1 _- Y  |" r/ L
  for(i=1;i<=M;i++)
: \' z& H; {/ v& F  if(link[i].number)! Q' n8 s0 \& K, ?' ~1 m& I( d
    printf("%3d\n",link[i].number);
7 j! {5 ?+ B9 J7 R* ?# o3 e- ~9 ^9 b, ^# H6 K

, N% U: T% }3 X}
: `, a9 \! E- p' c8 S% Q# ?
第三种是普通方法for循环

, K. r3 J1 ?$ w) V4 K! `% B0 S+ t#include<stdio.h>" w8 P2 L% N7 A1 \3 n3 p' A, c  ?4 T
void main()
2 |2 p  T  R4 D+ B. [{ int i,k,m,n,num[50],q,*p;7 n3 o% T4 }# L- R
    clrscr();7 Z& Q7 G& S; x* Y9 m; G) X/ w/ F
   printf("input number of person: n=");
" B/ j" C: f$ P    scanf("%d",&n);. ~! _$ `% a! W0 ^5 O
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
- ^% Q8 Y0 Z9 w    scanf("%d",&q);, g' }: ~  P8 y; k
   p=num;! o$ A& r1 O8 N% ~% |
  for(i=0;i<n;i++)& O, D  M; @, ~
    *(p+i)=i+1;
* T% B' X' x- \3 o- d+ G   i=0;0 \- b& y9 w2 H$ `% f
   k=0;) ~  U, O) H% O! J
   m=0;: N$ P/ w  ^; i2 t
  while(m<n-1)6 Y& `/ S: g$ Q3 s5 l. `  G
   {if(*(p+i)!=0) k++;3 Y. z2 l3 [1 ?! ~2 X9 K. |% [
     if(k==q)
! ~& _' {3 A7 l6 w. u8 W/ V, `* j% h      { *(p+i)=0;
. `3 I  G& i: I        k=0;
9 D& S; ^' }6 M: e& f( Y+ a+ f) ?        m++;4 P- b$ O) h5 h/ R  D$ P5 {
      }
+ L/ T0 V. c# b# }    i++;
: {& d/ u, S1 J7 q0 y    if(i==n)i=0;
; P& y9 s8 }. F2 G   }+ B9 g1 v4 d- D' v5 z) w' C
  while(*p==0)p++;5 g/ e# z+ H5 m8 U
    printf("The last one is NO:%d\n",*p);! D( x3 g* ^( i( y" s
     getch();
7 ?; o8 w$ R, t* u1 X6 d( v/ ]0 v- H$ M2 \
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
0 y' ^9 [# Q+ ^, v, V: _namespace 又费马达又费电
1 D7 @  i9 {5 E7 {: D{
* Y1 E4 V/ A4 C: B. ~& L% R5 V    class Program
" s' W5 H9 c( a" F" c8 n9 N& P: N    {
2 b0 C2 t5 s, b: s+ F! u. D2 r        static void Main(string[] args)+ G0 J# G* S/ C, g
        {
% L! k6 K! Y4 y/ O            int m, n;
& z8 q. ~( X9 u, l            Console.WriteLine("请输入数组长度");7 J3 B) {& V# T+ X3 G! \4 a+ i" X
            m = int.Parse(Console.ReadLine());//m为数组的大小7 v0 j. `; y' n
            Console.WriteLine("请输入要截取数字的大小");
/ D$ f0 T# G0 s. W3 k# A            n = int.Parse(Console.ReadLine());
9 A' z( {4 @/ N5 h# \% q4 m* y9 v4 C            int [] numw=new int+ o& h2 i: ^) `* c/ j

  E) L0 I6 p" z/ @& x1 z- F&shy;&shy;&shy;;, |$ k. u8 m( H; x& ]
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数& W4 @& X. G" w/ Z% ]0 @
            {
6 o0 F5 r5 p5 {: V2 ?. w                numw[j - 1] = j;1 l+ P) A. E" Z" F' ?) g) F, d/ m
            }9 Q; ?+ c$ e. p: p9 g1 [
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
% v& M* l3 q! U% q; S            while (d != m - 1)! L) h0 _4 q& K8 w, @: k5 F
            {# r" a" J. ~) p$ ]9 @$ k
                if (i == m && d != m - 1)0 R3 O+ m$ A8 I. w8 y! o, G# O* e
                {6 o  h) g7 o+ U
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
7 ?- m" P) ~$ c1 B- o+ J) g                    continue;
! r3 ~" `7 [6 m8 n3 N6 v9 y, Q5 ~2 f( k                }% W* B& {- F( C% C: v$ ^  B, U/ B: L
                else
; _8 G1 Z: k( Z& W+ w. q  X9 |                {% k  S+ B6 g' c' T" J
                    if (numw[i] != 0)4 q- w) j" z# G* h# ~
                    {( l4 O' j8 J5 ?, c# G5 ?
                        i++;7 i2 B* V1 K8 D5 }! M2 d
                        k++;
: e: D; f' X5 y4 @- B! t& m' @2 Y                        if (k == n)
8 O' _3 V( ~2 O+ h. J. Z4 _                        {
; ?% C" t) y/ ^" l) K( E                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
, ?# W2 v; x* ~( B                            k = 0;1 x; y% t% ^* \2 y$ c
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小15 `: T$ i( B; ?! @$ P9 @
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
) c( b+ a& |# d; ^                        }
; [. b* b) z0 W7 o                        else//输出暂时还没有改变数组元素的值# D+ N* e4 B4 q! }7 M, ^# t. o
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);. P) ]' S2 K& D* |' w
                    }- _1 s1 B# x  E/ _* n
                    else; e0 V% d$ I9 ~! [! k* y
                        i++;//数组元素为0,直接跳过,不计数。。。8 T( `  @- {( Z! E" c
                }7 M8 r: j/ K9 @$ P) J/ h
  }# ~  f$ y% G1 P& H
0 C: |/ z/ C. h& s1 Z& {
            }//结束while循环
6 Y; {( V7 P- u, v2 d% V            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦$ i3 Q! N# d# t& k" `$ M  ]
           ) d3 k9 x6 _, `% d3 h
                if (numw[i] != 0)6 V3 f$ U7 [; X% E
                    Console.WriteLine(numw[i]);
% z) M5 V- l* \% Q, ~1 _           
  A6 h; o! H# r" y4 W8 ]6 h            Console.ReadLine();; I) a0 j# M: B7 ~2 ^+ o7 R
        }
& A+ ]/ P+ S; j# X/ S1 O& P+ a    }5 |# u& E/ z8 \$ M) `% n7 d4 n+ M0 a
}! S5 T& P4 a4 b8 ^
小甲鱼最新课程 -> 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-7-18 03:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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