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

猴子问题

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

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

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

×
大家好!9 v& P) I# n9 K: _
这几天我在忙着编一个问题,我用了一种方法编出来!
) s+ a, X, ]1 Y' N但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!* ]. l& L) c$ \1 V2 |2 R! z
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
1 Q9 N6 K' l$ O0 a( i7 r0 s8 z# i% A
" w/ R4 X/ `; f* x' f0 O0 P6 D9 d
! [8 Z& y8 h) P1 H, o( n: K( o7 z
                            题目5 h# G% I. \4 c& J- Z& Z5 H
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
) U3 V2 Q; M, j. Q3 R8 @第一种方法:利用循环链表
" l7 |4 H1 I( k5 V7 c#include<stdio.h>
  @# r& D/ c& L( `/ G# z#include<malloc.h>
8 ]2 D/ t* A# q, I" p- h/ D#define M 8            //共有8只猴子, J) E3 }4 y7 M+ o
#define N 3            //数到3只时退出第三只
! e: c2 e* c4 Ytypedef struct monkey
% y# e8 x" ~6 x9 t9 ]0 e0 Y{int number;
1 C% @" V( g0 r. ?2 ?int flag;4 J, y0 g  V5 q/ U
struct monkey* next;- I3 v9 {1 D, B2 h& g
}MONKEY;
+ [& x. C( q8 O6 n$ @. Ymain()
% X& \% C. X2 c4 |; L, x" j{ MONKEY *head=NULL,*p,*s;; O: L* u- |5 I/ J4 E" r9 C
  int i,sum=0,count=0;
7 G) r% ]8 D4 Q" ^7 ~% K  e1 W2 q  clrscr();              //清屏- n8 G+ G; L" E! Z% ?, k) Z; E$ }' G
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
- V" |" O$ e. D7 }+ g8 [- V  p->number=1;p->flag=1;
! }3 B5 u) ?6 O8 F( g& C; _4 e' k  p->next=head;+ {8 h8 |( n% w4 e1 [
  head=p;) |2 u: j( e" P" M! \
  for(i=2;i<=M;i++)
( H$ C8 [9 j! y- z    { s=(MONKEY *)malloc(sizeof(MONKEY));# A. v6 f8 ?! p! Y* k# r; Y
     s->number=i;s->flag=1;
& ^" u2 @* L+ h  }     s->next=head;
4 `5 u6 Y0 X0 N; j* t9 m     p->next=s;p=p->next;% |+ P5 L4 g5 t$ N* h
    }  Q9 U( M. N" I& ~
    p=head;* G' U; I& ~4 `; l
   for(;;)
, I1 Z# F$ H/ }& _    {if(p->flag==1)$ e1 F* ^8 T% d3 J+ _9 @6 P5 T* r. ~
       count++;. B% [2 H( |4 I/ T
     if(count==N)
( ?2 o! j% k- \        {p->flag=0;: r6 |, @( g" p; A
         count=0;
! u" G9 K9 a9 T% v6 a  @         sum++;}& [/ z$ S$ D9 S8 d
     if(sum==M-1)
- J$ @3 z  Q+ @" ?' J        break;+ h% a  N% e2 U- J; b2 j& Y
     p=p->next;) S; i- N) g% s8 f$ a2 p! Y4 N1 U
    }9 b) `  e. A6 U
    p=2 a' q( k  X8 L) T
    head;, I# [4 d. h' m6 J3 Q
    for(i=1;i<=M;i++)
$ ]. v9 D& r) ]! h" {  m    { if(p->flag==1)
! S: b; h/ o* u        printf("\t%d",p->number);
+ ?) }2 ~( O5 s4 r( ^3 U      p=p->next;' l8 J0 U0 U0 q% y/ c, a
    }. l3 B  _/ ]! U/ e
" L  \9 J; }/ o6 B6 k  K% r! v' r" e; C
, Z* w; h9 s& Q$ t2 N% b
  L( R; k$ g' ^9 C) R. G
}
) S1 {; A/ d" \: Z9 X3 W0 w
第二种方法:数组( s+ m# L# n. U0 d+ x
#include<stdio.h>
( h, `, O9 W: W% O6 A#define M 85 A; r: k% D! C8 Z
struct monkey) X0 f  a& C& K7 l
{int number;- v' z/ S5 o8 d) f$ Y
int nextp;* }! L: A/ Y+ Z1 Z0 T. K* K. ~
}link[M+1];
$ g) E; A( S) \: E; y1 P; h5 I5 W- b, o1 m3 a6 y" j  L
void main()$ U' s; g, O; A5 B3 v
{int i,count,h;0 U3 ^1 ^* D$ j( r
for(i=1;i<=M;i++)
- j3 ~6 {3 V+ a$ N{  if(i==M)7 y- L% F" ^& ?/ Q3 n7 T
   link.nextp=1;
+ }+ p4 x& g7 u! {1 A/ F% u& w   else3 g& t- E. U" I5 w" Y
   link.nextp=i+1;" Q5 H0 D' {  F" ^$ ?& U
  link.number=i;# n8 [- ^: ?: T- t
}" c% d/ x8 |# X+ S8 K
printf("\n");
9 e$ w: ?7 e7 A  J# K0 Jcount=0;: ?0 R, g4 Y% E* v
h=M;
6 C% N8 b: R4 D( f* p& Oprintf("依次退出的猴子: \n");0 D) v  z+ X1 D3 k( p( {
while(count<M-1)
7 ]/ y7 N  w  B: b% I( o3 B{i=0;
  E$ \+ l8 N. Z1 Wwhile(i!=3)
$ S) r- O% c. G% \, {. e6 q{ h=link[h].nextp;
' Y6 |- P. t2 v1 F3 h: Y3 f   if(link[h].number)! v, l5 G8 V+ O% \! ?
     i++;}
7 p2 u1 f4 z7 ~; S& k1 b4 d) `9 N
printf("%4d",link[h].number);% ~8 E5 I5 M6 k. O, ]
link[h].number=0;% h' N4 L1 O4 Z) P2 ^( `5 ~
count++;% G& Q" T4 i8 P' N+ @4 d/ H
}: B" Y0 i5 V9 N$ l' H( T7 J
+ A/ b* l$ Q7 X* A& F! n0 b" D4 ]
printf("\n大王是:");" l' L0 w3 y% ~; O/ `
  for(i=1;i<=M;i++)
' M9 }9 @, L3 V. }- Y# ~  _  if(link.number), e) c8 e: ?/ l3 x2 R4 i2 t6 }
    printf("%3d\n",link.number);
2 P2 C% H4 F) f8 {8 l
1 _" y2 l+ S$ M5 N% {8 K4 \6 q
! s7 t- |+ T# P4 N}
/ b) G0 e* j; _3 @* @+ x2 `
第三种是普通方法for循环

/ Z; I  H6 I& H  f% ?& D) i#include<stdio.h>+ O% G* F( U5 e+ H# l/ o5 E5 E
void main()  v0 f' L: S4 ?5 t6 s" |# Q7 @7 c
{ int i,k,m,n,num[50],q,*p;
7 g5 M2 L+ }; L    clrscr();7 b3 S- r9 @4 u6 P
   printf("input number of person: n=");
$ R% q7 ~) x9 ]/ ?. T$ Q8 g. c    scanf("%d",&n);
- n( T7 O' [1 A: ?8 `) x5 xprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
! h! P. \* h* S* ~+ C/ z    scanf("%d",&q);
, M9 K( u) k: B4 K3 a8 I6 Z   p=num;" a7 _6 h% Z: u
  for(i=0;i<n;i++)
* F* f$ q- k& m/ ]# q4 y- a. u    *(p+i)=i+1;6 V1 }: h1 e/ q# }; w# Z: {
   i=0;, O2 R" c! s2 n7 e
   k=0;' K" u+ g. ^/ E+ v8 Y
   m=0;4 _/ h. b# D: `  l6 e& b( I8 G1 j
  while(m<n-1)% R4 t6 U: n( z
   {if(*(p+i)!=0) k++;
% ?# j8 ]1 r- m2 b* O' ^) G     if(k==q)
' {& E6 C' D; Q) u, F: [      { *(p+i)=0;$ W4 O2 O6 b4 Q5 u/ h( P/ ?# |
        k=0;
  i9 E- ^- m/ w1 _. K        m++;5 E- }8 s0 S/ l. ~6 o& z) U
      }. v, L& d: G8 _/ Z
    i++;
7 n# V3 @/ [& D( J    if(i==n)i=0;: S: D% E5 u5 ^9 a2 E
   }
/ E9 Z2 E) A$ ]$ x. }  while(*p==0)p++;
3 I9 E) A4 _; G3 k5 Z0 K    printf("The last one is NO:%d\n",*p);
' f; g% B5 Q. ~3 y     getch();6 b5 m) p6 h1 u% t

