鱼C论坛

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

猴子问题

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

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

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

x
大家好!/ x5 _) v9 c! x
这几天我在忙着编一个问题,我用了一种方法编出来!* `! Y/ w& O' H0 E
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
- M! k1 L0 G, @6 D8 Q3 \3 s注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 % u. h4 x6 W, l3 a, b
6 t7 d4 k) D& r# g
9 F; ]/ N7 K2 o7 P" m
                            题目
; l/ q7 A, X+ A) r: M: W山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
3 \2 f# z5 ]; k# M! b  L1 r: K1 b第一种方法:利用循环链表
& M+ q) s) T; k; K* T#include<stdio.h>
0 s" f- D$ M) d- j  f) Y) v4 o# I#include<malloc.h>
! `: N! O4 n: q1 z! ~#define M 8            //共有8只猴子1 e! \8 J# t: d5 W# B& a4 e$ E' G
#define N 3            //数到3只时退出第三只. i  I3 o) ~+ L- d& ^# W# ~
typedef struct monkey. G% g8 ]% ?, r. V% b2 b7 Q
{int number;
0 G+ z( s( r, z% |int flag;: o0 e: E3 }$ u# Z
struct monkey* next;; x& e! m' D9 I# {# _, \
}MONKEY;4 k, x1 x6 v" P$ Q+ _
main()
" @# N! m; Q: Q. e9 c{ MONKEY *head=NULL,*p,*s;
% y9 Q; G/ G9 X  int i,sum=0,count=0;$ v) Y) e. R1 z: o' M+ d
  clrscr();              //清屏2 @0 _8 O- q& g$ Y7 U
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存  Y6 a8 d2 w0 a: s5 B
  p->number=1;p->flag=1;& N" U, I8 y- R' B
  p->next=head;
' T3 E# A+ ^) j2 ~  head=p;$ L6 W, g1 e3 Z5 W3 l7 H
  for(i=2;i<=M;i++)
' h# F: B( z1 _( k0 y, i7 g    { s=(MONKEY *)malloc(sizeof(MONKEY));  x$ R6 i' x" h) t# A% \
     s->number=i;s->flag=1;
. d% ]' l1 n4 c: n, r3 \     s->next=head;9 s2 O3 m$ T% u9 B
     p->next=s;p=p->next;
( D, {6 L3 ], c2 w    }& a3 F1 b* ^. Y- X3 D: V" I
    p=head;
: v  v% h4 |! h   for(;;)
4 @1 j: b* V! }  U    {if(p->flag==1). V, S( A! l5 ~2 K+ Z' c$ w
       count++;: r; k; P6 \  k$ D( k2 J2 y6 F; ~
     if(count==N); j. m# l2 r5 P3 p
        {p->flag=0;
: K, F9 b" L  y/ z7 T9 N& D8 ]1 `         count=0;
1 S. v. i7 r( S# @, M  k         sum++;}
' X" p2 x; b$ B' y     if(sum==M-1)
4 D3 H* E) l3 q. @# Y* z        break;
2 S+ J$ A, b7 q     p=p->next;
% X( }) e5 S: ?    }
0 o: O2 }" `0 L1 w5 {$ |2 I' T: }1 N    p=
) y1 X8 C* `4 b# O: U. \5 N    head;
% t* X2 ^! ^- f! [    for(i=1;i<=M;i++)1 u& C) d& s. T& ]$ ^5 A4 K& ^
    { if(p->flag==1)
6 |1 l7 k. e% ^7 G. z' E- p9 p) B" f9 b        printf("\t%d",p->number);
/ `1 p- r$ O& R, ^3 D7 M. q# b      p=p->next;+ R, A; `9 Q& W  U- s% Y+ L! c# N7 |
    }
5 s0 h7 V5 i  a9 O' B5 }
' I2 n5 \5 J  j. H4 q: N+ l+ D" H/ }' A) T$ e. I

