鱼C论坛

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

猴子问题

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

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

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

x
大家好!% k! k6 A6 I( N
这几天我在忙着编一个问题,我用了一种方法编出来!% n6 U4 J* s# T) M9 z1 d
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
! ^9 S8 b6 H. {注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 $ m0 t/ y% i( b2 n) ^8 j

4 q  k7 K- s/ O5 V8 T/ y) s* d6 e& O: q" L
                            题目( y+ A! G0 d0 l2 h
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。1 s1 J3 N( b. |5 }# ^* l6 V4 @8 t2 f: C
第一种方法:利用循环链表- n$ w3 @: ?4 D4 K' O6 I
#include<stdio.h>1 G3 r( F7 @/ }" o0 P: O
#include<malloc.h>
/ R. v8 g( o9 o9 H#define M 8            //共有8只猴子+ L. I0 ?5 B. @# \
#define N 3            //数到3只时退出第三只
' k5 y, \! I- R; }1 btypedef struct monkey
3 F9 e! l& e9 G0 J7 [% w' J{int number;2 [. d% A# v* P# i3 B: S3 w% I3 W
int flag;
4 L2 ?' z  t- T" |struct monkey* next;3 V0 F1 B. j) J6 q: J2 l+ P
}MONKEY;/ m. q# ~: Y6 q* ~4 u2 D
main()
) R, K* P' L% L5 ^* b) _" ~{ MONKEY *head=NULL,*p,*s;" X" `9 R5 _, ?4 N5 H2 t
  int i,sum=0,count=0;
0 u% V" V. c: l: }! q  clrscr();              //清屏
4 H' G: [$ e, L  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
" w) N4 W  u/ N  p->number=1;p->flag=1;
  ^3 P' r8 ]3 K) g0 V# _  p->next=head;
6 E0 n# E) a# y+ m  head=p;
+ {( W& X/ g! G1 l  for(i=2;i<=M;i++)
* @1 l# s/ H9 ?; K* E- k: Q! Z    { s=(MONKEY *)malloc(sizeof(MONKEY));
2 S4 D- w4 G* @5 N( w; F     s->number=i;s->flag=1;1 t7 l; ]8 H8 U9 R  C' E
     s->next=head;
5 g( w. [8 f0 l8 N     p->next=s;p=p->next;
; ~2 U" c8 K# J# E1 |6 G    }  ^  C0 Z, @6 Y6 x- k5 F
    p=head;9 @1 p7 a% A7 z( s
   for(;;)/ ~& H7 b+ Q9 n( g
    {if(p->flag==1)
2 E$ t1 m6 I4 {. P       count++;- l& k8 p% Q  D; ^
     if(count==N)
0 e; B( W1 m3 z$ c: l9 w& s        {p->flag=0;: w2 t9 f" A2 @3 x" v5 G
         count=0;' x6 v  G  \- U& t; `1 y
         sum++;}5 d8 M# x$ `: M6 R6 \
     if(sum==M-1)" i* p. L" N6 ?7 R/ Z5 @& x* Z
        break;
% P9 g  o5 ^- N; p/ r) V! c     p=p->next;
; ?9 h1 v) a! ^. c    }
$ w0 `' [. b0 w6 T    p=& M% T5 H  \# j: S2 K( q
    head;/ A2 X. Z4 h. N5 t6 m, w
    for(i=1;i<=M;i++)
6 v" O$ }3 k# N0 b8 [) |    { if(p->flag==1)8 o! q1 A/ Y! y8 ?
        printf("\t%d",p->number);
  ^( \. F7 g. b& N      p=p->next;. R  ^* ^6 i% l5 H: v
    }" f0 ^  w, u5 `1 }

/ B8 f5 d7 W3 v) s% Z. e) l! T8 u
4 ?; _: b+ a$ x3 H- x/ [$ C( w8 N. X* ?
}

7 ?7 O* Q+ s, v# m4 T; r4 ]- v第二种方法:数组
, q  r2 D7 g% Z" x4 _( _5 \+ b* X#include<stdio.h>
. Z# d  E5 S* q2 C* k/ L3 }#define M 8' H- p  c" o. V4 {) s
struct monkey; a1 o1 p0 G" j# K5 E4 S( f
{int number;& `! h2 G2 r6 }" d$ J- x
int nextp;* n. H, L4 g' H+ o$ b
}link[M+1];
* ]3 j& Y: J1 x$ x* a. L
; h/ C6 v2 E8 j6 O/ p6 T0 b3 Mvoid main(). G! {/ P! y/ g! T2 R, E$ V# J
{int i,count,h;7 ~8 h' B. s  |
for(i=1;i<=M;i++)& a% f! j' Q" N8 F+ I
{  if(i==M)1 X  i8 o0 J% M% _& v3 n; I
   link[i].nextp=1;
! q; f: c8 N: o( s# N# K6 u7 V# R   else
% P  K% N4 m0 V0 q0 R/ ]   link[i].nextp=i+1;
6 _- f/ G+ R6 O: ]0 `8 J/ T( N' P  link[i].number=i;) O  O  r6 P- j! U1 [0 f+ ?
}
! w# }9 n$ s8 W1 O9 I% kprintf("\n");  c& O, r3 W7 E$ P1 W' B
count=0;9 s& ~/ P6 d, z/ o2 V. i. W$ ]3 \* S9 t
h=M;5 J' H: S) j" y6 f: T8 y
printf("依次退出的猴子: \n");
" [  F( P* E7 K6 Z* I! t* fwhile(count<M-1)
% `: i: V- S$ l{i=0;
0 b$ I( D1 u5 T! U+ _while(i!=3)) W: r0 H9 Z0 [! u
{ h=link[h].nextp;
& O/ }  h# @$ F/ c( N- r: {   if(link[h].number)
! t8 I/ c+ `7 ~+ ?, s- d: ^' N8 q     i++;}4 h* C  w$ g& f$ `6 V. q2 Y# i2 Q; [/ f
; O8 o( {- ~  N: y7 u- J
printf("%4d",link[h].number);
" a; D0 {  N1 |# V+ s' _link[h].number=0;% Q" W: i2 R6 M2 p0 ?
count++;
+ @" z/ G7 c) V/ A: F; h}
/ W1 ^4 @& w: s2 h' Z& f( m+ q! {# I+ \! K5 r/ F) @* y$ G+ _
printf("\n大王是:");
1 y) b9 i; z4 Q$ L  for(i=1;i<=M;i++)& i, I6 m  T, g+ U8 M$ b1 U
  if(link[i].number)
& q1 ]0 k4 I* ^% e( v+ V- @    printf("%3d\n",link[i].number);- I* Q3 w0 i2 b2 k

2 z2 F9 N0 N5 P7 ]# V7 L; x6 R4 r. U6 u" d* |$ O- q
}
& \/ z! [  J& z  U/ S% S/ {
第三种是普通方法for循环

! M* t8 @6 t* K. x. e' e& m1 w#include<stdio.h>
; t8 y. O" S/ x# i$ ]: Z: T, _void main()
  x1 f! Z9 S: [+ U* |# o- S& c{ int i,k,m,n,num[50],q,*p;9 O2 @2 _2 C+ w/ b; o( t, P
    clrscr();$ h1 S  ^) z/ P1 P
   printf("input number of person: n=");' e: C# g+ p" L- T3 v. y# K& \
    scanf("%d",&n);
* o1 H. \2 Q6 q$ c$ E+ Lprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只0 }7 o4 @1 u# v: N
    scanf("%d",&q);
/ J& k+ [! a7 ?" J' m/ f   p=num;
7 f# n. ^& N$ n+ R1 F: e3 j  for(i=0;i<n;i++)/ k9 M; m) N0 N, D* C; G
    *(p+i)=i+1;
) \& r" H" o, r8 v' r   i=0;
' I) a( ]2 M: t! y  f. Y   k=0;
9 V7 _- a0 U# ]   m=0;! v+ \# H# a/ d# h. N) s
  while(m<n-1)6 t' e% U  |8 O
   {if(*(p+i)!=0) k++;7 E, k3 ?* S6 F/ p7 }; g
     if(k==q)) n% c2 `! o/ M3 H
      { *(p+i)=0;& O  p' Y, y/ J& E
        k=0;- V) c' Z0 C' L  [5 k
        m++;. w' z  ~5 z4 U" \
      }
3 o2 z* I3 Z5 N) K    i++;) a- m9 E* Z7 o7 J$ e  l
    if(i==n)i=0;8 ]$ {: X' K1 D2 r. J- |0 q2 S
   }
* X6 g( l5 E$ m' n  while(*p==0)p++;
; h( U! T  Q( `( N2 p4 A    printf("The last one is NO:%d\n",*p);/ ?' c5 h. B5 }
     getch();8 L! _  O; w, _) m5 S5 r% ^( O
( b9 X& Y8 [: _) ?% h/ b
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;! e9 }4 @; r4 C0 G' e4 w
namespace 又费马达又费电
9 P( p* F/ p5 Q# ~+ v1 V6 W{8 i3 c3 m  q5 V; T; @# U" ]6 x: U7 O
    class Program
( x4 _. i, f0 r3 R' l! @$ K    {
$ e# g3 R7 q9 J8 a- ^        static void Main(string[] args)) A. D2 I, x1 q& {
        {: Q8 s- j1 }$ @8 u, Y: c" u* I
            int m, n;
8 }7 F" I0 x/ ~+ y* \            Console.WriteLine("请输入数组长度");2 d+ _) Z0 X, V' C7 E  l, s
            m = int.Parse(Console.ReadLine());//m为数组的大小% C! I5 ^) X3 I1 Q- s: _
            Console.WriteLine("请输入要截取数字的大小");- O1 O6 t0 S2 g4 D; y6 Q4 G+ x
            n = int.Parse(Console.ReadLine());# N5 |5 u8 K( Y
            int [] numw=new int1 C3 Q, J* I2 e" V" g8 W7 k
1 {/ Q9 |) o( {% l- O
&shy;&shy;&shy;;
5 s. E# a9 a$ Z) O; E3 |            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数' j: n% C  T+ u( Y) d7 c
            {# g5 V, I$ T) c  U
                numw[j - 1] = j;0 C9 m6 d9 J' P5 R
            }
3 }$ f- M- h5 v" ^  p            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!( \% W$ J2 b' W) {  u/ x; a
            while (d != m - 1); r! l5 i% B1 ]# ?
            {
( T# x. }' I! x. F& n# R6 r                if (i == m && d != m - 1)
5 d# x/ }9 s0 Y4 y, p6 c: J0 _                {; _  a' ]9 f6 q2 w3 h5 H( O
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
4 m! ?' u9 x# `( W& `                    continue;
' Q$ W; `5 |& W8 y. ^" r! q* m1 g                }& K, O- W/ k  e: a" f" b
                else
4 I8 s+ k' V7 u' t& _4 o6 C! y                {4 p/ u) G% U4 I; H# _2 W1 s$ Z
                    if (numw[i] != 0)
* T# X% h3 R% \/ K# z0 T/ Y                    {- z8 D: e1 D( [- c/ i
                        i++;
& S! m+ d. `7 J5 O3 q, W                        k++;
/ C+ {7 S5 v2 C6 I" W9 ]                        if (k == n)2 S- |9 U1 i; b$ H! p& A
                        {
3 Z- }" w* n) K' n! g) R                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
6 q% J$ O: j$ }' `: U" S                            k = 0;
5 I& K. e, }% j5 V              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1) f1 r: c) L( {* I) Q6 v$ S8 V: [
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
" }% m2 h. g4 x* e* ~+ V                        }
0 q* u3 x' W7 \                        else//输出暂时还没有改变数组元素的值0 g5 Y, d& u' [* Q! ?
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
4 x+ J2 {! `9 f0 G2 u( C+ Q                    }
7 A/ t4 s% ?- F) n                    else
1 \- ?9 D% ~! _  N; _                        i++;//数组元素为0,直接跳过,不计数。。。
6 t. o! R0 `  Q  G& f; o3 Z                }
3 k' W% z- D% w" `- @: p
2 x' v! S& M' ]; b7 P
5 F% Z9 B$ k9 P2 }6 I# ^" i; }            }//结束while循环0 O; @6 t: ?8 d9 P2 S* U
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦# F8 `- f# t6 t; M! i
           $ ]: I, M, H6 _8 q
                if (numw[i] != 0)0 v/ u* d: m. M5 P1 j
                    Console.WriteLine(numw[i]);
2 u, y7 F: m2 c: e           , \; M1 U5 q7 N* }# ?. C  x
            Console.ReadLine();+ U& e5 g9 f2 A) F) j# l# b
        }6 f/ h& ^: `, u
    }
7 c/ g+ Z2 B7 K: \" X}
: K8 T: O/ c% u5 i9 ^
小甲鱼最新课程 -> 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-3-3 19:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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