鱼C论坛

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

猴子问题

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

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

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

x
大家好!* p% [9 \+ l' s
这几天我在忙着编一个问题,我用了一种方法编出来!! Q- p7 \  i1 }, ^- A% Z4 s
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
- q0 @, n; X2 |$ g; r注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 9 a# H1 l; p, b# s6 \5 E$ ]
5 x8 Y4 n& P  }* p  P$ `( P
& I, X0 w7 x9 b1 D4 p! h/ O0 G
                            题目
3 b4 z3 S: j! t- z  H  }3 \山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。8 ~7 e% m, n* F0 w: L
第一种方法:利用循环链表9 z0 t+ `1 u# I) P$ X( N, i- q, e
#include<stdio.h>$ A2 V/ s0 [8 X6 H1 z0 I
#include<malloc.h># H1 F; q1 y! X
#define M 8            //共有8只猴子
5 a  O4 @; @* f8 B3 Q) n#define N 3            //数到3只时退出第三只
% Y) ^  I3 s) S" O% V0 r, Ltypedef struct monkey
. w1 \8 G; b; S; i$ D4 c{int number;% j0 f" x. z8 }2 i' G
int flag;
1 J* s9 ~6 J% Y# o" c6 `struct monkey* next;( B2 n& c& J* A6 P. F' k6 |
}MONKEY;
* T2 `; u: k1 {" b) }, Lmain()2 I) l; v0 E, X$ t, j% G) Y
{ MONKEY *head=NULL,*p,*s;
, D! E  I4 z  O4 k8 a: z5 D  int i,sum=0,count=0;
& A2 ]" p7 d0 g7 r' W  clrscr();              //清屏
  p5 Q  a9 y/ d% D7 c. v  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
- v6 Q- r! h2 B, q# W8 {  p->number=1;p->flag=1;
+ l8 Q* e; M' G  p->next=head;
# d* @0 `7 v+ S# M! k  head=p;0 A3 Y3 s( x$ \% A* m, p/ D
  for(i=2;i<=M;i++)
/ [5 e0 r( q7 P1 \" c$ t    { s=(MONKEY *)malloc(sizeof(MONKEY));
3 r1 T% n! H5 ]; O; Y     s->number=i;s->flag=1;$ i6 G/ J5 l' S2 W% C
     s->next=head;0 E) T4 K/ Q) t: E$ S- o% q9 v* v
     p->next=s;p=p->next;
3 u, c  A3 L" |& e8 ~! E7 g    }9 I# p4 Q: @* |# }5 Y. k0 A# m# }
    p=head;
