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

猴子问题

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

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

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

×
大家好!
! a3 k0 O7 q2 {, T, N5 K5 l这几天我在忙着编一个问题,我用了一种方法编出来!8 d' H! Y; x& w
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!+ }# ^% s( ], r9 ?2 H3 R7 p/ m
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
# U9 W/ d7 U4 a! \% @7 Q' E/ d( F( X3 o& G2 B6 }+ C6 ?
( [. o( W& W4 r$ X+ q
                            题目& `1 E+ U) S# j9 C, D7 r% D
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
4 Y% ~# h: s+ [- V8 }第一种方法:利用循环链表1 y4 c5 I) A  i" u) s4 A6 a1 o
#include<stdio.h>& U4 U( d/ {# ]) P' F' v, z4 t
#include<malloc.h>
% j9 N; ?, b- k* `; |#define M 8            //共有8只猴子
; S3 d0 b7 @8 O: r2 l+ @#define N 3            //数到3只时退出第三只) g# ?0 j! Z. ?9 ?6 s0 \
typedef struct monkey
4 R9 [. t6 k! b) W9 X* m1 E* v( N; W{int number;# x4 P3 F' ^& o0 j" m/ A
int flag;' X' j7 m. L7 w. j0 y2 Q
struct monkey* next;8 }2 L* C! G5 d: ?! o+ @
}MONKEY;
) d/ [' X* X" k3 Wmain()
, w! i8 J, T# Z. i4 p9 }/ b{ MONKEY *head=NULL,*p,*s;
) j& [' m6 Q5 R, w; G! {1 V  int i,sum=0,count=0;
: d/ K! W3 B6 S  clrscr();              //清屏
' ], `) `' @$ F6 c# Y' @! w0 h9 g  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存/ ?4 y  h+ \' E
  p->number=1;p->flag=1;
/ X# y. u6 F7 z1 @' I0 Q+ ?/ k  p->next=head;
" Y& I4 l' ~) Y& L2 u. }0 k" c7 t$ f  head=p;/ G9 v; H0 W3 h$ u9 d0 w
  for(i=2;i<=M;i++)0 ^) ~" J5 z$ q- \6 `% w3 r& a
    { s=(MONKEY *)malloc(sizeof(MONKEY));
2 a6 U+ v6 S9 }; M     s->number=i;s->flag=1;
: D* y6 L3 p* R) M     s->next=head;8 O$ g8 T1 ~$ M+ g* {; D6 q
     p->next=s;p=p->next;
8 k: B- Q- p* M0 o& K2 s' i; R% r    }
' i* S# W4 s$ v    p=head;* s( ~2 Z  G* P
   for(;;)/ f' b. J. e6 _3 [
    {if(p->flag==1)
; N( K4 A% G. b6 i) u: T       count++;
+ K5 F" j% m# b     if(count==N)
/ S# G6 K4 f& g        {p->flag=0;
# m) G. X- u, _, G         count=0;9 x) c2 I% M8 x
         sum++;}
0 _. t- G, q: X3 t2 N" c  Z     if(sum==M-1)' v/ d& N+ z8 D; u* Z) F
        break;
1 A( H3 \0 z" R& K3 x* l     p=p->next;
( w* q: V2 ~8 `8 O    }
! \9 A, n/ {6 l, d6 J    p=
6 F! d. M* T  _7 f& C: Q4 M! f    head;4 z, w+ o4 Q; m. m5 `3 V$ K
    for(i=1;i<=M;i++)( V- e8 a# e7 a" P: ]5 N
    { if(p->flag==1). S8 u- a. L+ _; t
        printf("\t%d",p->number);( Z* W4 C# Q$ \- Q# i
      p=p->next;" d$ @! I0 m$ v4 [, X; B
    }
8 T8 k! b; l6 b7 S
- l+ U( V6 i: S
8 t; x, v( d+ [/ [8 Y& |4 |+ t4 B3 u8 i8 @) u; ^2 r
}

, r  {2 @8 Y6 |: E8 x9 ^第二种方法:数组
3 n5 _# D/ J1 j: n3 Y#include<stdio.h>
4 @: b* ]& {) W3 X#define M 8
+ ]4 g$ i6 p9 g0 s: {/ ustruct monkey; `1 V2 G0 P6 R  u# \5 h
{int number;8 A& R8 {% e- {
int nextp;
* n, z; H) w8 m' y+ ~& v: h}link[M+1];7 |8 E" C" w5 a5 z: @* L+ k
  P, p9 @. L8 w; D) d- A1 w
void main()
: Q) G' k  ]  J) {7 S! g{int i,count,h;1 ?: s0 C* T% n0 e9 X% j4 g
for(i=1;i<=M;i++)
9 C7 _+ |- U0 x7 q{  if(i==M)
2 t, I3 c) P: w5 {) x   link.nextp=1;/ Z8 u8 }( S  m: J& m+ k( C0 [
   else: r9 X* l0 u5 \' P" o$ J
   link.nextp=i+1;' s, U9 j6 U- \! G0 J5 x
  link.number=i;: y7 ~- \. t, }% I$ v- f! g; N- {' d
}
. ]: C7 ]( B5 e8 _; ]# fprintf("\n");
& M9 A; m( W/ ~5 t; H) c" p0 jcount=0;, ]& |4 k1 \% u+ _# Y$ b
h=M;* r* e; a% E' o' h
printf("依次退出的猴子: \n");
+ g/ f, A* E$ c/ ]# g8 t  L' e& M/ K' lwhile(count<M-1)
* R* l; O* t3 ~5 }{i=0;0 A- {' L1 R9 Q
while(i!=3)
7 m8 ~* O0 a! }( \- _{ h=link[h].nextp;
* ?. s$ E1 a* o- d& ?  P& f   if(link[h].number)3 N1 C  A; M4 y# Q
     i++;}
8 e' L% o) f$ r' m- ~1 P( u0 \1 p* ]& k
printf("%4d",link[h].number);2 ?2 _. q6 j% d& L0 z4 i
link[h].number=0;
# ~' W. ^% w7 b; Y' Ucount++;
  q+ ~1 }( D. A  e* \" u. v+ r}
8 V8 r# {2 R" d: M: l# c0 ^: v3 ]5 E" d4 M9 o( h; `; p
printf("\n大王是:");
5 C) j8 f) z3 r$ S2 N) r% ?. M  for(i=1;i<=M;i++)
6 m8 w3 W6 x* W6 i- {: }  if(link.number)
. x; s8 h! A8 m4 D* M5 q# b    printf("%3d\n",link.number);4 Z( ~6 }1 {, _2 p( O, ^: ?

" m/ ?0 O; d9 P) k) W7 A0 [9 F
" T/ s  k$ M8 p5 o7 x3 H}

9 I2 u) z; _7 R: h: H9 z第三种是普通方法for循环
6 {1 Y$ R& C% g0 [2 R
#include<stdio.h>) f" S/ @/ t+ K$ y6 t
void main()3 |! K% \/ {! f  k5 v: G
{ int i,k,m,n,num[50],q,*p;& b0 h: G' z  [& [
    clrscr();$ O& t: J) R; j" h0 F
   printf("input number of person: n=");" E9 @+ ~3 l9 n! _# A
    scanf("%d",&n);
7 C. b1 t7 |' ?4 Z7 dprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只! B4 o) ^4 @# ^
    scanf("%d",&q);
% I9 B4 D. |! s- C* w7 z   p=num;* B7 O& ]) s2 A3 M: X4 C
  for(i=0;i<n;i++)
/ S) y0 l+ s" _7 p2 W$ k' d" b' k    *(p+i)=i+1;
. z- j2 U7 F$ n/ W0 m" f) x   i=0;. X# O- U4 L. {: Q, g6 ?$ H
   k=0;
+ ]3 c! a+ `7 V) E; i   m=0;1 c# K) {: y3 \* |
  while(m<n-1)% L/ K2 ^7 V3 o- a3 X: V! D
   {if(*(p+i)!=0) k++;1 ]  }/ s9 K& j" n( a- }
     if(k==q); s' H. N- P6 R
      { *(p+i)=0;
. v; ~. B3 c) ^6 p        k=0;  L. s: P) _/ F, h5 _
        m++;
# A, N3 G( M* v+ R! R, J      }
# F- k5 F) M( l* O- l    i++;1 U, _* a8 ^7 n4 m
    if(i==n)i=0;
4 J7 B# T/ ^+ j( q! O8 j. y: e* s' o   }1 U- ~. v/ j( w4 I! i! x
  while(*p==0)p++;
# V$ V, B7 Z+ m3 _    printf("The last one is NO:%d\n",*p);6 \, X6 f; Q0 ~. j9 f
     getch();
4 h5 e. S% J3 L1 @/ \% J6 L1 C2 h/ O: |! r
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
4 q5 m$ w- t" `& Gnamespace 又费马达又费电2 Q4 w+ j/ k( y- T6 @
{
2 h+ G8 g' O8 [6 q) t    class Program
# m" e/ x7 }$ I. W8 ]    {
+ `+ \- X3 _( h( G3 _6 t2 ~) X        static void Main(string[] args)  K9 r+ d1 j1 s  \
        {
5 F- m9 n7 R' y2 c! q            int m, n;
/ m4 N  i6 i" R" A4 y8 e7 h            Console.WriteLine("请输入数组长度");/ d) _  g3 t; a8 {) \
            m = int.Parse(Console.ReadLine());//m为数组的大小
5 v" Q$ \9 m+ I. ~9 i: L            Console.WriteLine("请输入要截取数字的大小");
. r( X: `1 \/ C$ P, p            n = int.Parse(Console.ReadLine());
& s- v% v7 b4 a2 [            int [] numw=new int) [$ `( s5 W/ ]- G- ~: [6 s, e' s

$ l0 p6 x# u" {+ r5 y&shy;&shy;&shy;;
/ b" w. R3 |. v/ R            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
. g/ j! U" I8 N            {8 C: s, w. j' ~) K3 @. m
                numw[j - 1] = j;
# k) x/ n) Z0 T' a$ `9 v            }1 ~7 ]+ O7 F# v+ F- O
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
* R4 O0 R  A, G8 q7 f            while (d != m - 1)
5 u( C. i6 R; e& ~            {
- E/ {. w  ]( m$ o. J                if (i == m && d != m - 1)
0 r) S+ W7 e2 D7 P1 e$ K& L                {
& j3 L, G' m7 O4 ~0 Y+ g" }' p3 j                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
& h2 Q9 w' H" o) e, L7 N) y                    continue;
# a, p& d) k) R8 g2 h+ ?                }
& b- v3 e% E* H                else3 ]! r+ a( @4 E/ w
                {
# o3 p$ C" ]' g0 R/ C                    if (numw[i] != 0)2 a; X; ~/ D5 T+ K' ~
                    {% o- G3 t( a8 Q7 o5 _6 h5 T9 z8 v
                        i++;% f( z" c8 K3 a7 f1 u& u% |
                        k++;: c0 e  h5 t% @# H# [' w3 w
                        if (k == n)
% D7 `+ l/ v# S& k( {( W7 W4 }; N1 {                        {6 Z# K6 Y: ^" y3 `
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
) z8 k: |0 d$ s6 ?3 i6 `                            k = 0;4 [7 c: q" v0 g3 i7 x
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
8 O4 o  H! a# x% y                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
3 \$ k# C: v+ Y' M' E                        }! l0 \6 D$ n4 _# e, f9 S! F8 B3 @
                        else//输出暂时还没有改变数组元素的值5 ^" j( r) i4 q6 e% ]5 ^
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);1 J. y" h- c  R& D/ l5 U- V9 ]
                    }1 R1 v8 Y( s; F7 d
                    else
0 j: ~- j- Q# f3 V9 P( L) z                        i++;//数组元素为0,直接跳过,不计数。。。7 a- t1 c$ i6 o7 Q5 N
                }
8 e; k4 ^% K! ]) z: Q
( j8 L: J7 V/ k; n2 ~# M8 x/ `% x7 p+ |2 z
            }//结束while循环
8 @  k/ ]( |: e& s2 d% t! x            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
* r# R0 h. I( {/ w' k           + E- p! z/ E2 B+ f5 [: t2 @' s
                if (numw[i] != 0)0 N& w0 L' K& M; m8 {
                    Console.WriteLine(numw[i]);3 n0 ~, q, \8 ^) @8 {
           
8 p( k+ x) {- S" \7 E            Console.ReadLine();$ a2 P4 m% f7 D5 J1 s& c! X
        }
$ r: T; z& v$ @/ c/ p& K/ w    }" V+ f% [4 g" D& f' Y! j2 {3 n
}% G. Y! b6 @: v1 f! @" w5 s
小甲鱼最新课程 -> 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-12 01:26

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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