鱼C论坛

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

猴子问题

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

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

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

x
大家好!& g" O7 P4 G& q7 e
这几天我在忙着编一个问题,我用了一种方法编出来!
5 X- e' t4 Z, ^$ h5 g. u但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
$ a' r3 V. h0 R+ a注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
1 Y4 B) n4 e: Y! n/ D
, q0 E% Y: Z: n/ K, Z' _3 a8 A# B+ i) Z$ ]7 N2 S
                            题目
9 [) v$ W9 x2 R) q! L& F! N; v$ T: k山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
4 C7 _' j) M  D第一种方法:利用循环链表: v+ V  `5 V) ?" h2 v& {
#include<stdio.h>
1 j  U- A/ M3 D7 q+ J5 A' G1 B#include<malloc.h>9 j5 R; x2 C5 Y, r/ Z5 H7 w
#define M 8            //共有8只猴子
/ P8 j) U: S; p( G#define N 3            //数到3只时退出第三只1 ^- [) L  F: \; M: m
typedef struct monkey
7 m$ M3 q% P$ m! k{int number;4 l$ c) x) p( y" J% U" K
int flag;. ^7 e! |  E# ~
struct monkey* next;, o5 r- Z# d1 e) n
}MONKEY;# P5 T' A* M, K7 _4 q" O. ]
main()
  k3 |( b) ~5 G' s6 {/ u{ MONKEY *head=NULL,*p,*s;) L" Y1 U" Q2 l" M8 A, q/ q! F
  int i,sum=0,count=0;2 B: x/ N/ }. U3 J3 b
  clrscr();              //清屏# u2 u, E6 Q" n  _/ E% c. n8 ^
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存$ e4 G$ e' e  K3 V
  p->number=1;p->flag=1;
# ?- F! K4 L1 b+ g! u% C& v* I  p->next=head;4 \( X, C. ^& _# _9 R
  head=p;
- `$ H. H* l( u  for(i=2;i<=M;i++)
1 B! u  n$ t8 X    { s=(MONKEY *)malloc(sizeof(MONKEY));
4 P, c+ ]) w; o. A     s->number=i;s->flag=1;9 P& g- T4 W) v5 Z1 I3 G
     s->next=head;( d" R: o, f2 k: d8 z
     p->next=s;p=p->next;
* p/ D: t$ O* i$ g' |" p% m    }- y- H* H4 b. s
    p=head;
7 A/ K$ ?- s6 C' M1 ?( r   for(;;)
3 ]  `2 D1 E/ p& p/ |/ k    {if(p->flag==1)
/ f5 p; h, M; q       count++;
- N  y/ o( j; a0 m! W# t) N/ b     if(count==N)0 d+ K; X/ Y  K1 w
        {p->flag=0;
, L0 C% V5 x; M5 v9 E" s2 j7 x3 o# G         count=0;3 o# A* G, W- p; a2 y2 W( I  R
         sum++;}1 J- [2 s  P- l4 b
     if(sum==M-1)
2 P! g: \& j/ x5 q0 N# b        break;
1 S. c4 {0 f* Q* P; Q8 m( t     p=p->next;* o& n+ r0 X4 E& E; G
    }8 q  p1 k4 o# u6 p9 N1 D) I
    p=1 O  ?* B/ \) c& a5 I0 T$ j1 E
    head;
* v0 }: e: V2 ]6 }3 ~    for(i=1;i<=M;i++)' @4 F5 H: b* F0 U4 k/ L- B
    { if(p->flag==1)
6 b8 m$ d+ ]$ h4 X3 d- U        printf("\t%d",p->number);
) r. j- E, Q3 t6 n6 H+ N      p=p->next;
# _3 E; W( _3 m! o7 Z0 b3 I+ S    }
" o" |# C' S9 {$ Z" X$ Q. _
8 N  W  k0 U5 X9 a/ @1 m# `- w, @( Y+ Q2 z( j

5 X! G( ]* O7 i- H2 j/ g0 q$ x- w6 W}

