鱼C论坛

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

猴子问题

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

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

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

x
大家好!
. W2 u* O/ x: J/ U这几天我在忙着编一个问题,我用了一种方法编出来!4 Y, o) J+ I$ k1 w
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!. ?) n: Q+ A: d1 r7 X
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
( ~' b# D' r3 a6 d) ~) |4 {7 N! {! l* V$ E% }2 A
; g9 h7 m  s. o2 I: V
                            题目
* o: ]% _  G. m山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
1 _1 r% j! _9 \- f9 v2 K第一种方法:利用循环链表
5 X4 V$ n) m% K  y6 C#include<stdio.h>
3 S) ]$ d  c  B# S, a1 W# R0 l#include<malloc.h>
& s, n+ A; x0 t. X9 t) v#define M 8            //共有8只猴子
) L% c: H( _# {6 l  u8 i#define N 3            //数到3只时退出第三只" g- j# r6 p# ~- u, B2 O& w; z
typedef struct monkey
) D! p; u9 ^# `0 \9 V{int number;
1 M' f1 S) B8 W4 Z8 h0 Q1 ]7 \int flag;) a! v, l' D  G; }
struct monkey* next;
( @" J- L4 O$ O4 L; k4 t% v" R}MONKEY;3 N/ n9 x, X$ v7 u
main()
! V# z6 ]* y; J{ MONKEY *head=NULL,*p,*s;
: l. T$ |0 j+ L$ \" I0 r) b0 `5 l  int i,sum=0,count=0;
" H- b* d1 |* t" h: K  t2 O- j4 ?  clrscr();              //清屏
( \( W8 _. o7 L& G; E  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存' Y9 H0 ]' W* f' @( W/ ?9 b3 q
  p->number=1;p->flag=1;( C$ p! n; a% g+ r( q) S7 W  S
  p->next=head;
3 X* Z1 }4 q9 ~6 L! Q7 v  head=p;5 b9 t( l; U- ]* i/ j
  for(i=2;i<=M;i++)
" `" x6 R8 D( \2 Q    { s=(MONKEY *)malloc(sizeof(MONKEY));2 w, B4 ?! _2 ~( N% J
     s->number=i;s->flag=1;, ]8 _" d1 t1 i
     s->next=head;
- Q( y' o2 a/ U9 h8 v     p->next=s;p=p->next;: P) X. X4 B; g* p0 m0 S% A7 C% ?, h( j
    }4 H: ~7 r  X2 w; v$ d, _5 U' Q% T
    p=head;
' A* u' [3 b3 c- @   for(;;)
# Q8 r& x- c0 H1 @5 l% D1 R    {if(p->flag==1)
* W& S" z) z( o+ F( o* M. L: v       count++;
& ~! I- V, `9 H' U* K& D     if(count==N). i9 q# b' p; Y
        {p->flag=0;
" q4 e) F" L' r. [6 n& i" P* w  [         count=0;/ W8 v9 K) ~# w* H
         sum++;}# L$ C: H+ V! t- Q3 O+ r/ K
     if(sum==M-1)
- ?% g% x% f& G# h        break;% b5 C0 f! p) L8 \
     p=p->next;
, r& i5 f9 [1 n) c3 P    }7 [% `# E  }2 X% {
    p=
, L$ `+ `( r. c, `    head;
* M" U7 d, p1 h5 u/ N    for(i=1;i<=M;i++)
3 R1 X- o$ A+ U( B+ L    { if(p->flag==1)
. K1 o/ c. j0 s        printf("\t%d",p->number);9 h) @! q$ j+ A9 A4 K/ ?8 u
      p=p->next;- O: z1 t) H, W
    }
& K! r! [6 O5 g% S: k6 Z  ^, S, ~4 |% O! y* h
+ L! e8 i7 a* h* ]% O6 {
. b. i2 Y* l* l& y+ P+ p
}

6 f9 z. U* x  n# j# b5 d$ J第二种方法:数组1 H5 l9 [% S1 I
#include<stdio.h>5 m+ }( O. d& y3 Z: E6 Q
#define M 8
2 R) S$ z$ ]9 k4 Hstruct monkey
* T- E) p4 U5 A6 w. t  l, L{int number;
- n/ L8 I5 }3 @- K' e! V1 W# Wint nextp;
9 g2 ~, ]  H5 ^4 k) Z% ^: s0 e}link[M+1];
' G; ]* \  B* q  S* G* ^5 ~6 k9 L; G% f1 {
void main()
3 q; x+ X& d$ H3 C0 g0 S# N9 u{int i,count,h;
9 b1 w" Y' A: S3 h, \" H$ Yfor(i=1;i<=M;i++)
4 J0 P4 z/ j: Z- e! _{  if(i==M)
6 `- m2 x. Q5 ^   link[i].nextp=1;! p% c: i4 S! [3 U( z& ]$ N
   else
+ E* ^5 P: P4 j( I% N   link[i].nextp=i+1;0 [) k" z$ q7 S6 |# L) @; r
  link[i].number=i;- U6 C9 t* S/ I; x* {
}" s% T7 r/ |8 y; J  H& M
printf("\n");
0 Q2 k& K/ w1 Acount=0;
0 i2 j6 W0 r. ]* w" dh=M;9 x- ?2 z7 a1 H! Y
printf("依次退出的猴子: \n");2 s/ s, _! X+ G5 k$ X# l- I* T9 Y$ `
while(count<M-1)
7 H4 ^/ e+ I% a. l) p2 I6 p{i=0;
& F- P5 |: M( B: }4 mwhile(i!=3). W$ H( z' Q, K. p( F
{ h=link[h].nextp;
, X6 A3 a! l- M   if(link[h].number)
$ d: y( x- i+ n0 U1 g9 p8 M) H% B     i++;}- D7 ?6 \) i/ ^- G1 e, F4 d

0 Z" M: P% a8 s8 f6 `printf("%4d",link[h].number);% d! S+ r+ c6 I$ v/ P$ ~2 q
link[h].number=0;
* }4 S) R, Q; Kcount++;
1 d/ u) @) Y$ P2 v1 Y}
0 \4 D* O/ K/ S8 t" s. }
8 G; q- W4 H0 w8 Vprintf("\n大王是:");
1 N, d$ Q9 ]% Y1 W* y* F  for(i=1;i<=M;i++)0 ~9 B2 R. \! |" h6 a
  if(link[i].number)
# h: o3 S6 T9 i1 C* q    printf("%3d\n",link[i].number);
" b% G; R/ g! v4 U5 D6 G# y7 F0 O, J  E4 I9 u, _! J3 ^& u
# d6 T2 z7 \3 @3 l4 N1 k- U
}
* ]; J  ^( a# X: J9 U/ J: b
第三种是普通方法for循环

# U  n% `3 D3 ]5 D/ [4 N: c#include<stdio.h>: Z: x1 Q# o- m2 k
void main()
4 C0 P$ V, `4 J) R, N" s4 B' e{ int i,k,m,n,num[50],q,*p;
3 A2 i5 s9 g9 B0 v$ J2 n- u    clrscr();
, S' _  p3 z' h+ W& x! F   printf("input number of person: n=");) V6 d$ R! o* f
    scanf("%d",&n);
  I! i7 H3 g! U  f3 k6 G4 x: i! x$ eprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
: t" ^% A5 d. w! J- d* x) y    scanf("%d",&q);3 w% B0 j: ^1 [/ `7 P
   p=num;! `  x; X" {0 Q0 J3 O- H% G( h
  for(i=0;i<n;i++)8 L" R7 P. J! C* y+ u
    *(p+i)=i+1;
) T1 I5 q8 E# [   i=0;& c" R0 N9 B2 a2 x  B$ Y
   k=0;
/ n+ ^4 L6 l# c! B   m=0;
/ }/ d: \2 i  y/ j  while(m<n-1)
4 t( y: \0 H, b+ R' ~! y8 \   {if(*(p+i)!=0) k++;
/ P$ |: D6 k6 F0 K/ Y     if(k==q)' {" v, U/ `# Z3 V* `0 p. T
      { *(p+i)=0;/ j! G% B% Z' P; c8 V
        k=0;
% m3 m1 A2 f1 Z( u- x        m++;7 M& ?- s& W. d! t
      }
) c' t, ^3 Z5 T4 m5 I0 X    i++;
  \& u5 J' T' Y+ {    if(i==n)i=0;/ {! f1 f" u, X
   }
/ k; n, L4 B' I5 N* `+ s  while(*p==0)p++;
% ?& T. ]* g/ ~) F$ I    printf("The last one is NO:%d\n",*p);
' I+ {* }) ^7 b3 z% {: d     getch();2 x! _- y$ y6 @# i+ O8 \/ D- j+ {. t