3 {* b2 U/ O5 U( \2 ^7 |   for(;;)
" d% d7 A1 ^% I8 G. O    {if(p->flag==1)
3 G. L; Q! [$ a' o. p" j       count++;$ O5 k" B) k! X* u- h, J0 l# j6 J
     if(count==N)4 X% X. _6 w; ~% R1 S) o9 l
        {p->flag=0;) F* T6 K3 u, o  v
         count=0;
# ^  H" T3 K3 `8 K5 k- Q4 p# B. Z         sum++;}
( e! u& F0 g  ], S. |* O. c2 E  @     if(sum==M-1)4 i  J( k- A/ f; r, c3 [
        break;( w; \% b) W2 `8 {4 r( v
     p=p->next;
2 a( L- V- D& }3 O    }/ q! A/ Z" l# \9 X  U( r) p
    p=* z. a" _/ v% Y3 F% t2 V
    head;
& ]) d' D  I- x7 i, q! h: w# N    for(i=1;i<=M;i++)5 S9 T1 u/ v' u( C0 t
    { if(p->flag==1)
3 f1 T2 U, S0 ?) k* q        printf("\t%d",p->number);
; }& D6 P  d: J! C, h* f- B- M      p=p->next;8 u. e( c; Y% t' s
    }/ U4 V; h* t4 e  V- Z

" P4 B0 K0 w8 @' F" }4 q8 G- U0 O3 Q1 w( `7 `

1 I* z  ]0 z, V: Q}
! ^/ k6 V# C. f
第二种方法:数组
! n$ u3 h- i3 A7 A2 x, N, ?" j+ e#include<stdio.h>2 D4 j6 J5 l( v
#define M 8; r% \6 D/ I2 S1 s) h& z) f* n
struct monkey
, [$ {: W4 S( V{int number;+ h) X- j  K8 m7 L
int nextp;1 P8 O; @- s) {; b% I7 t, V
}link[M+1];
4 ?) D4 K5 g3 S3 @& \2 K8 Y
2 |$ e7 _& @3 |* q  z% D1 D+ E0 rvoid main()
  u: N3 }. n/ i4 `0 F+ J$ A! k{int i,count,h;
7 V" ]- u9 C( U! A; e$ [8 ffor(i=1;i<=M;i++)
" ?9 ^  {2 g. ]7 c$ }$ Y$ h{  if(i==M)" j; W, x" F) v/ [6 d1 s7 a
   link[i].nextp=1;
( g4 K2 i* H( f3 i+ W+ A7 `! ^   else
: H* p2 z) y* f$ R, r   link[i].nextp=i+1;5 J- i! I+ x0 [4 F+ \3 ~' K
  link[i].number=i;8 N0 s; [1 s. Y) Y
}
8 r( r' [1 V4 O- e/ _printf("\n");  A# a) R. G) w: f2 i( A
count=0;
' L+ j$ r0 E. i* d1 `h=M;) z( V0 D/ t0 i9 S; N
printf("依次退出的猴子: \n");0 G  [1 ^/ ]1 o6 E
while(count<M-1)
# [( r0 h+ C: c" A  a{i=0;
" P; _5 @1 V1 m, u( Owhile(i!=3)
) w3 @5 O$ B7 o% m{ h=link[h].nextp;) e" `# o# c6 [! z4 f
   if(link[h].number)
- E. S5 v/ T+ T7 X; q/ A$ N6 {2 R     i++;}
8 A' a  A6 s/ k8 ~; h! K* X* `+ y* N: G' S
printf("%4d",link[h].number);
6 G& L1 X) A8 X4 J; b- P! j7 W# klink[h].number=0;3 \5 `0 J3 q0 ]) L0 I8 A
count++;. {& z" J8 ~8 s/ v* c  S/ g' L5 ?/ E! e
}
# s/ L  ^4 J' n  u# [+ p- R8 o7 v
) n$ S- u6 l* W- e5 i- Bprintf("\n大王是:");
8 T2 S7 X. K6 C9 O1 [6 }5 e  for(i=1;i<=M;i++)
+ \( V0 X4 p  J! N* h- A- Y# z, M  if(link[i].number)
3 V% {7 U! W% |    printf("%3d\n",link[i].number);' T. _" y2 q+ H. C4 D5 `
# P% h! D5 q  i1 z! Q* H
7 g  {+ E9 i( X9 Z2 ?
}
" n2 U# @, a- H% J- B0 J" M; _
第三种是普通方法for循环
# d7 r% }( q4 V# n) }
#include<stdio.h>! k0 D+ ]6 l" p5 c2 g/ P- s" }: Y  Z
void main()
1 u# Z3 n0 O5 e: H{ int i,k,m,n,num[50],q,*p;. i8 f2 n6 ^3 N1 w3 m
    clrscr();$ N- {& r" X# ~6 |3 q
   printf("input number of person: n=");
7 p; y! x8 C; c( d5 s    scanf("%d",&n);2 E5 k% m  T4 W
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
; [7 w, S) f# c  u/ X    scanf("%d",&q);' H- P  e2 P9 D4 m) i, [: A
   p=num;# L: ]* h" h; x( D# }
  for(i=0;i<n;i++)
) U( ]) M& I1 G! [6 K! K. F' x    *(p+i)=i+1;
* h. U# A$ b9 n3 D   i=0;1 Q9 A* e& ~: o4 Y" b- S
   k=0;
# a( m2 L- |1 @! V: y2 c0 {   m=0;
. r" l  n) h0 ~* }* Q  while(m<n-1)" {+ b5 k4 ]2 ~* o9 Q0 r1 M
   {if(*(p+i)!=0) k++;+ J" s1 ?8 O  P. P( Y
     if(k==q)6 `0 k/ n0 N5 u6 s( x
      { *(p+i)=0;
2 E, L+ u* a. m9 l, w        k=0;) O1 a. G7 ~3 ?0 y
        m++;
5 a# M' a. P( ?6 z; }/ L      }
3 L8 G0 X& L( D( ~4 t/ T    i++;
. B3 h* k: p+ b5 i1 B    if(i==n)i=0;
0 b7 W2 }+ A5 R8 `4 l3 G8 L   }/ k5 b' X  P( t. @( C- v! w
  while(*p==0)p++;! S/ v1 f9 ]7 \+ x8 ?( b, m
    printf("The last one is NO:%d\n",*p);/ ?1 k0 R" C$ ~& G
     getch();
* D' E" r+ W) R. \: X6 x1 o8 N
% V+ S0 \2 r) }" h# u}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;- [2 M8 E  I, R0 o
namespace 又费马达又费电7 ]) W3 s4 g! N, \9 f
{
2 k+ f2 Z8 ^1 R% g  y6 e$ ]: X    class Program
" G) h1 D& `# c4 z    {
! f& f9 l, B& ?. f1 p        static void Main(string[] args)
! N7 C8 R& U% B! v8 S& t  s% N        {
  ~& u0 ]! @0 m% C            int m, n;7 g$ [6 q) [# J7 M
            Console.WriteLine("请输入数组长度");
  j/ s: w4 D/ j" L! \" M            m = int.Parse(Console.ReadLine());//m为数组的大小' F. j* N7 [. U" V4 A
            Console.WriteLine("请输入要截取数字的大小");
" a+ r& ]" h* n1 H) g$ E' X+ u            n = int.Parse(Console.ReadLine());, u! x: d" J' }& Q2 ^
            int [] numw=new int4 H( ]$ A5 @9 ]; @! Y# R7 H, W; b

: n6 q  i& w5 E. k9 P: }&shy;&shy;&shy;;
/ @, B0 ]: S0 w3 p            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
9 }  l5 j- C% `& O0 Y/ _) I            {9 d, k* P! u% K# U
                numw[j - 1] = j;
0 G; P! p& C. V            }7 T- G: k* {" v* _- l
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!7 @7 `; F7 u) L9 M, _" v# ]
            while (d != m - 1)9 M' H( W5 U- W  l" W7 q( F' s& p
            {1 G- [* h) ^& N! P& o
                if (i == m && d != m - 1)0 T2 r$ k) V4 `& v- p
                {" f0 I4 r' V) m' P- i
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
3 |. o2 i! g7 t# }' ?+ h8 q                    continue;
2 s* g7 Q+ r8 H                }
8 R, ]2 Q$ o) i3 h' Q0 C                else3 p5 d" P* y& p& p
                {
0 u) `+ X; m) p9 c1 ^- p                    if (numw[i] != 0)3 v; n) N7 k1 i  t1 H, W* A3 E9 A! ~
                    {! t4 D" a5 G: d
                        i++;
+ Q  {0 b  A4 X" L- Y7 F                        k++;
0 Z9 ~( a+ A4 B2 h% e8 T" e: @                        if (k == n); v& n) o. Q3 I0 z, u8 M4 M5 v
                        {% S6 i2 K) j- e; m) I7 X
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了5 v9 ^1 B" y5 C6 N$ A
                            k = 0;
" `) P  [' c+ o' `% K              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
: V8 Z" L$ t7 N" P/ W) V/ ]                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
# t5 x, H1 p8 F, y+ s  J5 L4 N! Y- G                        }) s- |% c# i) x! b- e
                        else//输出暂时还没有改变数组元素的值
