鱼C论坛

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

猴子问题

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

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

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

x
大家好!
- I  Y. T& Y# }! g. ?9 n这几天我在忙着编一个问题,我用了一种方法编出来!
0 M! r1 D" c; g1 b但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
1 C0 n) z+ f9 f! ]% @/ I注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
5 ^+ L& ^5 U  q4 r
+ A, I+ }# W( I7 w9 b2 U' V$ l* b9 @( {/ C0 `
                            题目
9 c5 u1 M) O7 S7 J# `: P2 a山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
' f* t2 L5 x0 w: E第一种方法:利用循环链表1 D& d7 ]- Y! z+ ?+ P( X, Q
#include<stdio.h>
. }; v, d* P# {& Y) [% T#include<malloc.h>
/ j' s4 k2 f4 d9 w3 i#define M 8            //共有8只猴子
0 V$ r( T+ w) N* a: k#define N 3            //数到3只时退出第三只
# ^% C, o: }5 i* j4 `; ltypedef struct monkey
! u7 L9 J- U5 y' Q" d' H{int number;% J; N8 ?" x9 g) f  k) a5 p! l4 h
int flag;
$ {0 F7 c6 B; q5 h7 ~! Pstruct monkey* next;
0 T3 O" o. l$ W5 b& S4 r9 b0 l}MONKEY;
; p5 O) B% L1 b' i( \main()
9 l/ j; Q* ^5 `5 N2 ~5 _" I% f3 z{ MONKEY *head=NULL,*p,*s;
3 g7 l% g$ J) f! c; J8 e5 L  int i,sum=0,count=0;
7 Q0 J0 A* i0 i5 s* Z' {" ?: _  clrscr();              //清屏( M. ]9 q: Q; ~# v
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
: V! H8 j- S. Y% d& m  p->number=1;p->flag=1;' [- x2 j8 I+ c6 z9 b; I5 m1 H( U
  p->next=head;
2 b: E6 Q0 }6 o3 u  head=p;
7 v: O9 R9 v7 K) p! J3 O- M! J  for(i=2;i<=M;i++)6 h* \5 W  `: l7 I" `8 n! S
    { s=(MONKEY *)malloc(sizeof(MONKEY));8 Q/ P$ s$ a: q9 l7 @+ N
     s->number=i;s->flag=1;
+ i" X2 M# }: Y     s->next=head;
4 [- f3 j5 N! D9 ^6 U5 f     p->next=s;p=p->next;* I* N' Z/ W9 _$ y. `' Y  M( r
    }
( E3 O% J% |3 M+ v  E    p=head;: O$ V! h& I: ^" n$ v9 o
   for(;;)8 T" ~( j6 J2 p1 u: O! I
    {if(p->flag==1)
4 ?' s" `* w, d       count++;
2 q6 u- p6 H. T     if(count==N)
. M( o. p( o6 n        {p->flag=0;6 p  F- \( F! {) i
         count=0;, _, i0 f0 k- u( r& u1 D$ \3 t1 k" G
         sum++;}% g+ ^, x3 U- ^# T3 I6 ^) M
     if(sum==M-1)
. ~, Q- @* o1 x  e* S        break;
7 O7 j& r1 J% k" D1 q% I0 O     p=p->next;7 h4 `- {4 r& G! {$ A" R
    }
9 C  N) z) B+ u5 I4 `1 h    p=
8 z+ e1 w7 ~6 \    head;4 t0 f+ l/ n- r2 P  R
    for(i=1;i<=M;i++)
' ~/ d" W" e' Q& b; B* T+ e+ r. E    { if(p->flag==1)/ E* [' C6 F  e. [; o8 `9 v
        printf("\t%d",p->number);
+ K1 P" w# Z; g" s0 w      p=p->next;) f3 }1 j3 c# t" a8 _
    }( j, M2 w( a! p; o

/ k, U  d" y& G& w) b* Y0 ?% R6 ?3 E( j
0 n! @- Q6 y5 `0 L
}

$ d9 a. ^- g1 y1 ^  F7 G/ W第二种方法:数组
/ W: Z; g' Q  y$ e6 W$ c- g5 T#include<stdio.h>& w* U" x$ y" C) R2 {* {" O
#define M 8) Y2 s7 i& k9 O0 V
struct monkey
! F$ B5 N" O) l: M{int number;0 G5 k4 |  V' ]/ B
int nextp;  \" l6 a! q  C9 p$ K) |
}link[M+1];
8 Y1 B! I3 I/ q
( o- ~" R" z, D* W2 H1 Y5 j( \void main()
$ \7 b( ^; Z1 @* ?! t2 k{int i,count,h;* u% I; f' `6 {  l2 t
for(i=1;i<=M;i++)% Y4 [, u8 _2 ^
{  if(i==M)8 d. t1 C& S! B# D# E
   link[i].nextp=1;
* E5 y6 ?3 N3 z2 R3 p   else+ k6 S4 j/ q+ b5 C* g, k* c
   link[i].nextp=i+1;
; a6 l1 l7 U/ b" }8 k6 j" W3 }  link[i].number=i;3 K  k' T- A% x. Z/ M; E
}1 j. Y6 F6 ^' R; V7 A9 X# {" c
printf("\n");
9 F& x+ `; [7 x7 f7 I% N* ycount=0;- {  ?* D8 G' d, q9 J
h=M;
- c# F3 W" Q6 F0 ^7 cprintf("依次退出的猴子: \n");
- x1 m. X$ ~; l) C: Qwhile(count<M-1)0 u  k" ^: {. I8 W5 }
{i=0;* ~, F/ j- W3 q* N- U
while(i!=3)
) T2 i( K6 }; L& H3 u{ h=link[h].nextp;
5 b7 \- t1 t; E) j; u* j9 z$ M/ ]   if(link[h].number)7 ?. k6 I1 S! T6 P& X) r; X
     i++;}7 u/ s- d, y- ?' a
  i8 Q. e  z5 J( E# s4 @7 |; r/ M
printf("%4d",link[h].number);% k1 G. a, l' e, M! K3 q; _$ D
link[h].number=0;2 a+ S8 j1 G3 U, S5 v  q
count++;3 e# r4 K% f/ T% ?) s" K
}# n+ Q5 t8 h. Y' j- x

! W: i4 d7 _9 h( Xprintf("\n大王是:");4 u" x1 A% ^3 H8 ~; v3 E' c! C
  for(i=1;i<=M;i++)
4 b& D6 t% q0 K( K  if(link[i].number)
! ?* Q: V' Z- P+ }    printf("%3d\n",link[i].number);7 @3 l/ Z* z4 n6 r0 ?( G

& ]4 t1 ?. x  l  d6 j2 C. P
# h# @% a5 B, s) Q}
# c. E) r* E. ^1 O2 p; ?
第三种是普通方法for循环
& T  ~' ]% `" V* P8 S
#include<stdio.h>
. M9 |" @4 E* f7 Y; o; bvoid main()
$ n3 ?+ A1 G7 x- j7 c{ int i,k,m,n,num[50],q,*p;
) b0 T  f5 g3 u& X$ O, l1 s    clrscr();
/ f; e1 b3 q0 C7 c$ M   printf("input number of person: n=");& |. G2 H: E+ B) L: [) d9 I
    scanf("%d",&n);
& M+ \5 d  ?/ P' ^3 Sprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只* I7 g% k8 t( _
    scanf("%d",&q);
) X' C3 P( K  o$ @: p   p=num;
' ?" n; z3 L* r; `; [! s  for(i=0;i<n;i++)
) N: I3 V6 E9 u4 p9 b+ ?    *(p+i)=i+1;
# b) _. l' G/ e' @& D& C2 O+ y  v   i=0;3 K* F+ W# o* i+ A
   k=0;
; ?* |0 F0 e( Y6 U  N+ q4 h8 h   m=0;
: g, u2 o/ C/ f- T6 N. J* ?  while(m<n-1)
" {. Q! l2 ]( F2 \) i: f% x5 K   {if(*(p+i)!=0) k++;4 \7 Q: E/ i  h/ S5 d
     if(k==q)
9 [5 D; f- u- z& I8 b! _- l2 o      { *(p+i)=0;- K( _' B# r7 z7 Q& a3 F; M% R
        k=0;' B* F4 m# I& N8 e) M
        m++;
( E7 o: }3 e( [! C# ?  P      }% f+ y& V7 J# f: V- I5 _
    i++;
( n$ v& h& O# e: z    if(i==n)i=0;* a: u* V0 w3 ^3 ~
   }! G5 R, G. Y# w  I
  while(*p==0)p++;& u0 D/ p1 m  Y% O% e/ C9 Q0 N) e
    printf("The last one is NO:%d\n",*p);
* G" T# n* Z' T  [$ C     getch();% T3 `; M  j# @) p" j* h

) E8 ]) u; s' ^+ o$ U$ H  H}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
1 r+ Z3 H) }( ?1 ^& P# D. cnamespace 又费马达又费电
  ?1 X. O5 g! G6 x{/ D8 C$ q% Q3 ]: ]
    class Program! x: Y7 m6 S1 G
    {6 ~- \+ p: I0 t' H4 Y
        static void Main(string[] args)
( U, k, i9 [0 k  h        {
& h' G( O3 ^* j8 U) l9 x            int m, n;
) @( N& O$ `, b            Console.WriteLine("请输入数组长度");1 _6 `2 {' j2 N& B, v
            m = int.Parse(Console.ReadLine());//m为数组的大小' r. z' F1 I4 |+ T. L, f
            Console.WriteLine("请输入要截取数字的大小");( e3 h8 X; ~( ~5 ^
            n = int.Parse(Console.ReadLine());
$ [+ c+ G& s9 P9 c  B& n            int [] numw=new int
" @; G6 N6 H- P
- |, @) M3 Z/ S7 @+ @6 l+ v&shy;&shy;&shy;;
; l! p, c* o- ^- q            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数7 G( m5 G; X3 Q7 q: V
            {% b* M8 X" A+ L; |0 _( F! s
                numw[j - 1] = j;
1 w9 i! R+ z$ g# R% Y            }7 a, J' p9 ~/ \7 x( P& A8 R# X( m
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
! O% n8 z! ]" g4 e0 g, }8 k- o            while (d != m - 1). p$ }, x% h9 L* {# t+ I
            {2 R7 n+ b! W( {! x& {2 y: x
                if (i == m && d != m - 1)' X% c' u8 R( z& _; A
                {
3 V1 R; s5 }" g+ M6 g                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!* E4 w0 g. r9 |5 o3 l
                    continue;  m  k4 m9 h" S
                }5 k% l# P8 w, Y
                else, z$ l$ A/ N, E+ w3 j1 r3 v& r
                {2 c" ]! y  I' W% f7 k2 U4 K
                    if (numw[i] != 0)
( {) r! i& z4 H1 e2 C                    {
; ^, z5 ~1 ^! `$ b                        i++;
6 y, D1 Z6 D1 D                        k++;# G8 i* Y% P* G% t. G& G* f& ~: Y
                        if (k == n)* M& d4 H5 h) H  g+ E( o9 l
                        {
5 v. @( O0 \! `2 ~- a- U                            numw[i - 1] = 0;//把在n位置数组元素的值改变了; i7 f6 W" ]- e7 L1 Z
                            k = 0;8 b8 G, V- j5 V7 w) Y, w# x6 B
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1$ }+ g' s- e0 C, E1 ]+ l* m6 u
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
* L! \4 y. Y, n. c% l                        }. z6 f7 \0 [( O' q& v0 ]8 k
                        else//输出暂时还没有改变数组元素的值
$ D7 ?9 v1 {4 I8 H) C5 U( E                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);: `6 T0 S1 z2 X
                    }$ b5 _" E8 G: w
                    else( w7 Z0 `- T' N- h. A# _0 q
                        i++;//数组元素为0,直接跳过,不计数。。。' f3 h6 z/ C0 @: X" L3 E, b
                }, G" {- R( v3 r2 a) c0 v

  t  a+ w4 [( r7 H6 s, E! @& L) r7 N" y5 M6 B! }# j. y% H+ R
            }//结束while循环
, c$ W  G8 Q; r9 F            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦5 C# o* G: p6 M) W. v$ P7 e& J1 j
           
. R/ l! S. A# T+ r2 D. Q( t8 _7 F# l                if (numw[i] != 0)
, F+ ?, i7 `" N  k9 L; Z8 K1 S" y7 D% X* M0 S                    Console.WriteLine(numw[i]);8 v6 j: V/ i- g+ {& Y  ?
           
5 A+ K; Z% `( x* ]& _            Console.ReadLine();
' k) `( @0 p/ ?  b8 J- l4 u        }& d2 f5 }8 Q2 q, \$ z; ~) K
    }1 X7 b& x/ C& J
}* O) \; A5 s* c+ l7 j% e1 w% b+ |
小甲鱼最新课程 -> 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-3 19:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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