" {$ F3 {8 O& P3 A5 }& z2 i) t, e}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;4 p0 Z5 h' N$ I- q0 U
namespace 又费马达又费电
9 W# H! W$ z$ v* F3 v{. l; u- H5 b. B  M" ^# \0 d
    class Program" \; f( o1 E* C
    {1 t6 i! ]: W4 q: |% F# \
        static void Main(string[] args)( {! T2 J6 l7 }- A+ ~* `6 _% v
        {+ n+ ?$ b+ s+ S  x5 s
            int m, n;
" a5 W6 p& L9 Z- A2 O- S- S            Console.WriteLine("请输入数组长度");5 {; K8 ~( J% E: S
            m = int.Parse(Console.ReadLine());//m为数组的大小
- d, B) X6 F7 k            Console.WriteLine("请输入要截取数字的大小");, v  d$ a8 f% l  ?! ?
            n = int.Parse(Console.ReadLine());. \( g; p& F( g5 g. ]0 p" H! K$ I
            int [] numw=new int: C; ^1 j; Q( T9 {
& L0 P4 P5 j1 {8 H. w
&shy;&shy;&shy;;2 j7 g7 S; c. o' o- F0 Y
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数4 m& p8 J3 h# M! d3 A
            {
# F' v4 h. Z) ^2 P) ~9 H                numw[j - 1] = j;
4 E1 ^- ]$ |0 ^) |7 h( |            }3 [# T: ]/ q* \: H4 n5 e
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!3 Y! |. L, A, C; ]
            while (d != m - 1)  `# x4 X' r8 p9 y+ p
            {# L4 i! X0 b! s( t) N
                if (i == m && d != m - 1): s& M; ~! X9 d
                {
& e" c2 [8 s- i2 K1 X                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
/ t9 ]5 B/ n# z8 C& ^. t  j$ Z+ K                    continue;
5 k( d. M- L4 B/ z2 h, Q& W2 {' n                }
7 e1 {' l8 W" s, m6 ~, T                else6 ]# P2 v2 y1 u' @
                {
( D4 ]+ ^+ f: q/ T* H, v5 ]6 [                    if (numw[i] != 0)9 L- R6 T: ]/ m- ~# o0 o
                    {
, l: R8 I: V+ r                        i++;
2 i% L7 ]" w6 o' r                        k++;
$ M; [/ Q+ o6 m1 ?4 p2 y                        if (k == n)' u9 T: O9 M" p0 D2 `7 i
                        {/ \; D" o/ r! u/ W# a
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
3 R: L2 G8 `$ k! ?$ `                            k = 0;
8 q% F% Y4 A& c1 i# M              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小10 @3 ~3 p. y7 ]1 r
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);2 J6 e" y* q0 U( F4 t
                        }
) _! k# D4 x, f, z" W7 `9 U" N* l                        else//输出暂时还没有改变数组元素的值
8 w  [4 `4 v, m/ ?4 P$ g% P                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
: S, E& C6 r. d: K! ~, J, a                    }
6 H4 O6 n. v& g                    else) _# n8 A5 g) G( M
                        i++;//数组元素为0,直接跳过,不计数。。。
+ ^5 j' ~- `2 k! M                }0 h! I5 k: Z+ _% |  f
- o9 R$ W, i: ]5 ]& e

: S( N) p4 J) p            }//结束while循环
3 T# B2 \) W& ^9 p4 v            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦; }9 V% }; H$ m5 A! R, ?* R5 ?
           8 X& V4 k$ V: ?; C- P0 c7 o
                if (numw[i] != 0)
& O4 W% q! I6 x: h  R6 g                    Console.WriteLine(numw[i]);% i$ x$ C0 \% ~. h5 M' i8 ]
           
4 o, g. b. F4 l# M9 j/ }. O' x$ h            Console.ReadLine();" r4 C5 w6 ]: q+ N) @# G
        }- I2 T, J9 s2 x5 N  e/ n" a5 u
    }) j4 g5 ~7 L9 F/ p3 D
}: ^* A0 z/ H* h, H( q5 |
小甲鱼最新课程 -> 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-7 03:36

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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