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

猴子问题

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

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

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

×
大家好!7 [3 i+ Y) w# q! @# o0 l! Z
这几天我在忙着编一个问题,我用了一种方法编出来!
. _* S$ _( g" B- b0 ~. F) P但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
4 ^7 i! D0 E( Q注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
( {4 t. `6 b% m2 b: m9 d# n5 o, S6 w4 Z' H7 _  w5 y4 _

/ Y" F  {/ y1 x, r2 m9 L+ k' a) K5 l
                            题目
9 i4 X( X; |, O9 C( o  F7 B& m  `; i山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。- s8 @; t! c( ^+ R
第一种方法:利用循环链表6 \  i8 D- [6 m& s% M
#include<stdio.h>
9 \9 J2 x; m) R1 k$ }0 U& s#include<malloc.h>) b" f7 Z- _" x; o
#define M 8            //共有8只猴子/ S- R5 x8 w5 b! \4 {" w
#define N 3            //数到3只时退出第三只: e. V. S( ^" _% y
typedef struct monkey
+ Z9 M  R, T' p1 g4 J{int number;& B4 Y) Z% Q& t4 o# }; G+ z$ z
int flag;, B! y" ^5 O; d, F! r  a2 [% \! _
struct monkey* next;1 f/ D( d" [- g' h+ l" y2 J- ^9 l
}MONKEY;1 s* @3 Z# t3 n5 t
main()
9 f5 c  [+ l. j2 ]{ MONKEY *head=NULL,*p,*s;
2 n* Z, W. z) M* j  int i,sum=0,count=0;
9 S, m; _  i9 B# J: E1 E  clrscr();              //清屏
  [! s% a$ z/ @! s  k, R  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
; G1 f  @, S6 p% l" P) V  p->number=1;p->flag=1;
2 f' B0 O8 z5 g, J  p->next=head;! M1 F* n8 f: M# L) X
  head=p;
8 Y/ ^/ W  y% m/ y. }  for(i=2;i<=M;i++)
) R9 |8 |1 [& \6 d6 `    { s=(MONKEY *)malloc(sizeof(MONKEY));
( M  y, i3 \9 s( N' t     s->number=i;s->flag=1;3 U3 i* q1 h: g8 P
     s->next=head;
# o# x; G& ]4 H; J+ A     p->next=s;p=p->next;
# v# B# Y9 k/ \8 D2 H. V    }
* `8 T6 X2 J2 [% k. P* k    p=head;
3 o6 i7 }+ a' U# V9 r& [% }   for(;;)
* d2 W3 |* \% ]6 y. Q% q/ B3 o    {if(p->flag==1)
' E) N' E+ \2 T0 i6 Z, L2 ~* t- s- t       count++;
4 e) |* }, X7 ?' ^1 J0 r0 {- N, P     if(count==N). Y- S5 X  q: t. D  ^) B! O
        {p->flag=0;$ i( d* ~7 k; N' J# K
         count=0;+ i* i0 o/ Z* g. X1 }
         sum++;}
, W6 K/ u* D- A2 E' V     if(sum==M-1)
8 V" C" G4 i* Y7 M        break;
+ R! X/ j* m( V4 r  Z     p=p->next;; {# Q- g. l( }; t7 h8 ~
    }
' D0 j- X+ E4 Q, d# E( ?9 P    p=
3 u/ ]4 J0 W, Q, U4 b" n8 h- s    head;
/ g6 C( k4 x2 S: I$ B) Q( S    for(i=1;i<=M;i++)
) R# Y. _1 g7 Y  C    { if(p->flag==1)
& s8 {' l4 h" C; e) W7 x# e) r" [        printf("\t%d",p->number);
7 J$ U7 c5 `8 I( `& C: ~% M      p=p->next;( d  {7 e+ c, N8 N
    }# I; l8 ^' X) Z/ T: @

! T* K; t" `7 a6 j
* t$ H" Q' w+ j0 T0 A. Q+ c, m6 l6 t" K3 i4 H
}

& ^0 f+ G6 }: i0 ?2 d第二种方法:数组+ G5 K5 g0 I* _* j+ ~
#include<stdio.h>
" i* ^3 |6 c$ J5 }* g#define M 8
3 }. y7 u: {# }8 ustruct monkey- \9 ~$ c' E: n! ~
{int number;7 I& R3 S2 l8 L% n0 C5 r; |
int nextp;* ^' ^% P( ?# j2 s8 J! w9 c3 ?
}link[M+1];5 j2 A+ B3 p4 g# G1 @* a
9 ]3 ~. i, B$ g" |! o! V
void main()+ K( \% l" D& R# r& j% z7 y% M
{int i,count,h;
9 ?& H/ F, a3 s3 a0 vfor(i=1;i<=M;i++)
4 v8 p4 q/ O! \: Y: ], |- U. {  |{  if(i==M)
3 t0 a/ n6 z: l. H* d   link.nextp=1;# }! N, {  V( D6 A: b
   else
* `; T6 \  C$ l   link.nextp=i+1;
$ x" x) n. D" U0 R* n7 Z  link.number=i;
/ C6 ]2 i2 G1 z}
. l) H2 ^/ I. M2 C2 v) E7 E; z4 Jprintf("\n");5 n* {6 s7 G% O9 P# s2 J
count=0;2 m! `/ U& R) Y% I7 z" d  N6 I
h=M;
* x2 i# c7 M4 {* o7 oprintf("依次退出的猴子: \n");9 v/ x$ c( y+ E9 ~" S1 H1 \. v7 c
while(count<M-1)7 p3 X7 ~3 }- x* H1 E
{i=0;
% L) N1 D3 y4 O: c7 T, h( M  ^while(i!=3)2 y& e7 X: g) O! p9 R& F9 @& O
{ h=link[h].nextp;
, C6 T! P1 V3 T& w) p1 S  _   if(link[h].number): O4 T4 G& F# K
     i++;}* ^: |* |, [9 A/ {
3 d' G. I) R3 y& S! H
printf("%4d",link[h].number);
6 Q% f. A5 ^5 c5 |; L8 Wlink[h].number=0;; ]8 `) w, J+ f
count++;* L4 D9 T% \! A1 G
}
  D9 o. X2 r1 t/ o# p3 b- Q3 {% M" y( a- l& S0 D3 d
printf("\n大王是:");. W/ D) U7 X  i: |) \. c( b
  for(i=1;i<=M;i++)
# I) N( j- G. ]$ p2 {! ?' D  if(link.number)3 Z5 P2 Q9 j- R( K1 r
    printf("%3d\n",link.number);
! P5 m- y# _3 v2 w* I
# @: d" e( T; X. j  Q
/ v% _- a4 E6 V' s% J}

( q" E! ]% I: Y第三种是普通方法for循环
" E5 X# D2 @6 \8 ^2 Q
#include<stdio.h>9 A+ Q* u5 x8 f/ ]( Z
void main()0 A# ^6 ~( n% V0 g. @
{ int i,k,m,n,num[50],q,*p;
; _/ v1 k& f  q8 {    clrscr();
% D2 Y4 L: X' Z9 u$ m   printf("input number of person: n=");
' h3 l1 G0 d- V! Z, Z, X    scanf("%d",&n);
' i: A0 q) g. X3 f3 ~  D% hprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只( \- _/ a" s' t; Z" y
    scanf("%d",&q);
6 u* [; s) `1 w) @6 Z" p   p=num;( _; E8 K( s" }& f& @4 `
  for(i=0;i<n;i++)7 V! ?4 B) a+ M& A" ?1 X+ [
    *(p+i)=i+1;
$ e5 o( d( D# ~- b1 N) E   i=0;  @- w! t" ~' V5 d7 g0 J
   k=0;1 i6 s9 T6 o4 O% w
   m=0;
1 S6 F) G( J' g1 q' L6 Y/ k  while(m<n-1)9 e  o) |) j9 t) ~5 ^+ \: h
   {if(*(p+i)!=0) k++;
4 P8 a- U3 L) W  R' K1 ?' Y     if(k==q)4 h; F; {  h% j" w
      { *(p+i)=0;( T! v0 C9 T6 ~9 j: z6 k
        k=0;
' L+ p2 y- K) |        m++;
8 C' D3 Z+ q' k: t1 U# F      }% A2 g! D; b0 N# a
    i++;4 X" y- F, S; B% O) P. O' n
    if(i==n)i=0;
* q8 N* ~8 ^  f. B8 @; n& Y$ _) `   }
! t" g& v: |8 J9 R" Y# _4 g  while(*p==0)p++;, S7 n2 @; F) p: q) Z- B' p
    printf("The last one is NO:%d\n",*p);+ T/ j. L! D' e  k" ]& {6 c
     getch();
