鱼C论坛

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

猴子问题

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

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

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

x
大家好!2 d- m5 s, z5 O8 n8 \5 x2 F
这几天我在忙着编一个问题,我用了一种方法编出来!  P4 n: g# p% s- Y4 y
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!8 D) n6 b  {- U' R
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 3 M9 m: X( F- I4 o8 ~1 f

5 v7 o, Y/ y2 K" ?( b. G, Q5 W2 k+ e6 `7 q- ~8 T" u
                            题目
# l! ^) A' ~4 a' U" ?/ q山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
) B; A- |4 w' T3 n& s第一种方法:利用循环链表$ k$ p# f# r5 Z8 F  j2 ]
#include<stdio.h>6 _/ C6 k2 y1 f5 }5 W
#include<malloc.h>
6 H5 k/ x& L' v" u3 G0 ~#define M 8            //共有8只猴子# ~4 }$ _& E. l2 l0 P5 ?
#define N 3            //数到3只时退出第三只, W! W0 Y1 S- ]5 c$ X
typedef struct monkey# J1 d4 }/ p3 ]2 p6 w9 K* i6 i
{int number;; P& |8 f" G9 Y# h; T+ G6 T- J
int flag;
* q" |$ a+ K9 r, u/ N% v2 e# Bstruct monkey* next;& e- E+ W+ b+ P8 u
}MONKEY;. N) t2 s- p0 S5 v% m# r
main()0 v3 y! j+ Z, d4 s9 ]8 Z$ c
{ MONKEY *head=NULL,*p,*s;
0 X' E  M* r0 X  int i,sum=0,count=0;
$ Z0 L9 N+ Z8 l8 K* V  clrscr();              //清屏
, I& j. w9 b. w( d6 |: z0 e' X  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存9 o9 h1 F. n" y; l+ y+ i8 j1 u
  p->number=1;p->flag=1;
+ G- P8 {& v( Z" E% v% F  p->next=head;! c) n) R- u; j9 j- C7 F
  head=p;
9 |! ]1 a7 j7 q3 c( Q  for(i=2;i<=M;i++)8 v1 [2 B) i0 X8 Y" V% H+ j
    { s=(MONKEY *)malloc(sizeof(MONKEY));
1 R+ a% a% l/ |, J6 ]     s->number=i;s->flag=1;5 b. f- [8 {- V' K: G+ |0 {$ u+ _; f
     s->next=head;& C7 }3 x# m- K& X% Y
     p->next=s;p=p->next;
: @# y5 x) j  W) Q% j4 P    }
4 b) G& {$ X8 Q" H/ W% B. l    p=head;) [: A6 u6 K" }6 x
   for(;;)
: S# }7 s, Y  v1 q# ?1 r, Q7 G    {if(p->flag==1)# A4 ?( T7 k- w8 {3 h. E5 Q: T9 n
       count++;/ Y% |, X* w' {1 r7 @
     if(count==N)
# p/ n, e8 h8 w! j0 b        {p->flag=0;
8 c+ a. p. K  e8 O5 D4 z. }9 {         count=0;
# P) D. I! l  W# f: Z0 D0 h         sum++;}
* ?2 a- U2 T& T9 k' k$ t9 x4 n     if(sum==M-1)
- S7 j; J) j0 e+ j        break;
1 R, Q+ W4 r$ ]% t) v! O/ U     p=p->next;/ T6 F8 l" a( ~
    }
. ?. o# Z, G/ m$ B+ w# d    p=5 A  V/ R: D' _1 B7 I
    head;