6 _" t6 E! H* d* d0 e}
$ ^1 B8 t1 k' A
第二种方法:数组( W6 e/ o+ v  i, t5 o! m4 b& Y6 a' ?
#include<stdio.h>
) |# s: s2 H( C6 \5 P#define M 8
+ @- I& v  \# X, C) T$ ~4 k2 |  Ostruct monkey1 q0 w# K! B$ e
{int number;* V/ V& K* c& n/ X* F  `% f
int nextp;' G; a3 I" T9 l; G9 x
}link[M+1];
- c$ o- n7 c6 q( V
& p: d- A1 ~1 X8 tvoid main()
& b+ E( C# E% @; M{int i,count,h;: _" C% \; o# h9 k
for(i=1;i<=M;i++)3 I5 R. M0 `9 C: H$ L
{  if(i==M)' A) k2 w  o' y$ w8 `
   link[i].nextp=1;
* c6 ~! I, P# T. L   else
( }2 N, {8 t7 Z4 {! }   link[i].nextp=i+1;
/ B; `# z6 t/ c  link[i].number=i;( h3 h4 T9 k2 w! ~- h: ~
}
; D2 ~; K3 |0 P/ fprintf("\n");
9 `2 w) _7 ^8 r2 p6 ccount=0;
6 v* i( d( B5 W' L# w# Gh=M;8 }) i1 e1 ^" L6 }$ h* l
printf("依次退出的猴子: \n");  ^5 g* I3 B* ~# P
while(count<M-1)' Q2 L7 u1 ~0 Y- B9 q1 E' H1 {
{i=0;5 H/ H. L3 P0 F
while(i!=3)6 }$ q* X% A2 P; t5 T" s6 Q7 A, M
{ h=link[h].nextp;% ?/ {3 W, k' h9 Y$ p* u& w. i
   if(link[h].number)
5 w- Y6 p+ d. e" |8 i     i++;}
% z$ B# [& W. }' U" m0 D. p" _$ Y5 [& K# L5 }/ h& a
printf("%4d",link[h].number);. h+ X9 s  T% V$ a
link[h].number=0;
5 e3 \7 P! R8 k) }# K8 [* l) Ucount++;/ t1 ?% P' O4 H6 E
}  D, S9 O$ N! |* C

% g4 \5 N5 Z1 y! J7 B' Nprintf("\n大王是:");
+ V9 `6 {1 d$ ~4 s  U% N, s1 D  for(i=1;i<=M;i++)
  ?( {$ A% x6 _1 l& W& t' T$ H, j  if(link[i].number)
/ y. n1 X7 s  w! x4 S  B1 M9 C    printf("%3d\n",link[i].number);- U, `1 o+ F2 e8 b5 l4 Y
/ g9 d+ \) F4 q

4 k6 p4 Z$ f5 G) O( D2 r}

$ P3 F# Y  U* Y1 t3 G+ g第三种是普通方法for循环
6 V# Z% ^5 c: d- w
#include<stdio.h>
# H; f. q- x8 B9 u3 \; Jvoid main()  t* H1 }  z- ?5 C8 @
{ int i,k,m,n,num[50],q,*p;
& M7 M% n* g% B/ U    clrscr();
( V$ p* f3 l8 D( E+ p" p   printf("input number of person: n=");
+ r$ n9 I0 M' N. M" W: g7 N    scanf("%d",&n);2 g- p* `8 d  X& [9 z$ q( y
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
- o0 t' c% @! P$ Q% C: x, a% k    scanf("%d",&q);! k# e/ a5 O0 C, e
   p=num;
, d) m! ]8 I  ]; w( H: d1 f  for(i=0;i<n;i++)
- o; R3 _) z" }" Z    *(p+i)=i+1;
2 U5 m, v  ^  X2 n) u   i=0;
: A/ i" V8 ^1 {- s$ O   k=0;
+ H5 K. @; w+ E/ M5 V   m=0;
; d+ ^* [! y* r1 F  while(m<n-1)0 h  t2 D2 m8 }
   {if(*(p+i)!=0) k++;
$ I; b; A" v9 p2 x' a     if(k==q)
4 @4 o( T5 e$ F  I8 S' @      { *(p+i)=0;
9 q/ L0 t+ f% N! W: x        k=0;# p9 K" _8 X! Q. \5 t
        m++;
, T+ L) \2 M6 z2 I1 E8 m      }
! Z5 X7 R/ b( n) F: L    i++;
$ ^4 {; j4 Q, ^    if(i==n)i=0;
% P8 ~* f  n3 J0 `/ Q: F, W   }
; @! J' K( j5 b1 C! M* J& [  while(*p==0)p++;
" A3 l9 i5 Z+ B( z: c3 \$ k7 C    printf("The last one is NO:%d\n",*p);
. y1 a" C' H5 j2 `0 e# c5 N& Z     getch();' u. R1 x/ D7 u* _1 {: B

" o0 e' [  m  I* p0 o( X+ q) r}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
* F! |& `8 U" e. m4 W+ @# enamespace 又费马达又费电
) E/ ?. Z5 m% G% f- v# e2 T{1 X3 \# e1 ^3 \9 b
    class Program3 B9 \- y' P! ^% V  n
    {2 A" R' w+ o  B
        static void Main(string[] args). ^( _4 L: w0 s. [: \: l( L
        {
7 ~4 i/ \) u. y9 B9 z! p+ {            int m, n;
% V2 O- s  G* e2 H1 J            Console.WriteLine("请输入数组长度");2 @: L& d( T( y3 f  D6 z4 N
            m = int.Parse(Console.ReadLine());//m为数组的大小& k$ F2 N, s, J" `
            Console.WriteLine("请输入要截取数字的大小");
2 _% E( p% [& V1 u5 R: P            n = int.Parse(Console.ReadLine());
5 x. A! i/ p+ K            int [] numw=new int' e' m5 Y4 Z6 t& y+ g7 d

3 C) _5 ^& {, [! ^- L&shy;&shy;&shy;;
% Q0 X7 D4 y& \+ V# J7 w" P* s( o8 v/ Q            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数/ W5 S  V+ a6 F( z
            {# r8 J% C) }9 q( b: Y
                numw[j - 1] = j;2 }3 M' y, I3 _; h6 m
            }  U1 o# {) A- Z+ G5 D0 \9 r7 Z
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!/ `4 T( c- k5 R! ~
            while (d != m - 1)
. n( [& [0 j$ s9 _4 z/ |, C% Y            {. u, `! E( D5 U" G
                if (i == m && d != m - 1). ^( H3 {9 c+ U7 J. P- s
                {
' i8 }$ r7 W6 W2 ~+ ~; I# h                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!7 C0 p# ]" ?% _# o" x9 K
                    continue;. I9 ~$ m5 j1 ~
                }
: x0 B7 _" V' G2 F                else
8 K3 E6 g0 k9 k( h) c; ]9 |                {
( t& A7 Y" {3 M5 N8 i                    if (numw[i] != 0)! T! Y8 m; X# h
                    {7 Z+ @! C2 p1 ^
                        i++;" s* M  f6 |8 X6 i( K( ]4 S/ v7 F5 ?
                        k++;
$ h$ d  Z5 v+ [1 k4 N1 p                        if (k == n)5 f8 M$ i# Y+ g+ m
                        {) {; S1 G% b  |" l' Z" x0 r: e  H- Q
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了- x  |/ T- n+ I- U
                            k = 0;% U) L6 O) ^% o, y
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1: O: ]2 j) m& x* |- v% n( Z3 Q8 \
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
1 y5 I& V! o, _                        }+ H# F' c9 w# y7 \/ V, a( Q# g$ F
                        else//输出暂时还没有改变数组元素的值
1 H/ F' I% s( @. {% l; a% r6 K                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);/ u: x* \$ `) ]
                    }* \. }, L4 E. q
                    else5 N! t8 F  y' y2 g* F  r  k1 a/ L
                        i++;//数组元素为0,直接跳过,不计数。。。
* B3 t2 H# ]! I* f! \1 J                }
# K( ?( V( @- D7 f1 F1 ?
6 c% V) J3 q' e7 q9 [6 q
: q: _9 ^  {+ K* K+ l            }//结束while循环2 \7 F! b7 k1 j0 t8 U' X
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
# S4 p8 J; s3 k0 s7 ?" P           
7 f7 m' W" }; p                if (numw[i] != 0)" e& f- V6 \" `- }* y! P7 I
                    Console.WriteLine(numw[i]);
( F) @8 k8 z$ s# S" H2 u0 k; o           9 L& S4 {1 d. P3 {7 h+ y6 U: p
            Console.ReadLine();& L9 n$ M+ V* V3 R) ]2 Q! d/ l
        }8 ~# S! P( V( M/ A! s$ b' S
    }
( b" ^& r8 F. |4 `6 n1 ]}! P/ i* {6 {( `! O6 }
小甲鱼最新课程 -> 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-13 22:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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