# o- M( j* Q3 ~$ G% o# g% |3 E& y1 z# ]. ~3 u3 \) T1 H- o( S
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;; l3 \" z! P# [* ?" \. {
namespace 又费马达又费电
9 ^' _6 H; Z6 x3 W( ]# M9 r{2 W" N) Y- v; P5 s1 W
    class Program1 u$ c( T, G6 z! s. N1 o; U$ c
    {
( _) @5 ]+ E) n        static void Main(string[] args)9 N7 T2 K% l; Z: }4 p
        {0 [) |, k& Q' u5 f- J: ^# x* F7 Q
            int m, n;
' v- T7 s4 b" C; _" C7 D3 Z+ [$ Y            Console.WriteLine("请输入数组长度");  f3 \) K6 ~+ e+ @: Z$ y7 N
            m = int.Parse(Console.ReadLine());//m为数组的大小7 V! _: w7 j: b$ a7 E- |- l# U
            Console.WriteLine("请输入要截取数字的大小");, K3 |7 B+ _: @  o, i0 l3 P& W2 N% L
            n = int.Parse(Console.ReadLine());
/ L' W6 m. q% C5 K, O            int [] numw=new int
' Q: m. F* C: P" m3 F) M8 [
# @+ }7 E7 ?6 M# A' r&shy;&shy;&shy;;
6 y1 v* k  V+ P9 U; n& J5 O            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数" o4 B4 c3 d4 M! {/ E, m  y7 R
            {9 j" v7 U/ Q( t
                numw[j - 1] = j;/ r5 H* K+ f9 m; v4 V# c& B
            }
* F. d2 C2 [3 @% U6 \+ N            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
! Q, z/ h! z1 p# p4 K! V* ?3 y0 n            while (d != m - 1)
6 _2 `' c( `+ z, o" j            {
2 [9 a# P0 y$ A3 c9 Y$ n                if (i == m && d != m - 1)
6 G) u' w9 [) h& n" I; [                {
7 S: j3 \* o, o7 C                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!( G/ {: U' V, A
                    continue;
% @% O% [0 m: H                }) T6 N+ v- X8 |# x( ]- |
                else; ^0 V- b- X, @0 N
                {
9 x! n( m* x1 y8 ?                    if (numw[i] != 0)2 Q# L. j& F- f5 ^4 r
                    {
1 i6 R2 X9 e0 M4 ~; Y: b5 d                        i++;
. N6 C. K8 ?* a; ^$ `. U                        k++;0 E% u3 J  T* Y5 B! U
                        if (k == n)
0 k, l1 J) \: y$ L7 Y                        {
, b/ g9 d/ m  E. p                            numw[i - 1] = 0;//把在n位置数组元素的值改变了' g6 M; m9 E( G: R+ p1 ?! |$ P+ S
                            k = 0;  q* `( f2 d% T$ ^# c
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1/ q9 u2 Z/ ^: S) ?
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);# ]* F. h/ I4 [' a$ l( ~
                        }
$ ?% p* [4 V2 ]- J# Z                        else//输出暂时还没有改变数组元素的值/ A: I5 `4 D: ~
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);1 R, R* k& t! L# q& u
                    }
& ?6 w2 G0 A" i- j                    else
3 h, ^. F: \, g6 X* o                        i++;//数组元素为0,直接跳过,不计数。。。
# s) U7 n4 x* Q# C                }
4 {5 Y6 Y3 E% B  S$ y9 ^2 S0 T
+ \0 m0 m# i# ^1 ~& C; f
0 b, c/ \3 ^0 e) k: R            }//结束while循环
5 J( D4 L, F; L* N! C+ c            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
7 b7 M# h2 W1 W# z0 ^/ E           " Q' _2 V+ f, t6 p/ v
                if (numw[i] != 0)3 ?* t2 ?7 a/ x# ^# f4 x
                    Console.WriteLine(numw[i]);0 U1 h. Q+ c' Q3 X" |
           
/ t- Q6 A, Z; e+ Q! j& j3 _, ]0 K            Console.ReadLine();) R/ G# A7 \( C$ O$ \& H# T' U- Q9 _
        }
# o/ ]" |) m. S% f( V    }
0 e- P- k; q0 N" ^! `}
# X! o0 u" D3 d2 R
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 1 踩 0

使用道具 举报

发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

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

GMT+8, 2026-11-15 21:40

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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