; y& H1 X8 L8 |8 ^6 p第二种方法:数组
  F8 Y! G5 b5 q% k6 b5 l3 {#include<stdio.h>
* m( l3 F, F3 b' O8 z+ |+ g: g#define M 8
! C& E3 x3 |/ F; n3 H& wstruct monkey7 {+ @  |4 G; n, ^7 y5 z
{int number;
9 u% M8 Z3 ~' T5 N' U; v& t  Bint nextp;; P3 Y; N, i0 {" }3 d. z
}link[M+1];
" p; w+ x0 u: x% ~! Z! c8 x+ b
; }  L/ p+ c  @9 Y$ g) fvoid main()
" W% Q$ E( o% @* _{int i,count,h;* [: o& ?$ _: A, _& W7 I
for(i=1;i<=M;i++)3 N$ o. [8 D, X. F' s& W
{  if(i==M)
% n1 P. o! G! s* N5 f   link.nextp=1;
# q( S  G  k7 ^2 N   else4 Q& G# C* R7 K+ {5 }) `8 m$ }* H
   link.nextp=i+1;4 J3 \: @2 A7 Q
  link.number=i;4 p" i8 @0 }1 q" O' `
}: r$ v  e1 `8 L' I
printf("\n");
$ \9 S" _2 Q! v9 Y9 rcount=0;
& c7 K+ X5 j& Ah=M;
* M1 v5 I' z. V- iprintf("依次退出的猴子: \n");
* A& K! q% B) A& q/ O. G$ ?3 Hwhile(count<M-1)
8 S7 e  }' ^" u& t* o2 T{i=0;, [! Q7 w/ V0 r; }" {  T1 z
while(i!=3)
( ?6 }' V* e4 ?9 g# E{ h=link[h].nextp;
8 p, z5 K. h5 Z6 N  q2 Y   if(link[h].number)
/ R8 I- r( N- z# V: i9 Y     i++;}$ F8 Y  s9 b+ N
. _; v# f+ }  y/ Z
printf("%4d",link[h].number);
4 ~/ b7 b  ~$ G- Mlink[h].number=0;" j/ U# T" v) v! }$ n( u3 Z
count++;
, d" B6 R  `; L8 A1 H}3 g# e  O, [+ M" s) U  p0 [" ]

0 @; @. A( q; h* @printf("\n大王是:");- B3 ^% P) s: Z; k- @
  for(i=1;i<=M;i++)- x1 Q' R  H! F- p  ]
  if(link.number)
8 o; x- h" c! w  h( o    printf("%3d\n",link.number);6 B# a$ P" G: T; S( O+ D7 j

! G* k; B$ I' J6 t+ ~$ B  y3 ~* D7 i. K7 Z# }$ G/ p8 \
}
+ m2 J' X% G  F+ p( V) n
第三种是普通方法for循环

% i3 ]+ O. r- ^2 E3 I#include<stdio.h>
/ s- R8 M& A9 s& Gvoid main()
7 U0 U/ a6 S0 G) ]. o+ `{ int i,k,m,n,num[50],q,*p;5 D3 c$ r( g9 ]2 D
    clrscr();
" Q2 E' w7 t" v& F   printf("input number of person: n=");
+ V. o& x  Z9 E  e    scanf("%d",&n);2 r' t1 t; _: ]' [1 M
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只/ h! Q) v0 x2 [8 f0 g
    scanf("%d",&q);
( e1 ?: r9 A7 U% J# y   p=num;3 W0 ]! D) Y2 M/ J5 q  {% x# k
  for(i=0;i<n;i++)
. o: C% `% z8 V- I    *(p+i)=i+1;
! Z4 O4 d; p' I0 N! T% C+ l3 J7 s   i=0;# b6 R; y# l9 R. \% J# M2 [
   k=0;