! L% D0 [! `% Y1 P1 N" u}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
3 \; c; @: C  Y% ]$ ~3 }! nnamespace 又费马达又费电+ U; w. i/ Q+ }
{
2 w6 b: v) C' f$ i9 c0 W2 O4 ^4 a    class Program
+ ~" O  U$ t) w" ~2 \1 V    {
9 b. S( m: o# ?7 u( |- A2 x- g        static void Main(string[] args)! R  L: V4 M6 q0 d, ~# u
        {
+ `4 @6 Q/ `$ x/ K4 {4 i1 H            int m, n;
1 v3 l- M0 x8 ^- }5 Y            Console.WriteLine("请输入数组长度");
! ]9 V, A. q/ H' G  P4 P            m = int.Parse(Console.ReadLine());//m为数组的大小" P' h3 J4 a) x7 B+ B1 K8 ~
            Console.WriteLine("请输入要截取数字的大小");
# ^" P- w7 S: H5 u3 F4 |1 C            n = int.Parse(Console.ReadLine());
( @3 c' a0 f' ^            int [] numw=new int
; O, x, M, T$ S* b
( h$ a  {- r  ^# s2 H6 J2 q&shy;&shy;&shy;;
) v7 z1 Y4 ]8 e            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数- H/ `* i4 z" |! |8 b, p, O
            {4 q, h/ C3 P( K" `5 g
                numw[j - 1] = j;
1 c' ?) ~) t4 y2 F  r1 X) W6 T            }
, W) J0 y) L; u+ ?" p            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
) Q5 ]& x; Z8 u0 L% E/ ?. v/ x            while (d != m - 1)
* f: A* {: k8 M1 m4 x            {. F  T, b& \5 f+ ]
                if (i == m && d != m - 1)
: Q. b! H$ `8 H, Q! X                {
( s6 e5 y" i+ l6 ]+ g1 t- x5 v                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!0 T( u! |: h' i" _+ ]
                    continue;: T/ t, @5 D. ?
                }
* j3 ?* z2 f1 D  J                else/ w6 u4 f. O1 J& x0 `& f& B: P
                {
' A: U7 T0 K+ P" S7 y' C  e! ~                    if (numw[i] != 0)
' W) X; P7 r1 W3 l                    {
" I1 M% T% n& v( f0 P! \! x' W! a8 r                        i++;+ \3 Z2 ^) H: d! v
                        k++;
* t. s+ u+ W9 ]* g, f- i/ n                        if (k == n)5 X7 F; k% A0 K, t9 h
                        {  D* C7 `. R9 j5 F& G( u) V
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了4 b1 ~4 p; R+ j1 s' P  A
                            k = 0;" p2 c1 [, _; M, {$ X
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1, u- B5 c8 p' a( y  S
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
$ ~+ X& P/ Y& e8 i8 x' [1 X! ^                        }
5 ?6 G3 a% X/ Z$ e, `4 ?8 A9 v/ s2 x                        else//输出暂时还没有改变数组元素的值. I1 n4 r' U  n3 m7 n2 I
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);+ I. ]5 t) u, |# o1 z
                    }
" {( W2 c- r" W- M8 ?) O$ o8 k                    else& [, O  [3 Z( M5 d; S- H0 ^+ j6 p" _. E
                        i++;//数组元素为0,直接跳过,不计数。。。
7 F; \% Q: `9 i2 y# L$ I' ^                }0 e: T0 Y2 @! N$ B% ]( V

" _6 B5 F7 n+ X6 D: w% x# e; h8 u
0 `8 B0 c% W$ p+ x            }//结束while循环
* c. y5 o5 ~) E5 [5 s            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦( L1 @0 c0 F0 c% K: ^
           $ B: P4 V. ^, l( V
                if (numw[i] != 0)
% R) |; n* x: M1 h. [& j                    Console.WriteLine(numw[i]);6 b! e! d, ~; ^
           , `! N2 W( J% y, M
            Console.ReadLine();
4 h$ s5 G, m; x# r        }
7 h' [! P2 B  \  Y& K$ U# W, Z    }
+ [" q. @2 ?) ~, v}9 l- S: C/ l9 {
小甲鱼最新课程 -> 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-11 06:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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