& `% P7 e5 V% B3 S* C    for(i=1;i<=M;i++)
' h, f" C) a5 |/ N" k+ ~    { if(p->flag==1)
3 J7 @8 r% b! l! J! V" v! t        printf("\t%d",p->number);
" G0 s0 p. Y) Q0 W      p=p->next;
( x/ d" n* M0 v4 c0 v/ U9 _+ u    }
6 W" |2 g6 R! m& M- J' I( ^) o( q; M( d
" N/ I- {6 p# X1 p- _5 h

, M$ z) m! X( m, r/ A# e}

3 A% n% Z! h% V' D第二种方法:数组
/ Q" ~7 e! V' f8 ]8 B#include<stdio.h>
: o2 J7 k1 Q. Z( A#define M 8
" {8 S7 W# O4 g- \( U: ^8 S/ @struct monkey
6 v! I5 e; \" b) j9 L{int number;
! _  f) L; S4 Y8 D: X! P1 aint nextp;* X) z5 w, n8 p  b9 T# W/ C# f
}link[M+1];
6 G: P! P) O+ O+ k
1 S% x- ^3 d+ Z0 r2 E1 U0 evoid main()
) k7 S7 [1 y- o! |+ [# d{int i,count,h;; m! @8 U4 n. M
for(i=1;i<=M;i++)
5 n, M( I8 q2 ?1 A& v$ [: G$ T{  if(i==M)
: E! U. [2 F4 o  V5 D2 ^: ?   link[i].nextp=1;  r4 a9 Z* t: J7 @  s
   else
5 Y! c) x. o0 Q0 U; X* W7 U   link[i].nextp=i+1;
& J. M! t& c; ?: ?' L  link[i].number=i;
& k0 ~+ {8 L, R}
, ^, m; t4 \1 Yprintf("\n");' \, I+ M8 r/ D! `  I1 X1 o1 f! s
count=0;0 i1 G' Y$ j" G+ p
h=M;
2 j$ F% J0 ?5 ^printf("依次退出的猴子: \n");4 f/ W2 o* I4 _, \2 r* L9 O
while(count<M-1)2 ~" q# E* ]) a
{i=0;, N5 A  S! B2 e
while(i!=3)
9 ?2 |1 ?6 M' ?# e+ a{ h=link[h].nextp;
" I5 V9 D5 W0 M' Z   if(link[h].number)
. u  r! [- R$ e. A8 u$ u     i++;}: y' g' V* V' `0 n/ B
& O5 c3 {: r' S. a& Q# l
printf("%4d",link[h].number);
! i0 Q2 Q/ K0 A0 m, I5 q: I8 z, Plink[h].number=0;
0 D. J! i+ T6 Xcount++;
0 X# c6 R* ?. q* X- h( c4 ]2 a* W  }}
7 O( ~# C7 U+ m
' s+ [+ Q8 ^0 T& }$ ?7 aprintf("\n大王是:");" l$ |9 |9 H8 l" m7 y2 m
  for(i=1;i<=M;i++)3 Y$ N8 z- ]3 s% b: ]0 s4 Z9 Q
  if(link[i].number)* |8 M" l: Y" }  L! r- t2 {
    printf("%3d\n",link[i].number);
  U" K8 n# T. p# w8 |6 I0 R* s3 o* b
( K1 w( m# N) f+ }4 w/ L) }4 d
}
- h# z  P% L8 a7 O1 L; h5 J
第三种是普通方法for循环
6 _! M  B/ S& A0 z1 o/ p; H
#include<stdio.h>/ Y$ F: m4 U9 E  Q  u
void main()& Q- }( \( U0 [" y
{ int i,k,m,n,num[50],q,*p;) [& d) w7 {" V
    clrscr();" z* M* G  ]% t4 d6 x) o
   printf("input number of person: n=");
' J6 C1 }+ Q7 ?; ~5 p% X7 E    scanf("%d",&n);# j( x1 W! j$ p
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
' B* J. r% z$ z7 B    scanf("%d",&q);  g: |, {: Z5 ]) X, I5 t+ n- W
   p=num;
2 z( ~/ u/ ]; h; x, i+ Z4 D  for(i=0;i<n;i++)
* ]" |: m1 c2 Z" V- m9 K9 u    *(p+i)=i+1;6 N/ l3 @8 U5 b, X/ k! H: e  Z
   i=0;1 P4 D/ Q5 M& q$ T3 s2 N3 j! J
   k=0;
7 p% y0 w- T2 C3 u" }   m=0;
$ [. Q4 J% k: k1 s' N+ V3 @  while(m<n-1)" L! F% e" `# O$ Q3 W, i
   {if(*(p+i)!=0) k++;
# f/ R- j  Y! f     if(k==q)
' V$ r- p- i) S9 T* S1 l9 `      { *(p+i)=0;) y& d) ]4 g% t, l3 X8 ?
        k=0;( S$ F) A2 E3 r4 S& P( g$ d% l$ j
        m++;( l! S3 x* Y: L  D2 c( ~
      }
% p2 S6 Q7 [+ {( [$ M1 Q5 M    i++;1 r& ?$ X" c$ c/ `: U  C# {; z
    if(i==n)i=0;
; W5 }/ p; p2 m* s4 _. o& ?   }
+ J4 N2 Z9 x: }/ C4 v  while(*p==0)p++;
# t6 b0 r# ~5 l0 B! g) Z    printf("The last one is NO:%d\n",*p);
( e6 B0 i  h3 A& s     getch();
5 @  F4 m& X  Q$ u. O& e4 K( r% ^5 b4 N6 D; F! p- G) B3 f
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
' z+ A# v# E% u+ Lnamespace 又费马达又费电, `9 B/ T% X7 j* _
{
+ Z/ X$ X. `7 |4 L" {; ?' o+ k2 d    class Program5 z8 ~2 q# _  q; z4 c
    {
; c$ E2 [5 L; ^: s' S        static void Main(string[] args)
/ l* U( b) U$ q7 e: q  }# E6 {5 z' D        {
$ x1 I7 }- ?9 I1 n            int m, n;
& P3 Q  C$ E7 F8 ~( |3 u! c            Console.WriteLine("请输入数组长度");
9 u& k  v+ F! b9 a- {$ z8 s$ ]            m = int.Parse(Console.ReadLine());//m为数组的大小
* p5 r( s7 l# W4 ^! \% m" K            Console.WriteLine("请输入要截取数字的大小");
# c5 k/ C" F9 j* u5 Q            n = int.Parse(Console.ReadLine());  E. `( C6 h3 ?' g2 Y( N
            int [] numw=new int
6 M# |3 a: b' }/ h
$ N3 N/ E$ C+ X9 ]! v&shy;&shy;&shy;;
6 y  E6 E- L/ }% a2 f            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数" f1 J9 }! U! |4 c7 h1 r$ O+ I
            {2 L0 _% e! P) r2 S4 @
                numw[j - 1] = j;
, Z+ x# l1 q& G1 b. e            }
! l: R! ^3 j) _5 q1 I, h            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
! M* [, j+ V% ]8 S) Q            while (d != m - 1)* p' v: a% ]6 X6 ~) {% q& Y4 u5 H# V/ _
            {* c, i" J0 ^& B+ H  q: n
                if (i == m && d != m - 1)
4 E% B! K6 B& J                {
7 K! u  Q1 j5 M4 J) u5 V2 H                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
/ ~7 h5 D' `% M7 k/ {                    continue;9 B5 R! x8 g# y+ e8 w2 `* h
                }
6 l/ {! J% p: X% ?, T7 f                else8 A$ L0 h$ _) O# B$ B0 I
                {
9 i( m5 S  h/ _0 i, j( |                    if (numw[i] != 0)
) Z; ]; Y$ y; L& X- v9 b) e) ?                    {
8 M; \( y5 n0 O* _7 Q; S                        i++;
$ `* r: {6 b& A! [; v                        k++;
- ^9 _- Z; @/ ]                        if (k == n)
- m# i( X7 n. m                        {
, A  F: \: K, W( d, f* }                            numw[i - 1] = 0;//把在n位置数组元素的值改变了( g: r8 f9 W6 W3 f6 Q
                            k = 0;% ?( v/ {* F4 i$ p% N- h
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1* {+ }2 S# Q" c7 A6 r; j
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);  @  U0 c) v. P; }( @9 O, l
                        }, _9 ]9 s. Y& M
                        else//输出暂时还没有改变数组元素的值, @+ Y; U7 w1 c8 R- B3 x; a8 D
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);, F+ m5 `( V' d- v& H: A
                    }: K/ h8 K8 a9 _) b9 B3 R6 h% {: g' h$ l
                    else
; w# ]# y+ [) F" f$ J" U4 s                        i++;//数组元素为0,直接跳过,不计数。。。7 U7 H: t$ f! L& e
                }
5 p3 _; \* g( a0 j$ J, u4 _. Z8 X 7 t) g7 k0 P* h+ T1 @4 b' ]
$ h3 r  H" Q2 c9 s4 X6 I! U
            }//结束while循环4 G7 W- v$ |# o' M& F6 ^
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦$ J8 {9 C% o% _" k9 h( [7 ^
           , r; H- h+ }8 Y7 H* p
                if (numw[i] != 0)3 Z9 y6 o* u! W2 X9 ?/ M, e, h3 i
                    Console.WriteLine(numw[i]);. y9 _6 H# O) r% V/ N4 d5 J
           3 r" ]* R! |, M% F' r* @
            Console.ReadLine();
8 |& e7 }6 ~/ l9 V9 k/ o& D        }2 d/ m6 u1 M' z
    }) D# W, A# ?1 t& ~" a
}6 p1 k: v! e/ c- c9 w$ N
小甲鱼最新课程 -> 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-26 09:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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