. E: ]2 K& j- l   m=0;
; y, m8 o. c. ]  while(m<n-1)9 y, D3 `. D! c( A  N5 {
   {if(*(p+i)!=0) k++;
0 \) u& p& q7 E     if(k==q)" l2 c; M0 ?- n
      { *(p+i)=0;2 {& n- N! q6 J; b/ e) A
        k=0;- e3 D4 \/ g+ X6 k* [( K
        m++;
5 Z5 n4 {# Z. G" A, b+ E( J$ Z      }, S2 E: G5 R+ d. q$ }& m& W* o
    i++;& O( q+ K7 {" Z5 \
    if(i==n)i=0;
/ y* E$ H7 C+ _# ]5 H   }4 A9 ~$ V" E1 S1 _6 g- o
  while(*p==0)p++;
& {0 x# _$ c: W6 f8 J* B    printf("The last one is NO:%d\n",*p);
1 ]% R' a! {+ R2 ^     getch();
$ h! \2 U) u0 D& \; U, `6 v
' z6 G9 `& j- Z}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;) C: z2 U1 s8 B! ^, e
namespace 又费马达又费电
4 Q1 Z1 r) S3 a. ]$ \1 `{
7 U7 ]" D0 @. U8 T" m; k5 f5 u  h    class Program( V# k  o0 i) u& e
    {
2 H. c' M8 r9 s- \; y" n% S9 y        static void Main(string[] args)! j8 O3 u! P8 `  y- G% N" y
        {! B0 q* c; `( W& p2 L3 i4 v: W
            int m, n;
/ P9 e* r9 P8 _8 T            Console.WriteLine("请输入数组长度");
- k. O( P2 f- E            m = int.Parse(Console.ReadLine());//m为数组的大小* P5 E4 n$ P! o+ k
            Console.WriteLine("请输入要截取数字的大小");
; l; W( g9 K. {5 a- s6 h. O            n = int.Parse(Console.ReadLine());4 P8 i, I' k, T1 J$ h: {" N
            int [] numw=new int
' M6 m% i( _# o7 I( a) h. T& ^5 R! W% m7 H5 d/ V% c) a
&shy;&shy;&shy;;
6 W1 m# R: |1 s            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
4 O) f' ~, A2 N) A            {' P3 ^. _0 o/ D' g9 N0 h% U
                numw[j - 1] = j;
; M* h. u4 ~7 v; c            }# z  h" a0 ?; c/ P, N0 K9 \
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!  i# i, u& o% z1 y5 H
            while (d != m - 1)
) F$ P% c, ]7 V/ m            {
: _5 K+ d& R' [  E: T. ]% @                if (i == m && d != m - 1)8 `. j: C- s/ @9 l; b( m
                {: B8 v# k7 Y7 ~* p( |. [5 a) _" Q+ ~
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!, E# z  x# ?' F. |2 y" h
                    continue;
  M' C' X% C0 Y6 p6 h                }$ L5 M( o. l6 O- L. F8 W% I. O$ p6 P
                else
" Y' y+ a1 ~+ _+ g" o( u. s* F5 C                {- ]# O( c% n% K
                    if (numw[i] != 0)8 d* B7 R/ M- O3 h! F' d
                    {9 d: b/ a  h, z7 Y8 O
                        i++;5 f+ i+ L- n6 z; D
                        k++;7 b$ G' Z3 k( ~4 t% ]( I4 ?
                        if (k == n)7 s) @) T7 a. f
                        {
0 z% F% d+ F  F; b6 v                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
; T: V3 ^1 @' I0 ^+ R* v                            k = 0;
' G; e# w- o8 \  T2 W3 G8 Q. E              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
! D7 s- m3 C7 q( V, S                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);- _& _7 C8 u0 C/ J' w
                        }6 X* v1 _( Y7 p- i4 o7 s
                        else//输出暂时还没有改变数组元素的值+ z) @+ T4 Y9 n( B! R$ V5 S* l
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);; H$ b+ X2 e2 n, T7 K7 ^
                    }0 p1 C9 J) R5 \) N$ q" z2 }' W: P
                    else
' Q2 {9 T5 S( I; o7 v# L                        i++;//数组元素为0,直接跳过,不计数。。。
% D& V5 P1 j% l! b                }" }: S& @: p3 ?/ S9 y1 ~' y4 ~
# I$ G0 l) c4 s8 j; x" E
6 D1 {  K# V7 c2 l
            }//结束while循环) _. o4 X. I+ d& ?' q' O
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦% @" a6 Y' `6 ^' v1 [' x
           " K, l# ~& ^, D' B% W
                if (numw[i] != 0)
0 w  {8 G% }$ p* m                    Console.WriteLine(numw[i]);
# k" p* a1 v* n% _* L           7 y7 [9 P/ d5 A. L) {1 V
            Console.ReadLine();
7 n) s' |0 j' E0 O5 N        }6 V" \! L% q1 U) I1 T" T
    }
+ \3 x. Z0 ~# s7 T! \3 a}1 X$ X7 z" ]' J" P/ u/ S7 M  z# [
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-8 16:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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