/ ?7 r4 r; z" O' x. M                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
0 p" _4 ^2 p, W7 z4 s& m  R                    }
/ E9 ]" |; r* S) N4 y                    else6 E0 R' _$ p3 H0 A
                        i++;//数组元素为0,直接跳过,不计数。。。$ ^8 a- g% o7 K  D5 V& @
                }  p7 K1 c/ \0 A6 [/ Q0 B

8 t; D+ R5 j3 M+ \1 C/ U
4 L: V! x& v5 c5 H$ a            }//结束while循环
: L3 M9 B' C. ~& j  z/ l            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
5 R3 I8 A; o1 a! }6 G- f           
8 H1 L2 b: m# w6 u+ x                if (numw[i] != 0)
2 k8 l+ A1 ~9 O/ f7 s                    Console.WriteLine(numw[i]);% \! y" X" r/ ~7 u8 c9 j
           1 |# i: ]2 A7 i$ `$ p) H% O
            Console.ReadLine();3 N6 M- q- p9 W( s9 Y, i
        }4 c3 ]( D$ ^1 }5 ?( T: a' c
    }
6 _3 j- Z9 _0 t3 x: Z- C2 ?* K( g}
2 p1 t9 P: @1 b( ^6 V" ]( M$ L. Y0 e
小甲鱼最新课程 -> 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-27 08:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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