鱼C论坛

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

猴子问题

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

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

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

x
大家好!
, z1 t# N/ z: N这几天我在忙着编一个问题,我用了一种方法编出来!
9 t$ w' N7 K% P" w但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
2 D5 J, {. l, [6 l5 E  V4 ?% a( ^注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 9 |# V: c8 [1 \  z; l5 W8 p+ E* C0 q
; f) X9 _5 w1 C

9 u2 Y& j5 D4 B1 P1 [
                            题目
! r6 v$ C- \, c5 ^. W9 X# _* G% o山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。: Z$ T, f8 @$ d3 O( r& @
第一种方法:利用循环链表
* ~' x: D4 f* |2 w; R2 H3 n#include<stdio.h>
, F* a/ W# m: ?#include<malloc.h>" r& N$ P9 F( j9 d% s7 @6 G/ q
#define M 8            //共有8只猴子
% C- k" \' q. P* P5 P#define N 3            //数到3只时退出第三只
/ B" a; s  c0 c$ L6 _typedef struct monkey( N% _  Z- K, G0 J, y: G/ _
{int number;( Q# D) t/ P6 a
int flag;. x/ g# D4 C1 O3 I, ~  D! v
struct monkey* next;. e5 W2 S/ b$ X0 e! I
}MONKEY;
4 Y; ^/ ]. Y0 |& O( E/ omain()
3 I0 K1 C% l7 U{ MONKEY *head=NULL,*p,*s;
. I0 S& q4 ~# ?5 k$ l$ I# _) a  int i,sum=0,count=0;
) G/ J# W7 u3 T7 @  clrscr();              //清屏
8 g7 F8 `; U( N0 j) i. J! h) P  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存% w4 @# e4 G: |3 p! ^! A2 Q
  p->number=1;p->flag=1;
/ ^4 D: p+ t0 W# T7 R: ~( V* h0 }  p->next=head;" F) M) _8 z, g3 x* V& a
  head=p;
# X& {! C5 p9 J1 \' F  T9 X: f  for(i=2;i<=M;i++)1 a8 i$ A  F, z- d
    { s=(MONKEY *)malloc(sizeof(MONKEY));
  r4 s$ `0 b5 Y: M8 {     s->number=i;s->flag=1;
' m6 w8 a- ^6 p9 S     s->next=head;
$ m$ W3 Q2 \* r# M& T2 G1 |     p->next=s;p=p->next;7 ~6 K7 |) H8 ]) ~
    }
  p3 a7 m8 w& i4 b% g2 w6 |: Y$ l    p=head;
5 y2 {8 u% v/ [- P   for(;;)8 p, \& U) F! \  F' w  g8 }! I
    {if(p->flag==1)
& M, I6 y# R, b" l- ~" s8 F1 Y5 f       count++;
1 Z+ X3 k  a- \& |4 P     if(count==N)  d6 h; a$ y' ~4 }7 l3 W
        {p->flag=0;
, j% _( k& \' \" N0 A# ^! w         count=0;3 p6 L( \; F4 \! Y8 g$ ]- [0 ]) ^3 e
         sum++;}7 v  D; J" M  }' d* o( V9 l( `0 s
     if(sum==M-1)5 g& A2 t/ ^( i! e( `& X
        break;2 I% z, B* r, T& Z7 A; v* z; U
     p=p->next;- \. U& A$ Y% z: G
    }) a% f) T1 B% J/ w# Q
    p=
( f& W# W5 ~% p8 D# d8 z) w    head;
' p2 ^/ ~8 X, z    for(i=1;i<=M;i++)( }4 g- V1 M. T6 X+ m
    { if(p->flag==1)
, s( ^/ g9 z7 w+ S- ]        printf("\t%d",p->number);9 f2 C9 a" V* R7 m0 z. C- K
      p=p->next;  ~- ~$ ~6 v; A- r9 f
    }$ Z0 O  x( r: F. k/ {. J

" |" m, B: j8 h+ b6 J9 ?/ X5 H$ A+ i8 v5 s" V
& p, T7 T' A" F  t) E# x! [& m
}
" F4 s$ B# F" H6 }; |
第二种方法:数组0 @; n& s: Y- y
#include<stdio.h>' R8 v. G! H! T3 B
#define M 89 i- v6 }& @! h8 k% O1 |- K
struct monkey' ^$ d1 s2 f* Q& ^/ D
{int number;
. F% N2 a2 Y: H) ]' p5 _int nextp;, q5 P( G% j- M  Y
}link[M+1];  v5 O* a8 T' N) G% j7 ?9 u
1 O, _# {8 ~) H( Q2 H( M- b. e' d# `
void main()1 x7 z! Z1 J2 u  O( {$ w# J
{int i,count,h;0 K" Y+ Y2 w3 G8 r
for(i=1;i<=M;i++)/ |! J# f" u1 n$ _" X- n2 S
{  if(i==M)
* C6 p. b" A/ Z( e+ S   link[i].nextp=1;7 e9 y. P5 `$ [. a4 }9 Q7 ~
   else
, _" A- |  p% R. d) B- j1 a   link[i].nextp=i+1;
: n- S7 _2 z5 e% h  link[i].number=i;
- \, b7 b( Q& h( J}* h3 y) E! k& R8 m6 x
printf("\n");/ S. A1 F& J1 V' b
count=0;
! L, ?9 q! `. _. Q/ i+ d8 k4 Uh=M;7 z  I3 ?5 i3 _. {& ?; V$ ]. I
printf("依次退出的猴子: \n");
( Y+ V+ e% x# S& P: Hwhile(count<M-1)
7 Q6 C  G6 t& u& L7 f1 o  w) z: v0 h9 D{i=0;( n6 m; y9 \% `6 I
while(i!=3)
. U4 E- p4 t% E  E% v{ h=link[h].nextp;
8 x+ R1 O! F% V! f; a   if(link[h].number)
! o' y2 x. ?$ O; \. h     i++;}0 M/ e  k: E! {4 x

1 l+ O0 L, _6 }. Nprintf("%4d",link[h].number);
" e9 l4 i+ F/ s* ^link[h].number=0;
! z+ t3 L2 k5 t& i  D% wcount++;
: _, M- ]1 a/ H}6 u# i9 H5 O$ a) {

+ m% ]) C5 U& p6 Zprintf("\n大王是:");% E2 w( I3 t) G% K( f% z
  for(i=1;i<=M;i++)
* s5 {* S4 n8 S2 J/ P  if(link[i].number)5 F9 u& S! L  K. f8 X: D( H# E
    printf("%3d\n",link[i].number);- P! r- D$ P6 b

% O! S' U7 b7 V1 Z- E7 j5 V% J8 ?0 d" S' T  M7 K
}

- `1 e0 \8 }: _第三种是普通方法for循环
& s6 f% J% u0 V/ Z
#include<stdio.h>6 Z. X! V7 I6 @0 D! e6 Q7 P3 L
void main()0 W7 B# \4 \+ H  j" \: Y
{ int i,k,m,n,num[50],q,*p;. r) C2 Y0 Y; ?: @5 Y
    clrscr();" H7 L% h! H; U$ F
   printf("input number of person: n=");1 y- k2 N# @3 L+ X% v6 q& h7 L
    scanf("%d",&n);3 M6 e) }3 M# V% h# _
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只: j. a) r4 j" I# W* L
    scanf("%d",&q);7 ~, W, H- v: U$ N0 r
   p=num;9 e  K9 H2 V# N) Y1 p3 y
  for(i=0;i<n;i++)
( _8 N+ J5 z. C! H7 u0 z7 G    *(p+i)=i+1;' i* D8 r8 f# \' X
   i=0;: B$ A& e+ P* l3 B$ K4 n6 D
   k=0;9 a5 Z3 J/ D* p4 S. r* Y* Y# G/ Y0 L
   m=0;
7 M! M6 L( h& b4 O- X% O  v  while(m<n-1)
2 P1 N: f  M& u$ C  Z   {if(*(p+i)!=0) k++;( x/ R3 G* F3 ^6 n- P
     if(k==q); O6 [! V8 q2 P6 @! u8 a# }
      { *(p+i)=0;
0 L6 F8 d$ t9 ^- o* O3 A) Q/ B        k=0;
( Z( b* x3 H  D, y2 _3 m8 _' c        m++;& P& m5 J% I$ v, W2 [
      }
0 t" z, U( u4 m) k8 O0 Y    i++;
: n7 i5 Q; r! x8 @/ X    if(i==n)i=0;
" J' y8 u0 y7 w$ a   }
/ M* B/ a+ N, [  P- B3 V% X  while(*p==0)p++;
4 _. o  [3 m, e0 U1 ~5 S- W    printf("The last one is NO:%d\n",*p);
4 X8 D6 d$ x' q$ F- p& O     getch();
& e4 E$ Z( I9 t; U7 g: _% L$ L1 z* m6 @- ~: w) q$ f/ h
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;# X" X( N; E) X4 H5 c. ~8 h5 N
namespace 又费马达又费电
. u# f5 S" \; m8 F# p# a! P{$ o, N; E  T4 n) K8 ?1 v: D) ]3 h
    class Program
( a% m# I& Q! [7 O  a# P% w    {
& E9 }& p1 b) `        static void Main(string[] args)
' |! t3 Z" D' R$ e, Q9 Q        {* }* h5 I) \* G* |/ H! Y) {- q; j- I
            int m, n;3 ^7 T1 }% c/ P1 N, ~8 [! w8 [. J4 _, ^
            Console.WriteLine("请输入数组长度");, Z& w$ y$ ~) R; p% J. K
            m = int.Parse(Console.ReadLine());//m为数组的大小
( t' A9 z$ }, W3 H. e8 h1 X            Console.WriteLine("请输入要截取数字的大小");
5 V( w/ D- w1 Z& ?4 Z6 ?            n = int.Parse(Console.ReadLine());- O6 z) M) `0 K8 F# G
            int [] numw=new int) ?& H  L* f4 A  E5 L6 m; G. l6 J
  S) j. s; P8 n- @& X+ Q
&shy;&shy;&shy;;
7 j4 }! J) c/ N7 R; g            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数0 v  H2 \* E% q. b4 @7 O& Q, R7 Y
            {/ O  ^! ~( N* I" x1 ~
                numw[j - 1] = j;- z- j4 o/ s( p  V/ f( x
            }1 n+ k0 U5 X/ b9 ]  y3 G
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
% s% B( X; c( t            while (d != m - 1)
3 |8 O. [+ P3 _4 `0 b0 y& }% e            {
, i, w$ {* P/ f3 x9 C* d: B                if (i == m && d != m - 1)+ G' e7 R& m' R2 a1 _
                {0 X5 z: Z) k" c1 {
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!' D2 m/ w. F% x! b' I, f4 v
                    continue;4 ]+ O  I4 ~: R9 T% I" R5 \9 K
                }! C8 y! t4 H  d( }6 H- M% N* Z
                else
% g7 i5 m$ S( J/ }, w" {                {- X8 o! u  Y  q# b. q
                    if (numw[i] != 0)$ Z) W4 b  i/ _% P% P) U9 x
                    {
3 \! o5 P/ L1 J1 g/ X4 K                        i++;
  {; }; K/ M( N; ^/ v                        k++;
  t: L- r: R* b6 P2 n' r4 Z$ h                        if (k == n)
  v# z6 [* A2 [4 Q                        {
' p$ \) G/ S+ c; e8 K2 X                            numw[i - 1] = 0;//把在n位置数组元素的值改变了' a8 k# }0 L2 T. }
                            k = 0;8 `) e" o( [  ~4 G! P
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
* T: e/ h- {% d3 J3 b                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
' N# V4 z' I5 X( C- G                        }
' k/ v4 o2 ]9 w# v                        else//输出暂时还没有改变数组元素的值
& l5 f8 B& J! v+ p# \& q( }                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
3 a4 |7 \0 q. d$ f( c# c+ H                    }. E% S: V- H9 x$ |/ @3 o
                    else8 @6 ]5 E; h) r$ w8 j0 K
                        i++;//数组元素为0,直接跳过,不计数。。。* F# C5 Z, }6 v5 |9 l
                }
3 ?9 D* [( m/ T3 y  {
$ V& `5 D1 {: t: s# H2 Z0 `3 R+ Z/ x0 F1 {
            }//结束while循环4 l& F" M! L3 {7 G. w& e% @
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦7 o7 o8 G' f+ j( j# i0 x
           1 o5 e* S; E+ Y5 I7 b* U
                if (numw[i] != 0)( f# S, `) X: n- `6 M/ V
                    Console.WriteLine(numw[i]);5 p) T8 e0 k0 b4 {+ W8 G) o
           
7 d" ~- N' W3 J$ a' f: G            Console.ReadLine();& U3 p; J! ]# |1 T9 l7 K. C
        }
% r2 n6 f! J; e% ~# o8 j8 z- z3 |    }
" K9 C- L* W4 R5 j2 H}7 F4 H' ]& d- N1 |- 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-7-22 03:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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