鱼C论坛

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

猴子问题

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

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

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

x
大家好!. |! B5 u9 O# Y$ Z* O
这几天我在忙着编一个问题,我用了一种方法编出来!# O9 O  f+ `2 {; g8 u5 b
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!; L' C- l9 ^4 Q1 z8 @1 n
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
$ K  |) U6 b) T2 q1 f1 A7 t
, L8 D: P/ X$ D: X+ L( j& v( p; a3 n% k2 `
                            题目
/ p2 X" Z# P! b9 c" @  w  e) n山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。7 x7 U$ O: z/ l) k5 N
第一种方法:利用循环链表" z* g1 \0 b6 S
#include<stdio.h>
" j6 @; w) g% t5 O% t#include<malloc.h>8 l$ t/ M1 J1 t; O/ O
#define M 8            //共有8只猴子
( }9 [* _5 @% r#define N 3            //数到3只时退出第三只# z% N4 \+ {: ?( ]1 V. j
typedef struct monkey3 L2 N& X' x3 @8 c8 N# X# s
{int number;
! @% S( m* r9 v1 U  f1 S0 Tint flag;
9 J! c0 A; n0 J& h$ e7 jstruct monkey* next;9 @$ d' b/ V9 u6 h2 n1 K0 Y3 W
}MONKEY;
, r9 E% @, Z) v4 E: Kmain()" d4 c" ?" s" r
{ MONKEY *head=NULL,*p,*s;
- Z) I' V& J. l  int i,sum=0,count=0;5 H6 g: `0 t+ D
  clrscr();              //清屏
5 b' w) p  K2 f$ a  C5 i% f  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存1 _# ^/ P/ H: I, K7 U3 y
  p->number=1;p->flag=1;
# [- A) v2 W# s0 ^& r8 |, l4 I  p->next=head;
9 \% d2 b1 G, }6 C  head=p;
! |' k5 a" p8 \5 ]  for(i=2;i<=M;i++)( U- Y+ I7 \% U0 p* X! @
    { s=(MONKEY *)malloc(sizeof(MONKEY));
) h& J" ~, q% i9 M7 m% W3 I' p' v     s->number=i;s->flag=1;
# ~$ I7 D" u+ n- Y     s->next=head;
1 \$ ~' {5 z' a1 W" U     p->next=s;p=p->next;& j' V" J3 [0 O+ Z# s' x7 ?
    }
: f  G0 i* P# ?$ b- v3 Z. }6 l    p=head;
5 ]+ W/ |, j, ^* O; F" @& P   for(;;)" }! {3 u6 e+ A5 j
    {if(p->flag==1)
; a% {3 ~- [- m3 d       count++;
- D2 X1 s9 z  R9 T4 J7 V     if(count==N)) I! m4 t# T" n  H% d% V9 l
        {p->flag=0;
+ o4 l( L( u% A: i7 a" A! |         count=0;
6 S/ H3 X$ X3 c- m& G3 V         sum++;}1 }! f, X7 j* Q, o
     if(sum==M-1)5 U" ?4 C. f7 M9 V% X
        break;
$ q* `6 D! I# I( T: d7 r     p=p->next;
& R: O8 I  h8 D2 ^    }' S" A, n( q3 v8 ?
    p=: D$ a/ R% }1 r9 u$ W
    head;( m; C% U3 K, L0 G* S
    for(i=1;i<=M;i++)
: M# [# [! @* ~: x8 c; y- [    { if(p->flag==1)
4 f) A5 Q) [& `0 D# \) R" ]        printf("\t%d",p->number);
& ^+ Q. Z8 C/ X, J      p=p->next;
4 b5 c2 E( K! w9 c' n    }6 `+ F8 Q' A8 f# C0 \3 s

0 G) O2 f9 L" N1 Q
. C9 D. R) g( F0 T6 B+ M
. w  p' z% ?8 d" p}

0 E( q: M0 p# F/ @- S! l+ A0 V第二种方法:数组
' `  q8 `* b* C+ v- D  h9 Y2 `#include<stdio.h>
( q( q3 M& b4 W#define M 81 P% e7 Z! F6 p8 J4 I3 w( I
struct monkey
" _2 E8 \' ^& u9 z9 `{int number;
* e& V! q( W  v9 s# i5 R7 |) u% pint nextp;/ B/ j1 {( F$ o
}link[M+1];+ [$ L: Z7 I" g+ ^
$ J$ C+ R  u* U, `4 h
void main()
, @, U" C2 E4 z6 u) W" i; L0 ?/ }{int i,count,h;5 v2 n& S; h9 D0 z4 W  P# z* f
for(i=1;i<=M;i++)3 u8 z/ O1 @2 B) S" m8 S
{  if(i==M)# @& `/ Q0 h# q; S% s
   link[i].nextp=1;, M$ C: A& N. f5 B% e) h; [/ ?7 V
   else- d9 M# X/ `) f6 ?
   link[i].nextp=i+1;% P3 \6 h. J' @' _; ^& t& B
  link[i].number=i;. |/ S  H4 w8 h) w9 |- \
}
, `5 _3 Z/ V9 v; ]7 Yprintf("\n");
3 `& H" @0 H0 Bcount=0;8 W$ z* U& [& I6 ?- [5 u
h=M;- T- t- q8 u8 m& h. Y
printf("依次退出的猴子: \n");2 q& P4 p0 o$ v
while(count<M-1)
) I6 _* U9 X1 M: m{i=0;
4 g, C0 e- y0 ]6 rwhile(i!=3)4 n* ?% N, T9 F4 w+ Y/ R
{ h=link[h].nextp;. ^8 Q" u' [9 o* T4 W' a5 D7 j3 f  @
   if(link[h].number)
& M5 o0 u3 Q7 f' V( K# y  C     i++;}
3 |& [9 a7 ]7 c6 _8 B! E3 Z  w
/ x/ `0 p3 O) Lprintf("%4d",link[h].number);
. t8 i1 Y, \0 O1 P) w* P! dlink[h].number=0;+ ]2 ^8 b9 |: X0 @% d
count++;
6 W+ m+ Y% G) _# U2 @- W1 Z4 q}3 _2 L( u: p5 E+ k5 g

, p0 C( N1 M# u8 vprintf("\n大王是:");
5 H( H5 y. `; \  for(i=1;i<=M;i++)) b7 n2 k% M0 n: i( Y) Q
  if(link[i].number)
6 H2 _$ T/ d- s! _) j    printf("%3d\n",link[i].number);
! U( D. t9 o* k2 X0 S' u
; Z) _$ l1 L3 i/ p6 r5 O1 O+ k4 d- c6 [" P; M3 ?0 L  S
}
: n+ |0 W/ C+ h/ P7 m
第三种是普通方法for循环
7 V* Z# x0 B4 z3 k' y0 m
#include<stdio.h>
. X- q4 E- L4 R) dvoid main()
( U. c: E; [. H5 J' Z: n3 V/ g9 S{ int i,k,m,n,num[50],q,*p;6 W9 I* A0 `5 A1 o- i
    clrscr();
- k) Z" y4 @' C" Q4 d   printf("input number of person: n=");
: i3 Y  m/ }4 M2 [+ z    scanf("%d",&n);; O9 S" ?; p; l
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只1 _0 Z/ r( H# o9 n. p4 T5 t: o+ [
    scanf("%d",&q);
% i$ D5 u7 Q' t, D4 k   p=num;' F% [" S* u$ H. I) P& F! B
  for(i=0;i<n;i++)- V; s$ A" M& o+ r8 p/ [8 C
    *(p+i)=i+1;
& {9 ^' \2 _+ S; D. T+ r   i=0;
: f- f3 d' _- w  W8 K0 d   k=0;  x1 J/ x% O6 L  s
   m=0;
2 T# d' G( H; [) _& d- r$ b  while(m<n-1); T- r+ T( _0 d& y7 d: A
   {if(*(p+i)!=0) k++;' X' L2 B! |3 h$ R; B& a
     if(k==q)8 c, y- z& W# Z2 K2 n3 a4 H, u
      { *(p+i)=0;. I' s( q1 ?, y/ ]' u
        k=0;
* g6 ?6 J. v, |8 o5 F' C$ V        m++;
, U; h( Y% q' N      }, R) L2 i# B- ^- G
    i++;3 [9 U  Y) |/ `  k7 U# g+ n, ?
    if(i==n)i=0;
2 F  e; \6 ^& v, [   }
0 C& o8 f$ {% R4 |$ x  while(*p==0)p++;; J  K9 \! s# ?% j6 g$ v$ u
    printf("The last one is NO:%d\n",*p);0 T' w, {4 ~/ d4 s) A9 E8 o
     getch();7 w' `" m$ }4 `* `
: j6 Q* i- P% A; Q7 A  @
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
$ M  O' w, i* j/ V: {( Ynamespace 又费马达又费电- {9 z! @6 P7 e1 |% o* L  k- K; d7 Y: H
{" @3 l+ `2 q  h8 @  J$ A6 U6 e
    class Program
" y4 A7 m8 q; n9 t6 D6 Q: z* |    {# D9 G# f2 B6 J% ~; U) {
        static void Main(string[] args), Y- k8 B1 p: V% `3 |1 ^
        {
) V! ]1 T7 q$ R            int m, n;
0 F4 A8 l! x: _* ^. n- l            Console.WriteLine("请输入数组长度");* u  k' C' A5 {7 ?) T
            m = int.Parse(Console.ReadLine());//m为数组的大小
. w9 d; u$ L: B& k% H+ f            Console.WriteLine("请输入要截取数字的大小");
: Y. ^, U4 S$ O            n = int.Parse(Console.ReadLine());7 o' H% S" N' K) w
            int [] numw=new int
/ c6 V! j9 |2 m5 o
) Z/ Y' I/ R! m: j$ Y$ f&shy;&shy;&shy;;
4 a' }7 M$ ~# ~1 G3 X  l+ S            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
& U( |  A+ [% ~# d' w            {* S: X6 ~% }$ u: [" N
                numw[j - 1] = j;
" w5 Q0 z4 r7 s, A. h. ~. \            }
4 X- R3 P* Z; B" X6 D* J$ \' q            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!8 T+ S* M% K+ e& A
            while (d != m - 1)8 A* I$ ]2 ^. y  T- P* r8 Z
            {  f, d7 z: w7 e: }9 N( Z3 U
                if (i == m && d != m - 1)
; [( q4 ?7 `  E$ U: D                {* i8 k$ y( o* H$ A( ~. r$ o+ \
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
; Z# y5 @) k. u5 |  D                    continue;
0 d$ i+ `& I  U& Y                }
+ o+ l" |+ d( _$ `                else3 ^5 |1 D+ I# I* ^; a
                {
7 m4 S, G% P+ Z; M% i: w                    if (numw[i] != 0)' V# P( F: [3 Q" G; ~  B7 S
                    {, J" m6 {  v9 n  {  d0 T, N' f
                        i++;: q7 H0 X2 Z6 @6 \
                        k++;/ e7 d0 J5 D- c
                        if (k == n)& G, `% H# h. e* o" G
                        {) \+ n) o2 Q% }' d- f
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
2 L. C) M0 R5 b- Q) O! `2 g                            k = 0;6 E; ?4 T2 I7 }6 B! [
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小10 j; W/ |+ a5 v/ H% s; y
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
9 p- v8 y7 H( g; i# g                        }
& z% D8 j, f4 @5 [( c2 W! s                        else//输出暂时还没有改变数组元素的值
7 ]( B" n' c" J( s) H  Y                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
, Z" W% n$ S& ~                    }/ }' f2 L+ P' E9 K2 z. c5 L0 R
                    else) }/ [& E5 _" G( c2 g0 T
                        i++;//数组元素为0,直接跳过,不计数。。。" ]1 A0 z0 t: G- G8 q$ ?
                }5 o: ]1 ]: E8 u5 i  S: r0 f1 P' F
" A& e# T3 [$ m0 W# N* {" q

! h- {! s6 d. q6 `! {7 P            }//结束while循环
& h0 G% |. Q; g; N$ G. C, {) D4 G& r            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦( _. Y: N* W. N5 G; w1 \. {- M# x
           5 ?0 q0 v- E' u' ~
                if (numw[i] != 0)
3 [/ D* Y* L. p$ |; Q                    Console.WriteLine(numw[i]);
3 B0 C) g( y4 A2 W6 D# w% R! W. a           
/ Z; R) |. n, S3 @2 o7 H" e            Console.ReadLine();
1 R' D. R6 ]5 `7 k, U0 Z        }
5 N% ^9 K, s" ~( S, e. v( r& y    }
6 D& u: S, `! T7 ?+ ~5 K8 d}
4 X, F1 f/ U4 V& k6 A
小甲鱼最新课程 -> 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-2-9 10:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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