鱼C论坛

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

猴子问题

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

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

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

x
大家好!
6 _$ F* a* `+ T# j这几天我在忙着编一个问题,我用了一种方法编出来!
: E1 r2 {: w$ u( _1 G( {9 j4 R+ S但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
) U- \1 u& J1 F1 Z9 E注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
2 l. D" o, A- F& C5 X/ q3 o. c- O: N0 G& [4 e
' ~' P3 {, S0 [# W9 a  P
                            题目: b# ]- m/ w, L
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
  r) j# C7 v. ^! V& X2 u第一种方法:利用循环链表
3 g/ \2 W4 ^% t! Q/ N#include<stdio.h>
/ p  @- _0 m9 @$ `3 c#include<malloc.h>
1 H: }, \3 D& r1 m1 g% ]1 {#define M 8            //共有8只猴子7 F( N/ V6 o& _5 K7 R  W. B
#define N 3            //数到3只时退出第三只' A+ h* C# W" S  `
typedef struct monkey5 h5 w& O, h+ a  O( k+ S
{int number;
. b! S5 q1 G+ _3 U- iint flag;1 ^- }5 h1 \* K
struct monkey* next;; ]* c" p" Q  @; Z' _: \
}MONKEY;
) ?. P* U( i( t5 `# `8 Vmain()4 x+ D+ W% n9 p# W0 p3 ?. u, f# T) ?* B) z% P
{ MONKEY *head=NULL,*p,*s;; U# H9 T5 M( c* ?! m
  int i,sum=0,count=0;5 G3 Q' f# w3 {& ~
  clrscr();              //清屏
4 {* V- M1 d4 g- V) p: _! j8 d, @+ X; [  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存) P9 V6 v" g* C  q; A% q
  p->number=1;p->flag=1;1 h6 C3 e8 I/ j  H* L- X* t; O# L: f
  p->next=head;! O9 e) }" J" U
  head=p;8 z& F, T; S8 Z. `0 H1 V; _6 O
  for(i=2;i<=M;i++)' x- G, Y1 ~* Z: d; ^+ G/ t+ _
    { s=(MONKEY *)malloc(sizeof(MONKEY));
- F- ~4 [# K, p2 M2 @! F     s->number=i;s->flag=1;! O) O' P4 i; Y7 Q
     s->next=head;
# _9 v/ `& e- H5 h! J  X     p->next=s;p=p->next;$ \4 I7 T- L, g7 j, _5 w$ `. |
    }
: p  [. \4 A1 V8 D2 W" f4 U    p=head;! w4 v; F! F% w6 V
   for(;;)
! K2 F" `1 a- i/ L, c    {if(p->flag==1); F2 y6 k! z: q
       count++;
( Z3 Z  X4 _; C! l- |* c9 B     if(count==N)
% s% o! C9 Z/ ?. c        {p->flag=0;
) Q& o  m: a! b0 c, H( S  q         count=0;: N5 h& E$ e3 x
         sum++;}
" V1 ^. I4 T0 |     if(sum==M-1)
6 v' j6 p; P1 w7 v# G+ J        break;
5 i" E8 X( s+ ~! h! A4 w/ Y     p=p->next;
9 o- O6 e6 \( j3 R+ r! O& a    }! H- ?* U' x2 p: f; E
    p=" p# [, a! K$ k  ]' D+ p
    head;
* D) |6 G  K- g3 n* a; z* J    for(i=1;i<=M;i++)
  R3 q: h0 L# `( ], h% T1 e    { if(p->flag==1), X9 r$ C* f" p) K
        printf("\t%d",p->number);
) V: M" I+ W, w      p=p->next;
& ^8 C) Y4 |& h( J# E, q! ~7 `    }
. Y/ k! h- q: U+ M1 [, M3 ^2 O; p/ e

( u( g- t. p# i; O, U, X" L/ U8 J* N( @4 y
}
# s7 o' n9 c% q$ g8 z/ N8 B: H& l1 K
第二种方法:数组# o9 \" N" Z* K# B  L- E1 W, j- J
#include<stdio.h>
7 G& J9 `) M# T5 j#define M 8
8 _2 u* w% {: B) D( ]9 ?struct monkey
7 v% ~/ b* t; k& K7 ^2 D{int number;
; h' p9 z8 {! l9 m0 q+ ~; [int nextp;
* N- y5 D, d) U) h}link[M+1];5 X! v6 R' t- j4 d: d5 C' Y
6 S+ w& @5 x* G5 \
void main()
7 |% t" L/ M# p7 {{int i,count,h;
) U+ Q+ m3 R! Z; y' ~$ @: Ofor(i=1;i<=M;i++)
5 \. ?' f+ s  s. N+ c{  if(i==M)9 h. F( J8 \9 _4 Q
   link[i].nextp=1;* g; Q0 g$ a- Y9 h3 `: l+ f
   else
$ b* N3 I  N' E( K# _# }) p+ c   link[i].nextp=i+1;' O3 Q8 }+ Q* V5 Z& E! O* d
  link[i].number=i;, R0 c$ K. a+ Y4 H# |7 s& z% Z8 \1 E
}
& k8 I3 j$ D: b; }printf("\n");) Z2 Q! }8 B8 k6 t
count=0;
- X( d* H5 e1 D' a: ?% G# c' t! Wh=M;- D9 z4 e7 q! F, e/ H
printf("依次退出的猴子: \n");. O9 R" O: o( ?2 p6 S0 a/ C
while(count<M-1)- H! ^# L. X8 D1 k/ |" e& Q
{i=0;
( {2 g. @# A0 ]; ewhile(i!=3)# e7 x, s% o* Y* P) s0 A
{ h=link[h].nextp;0 l( H8 E' Z0 M, s, ^9 n* w
   if(link[h].number)
' |  G; @/ q5 Z$ L     i++;}  ^8 u) H  H  y$ {0 Q8 \  V% Y' R) ~# o
% \% h& K! [8 ]/ p1 b
printf("%4d",link[h].number);0 m; _8 f- m) ]
link[h].number=0;$ ~. V( T3 W* h1 }2 O! U
count++;7 Y( U8 [5 b0 j4 Q+ W/ o
}
( s+ U2 L2 u/ b! j7 u* F, h* `
+ @# n2 Z: W0 W# F0 L8 aprintf("\n大王是:");* Q5 O8 f$ a! _4 K1 x# n
  for(i=1;i<=M;i++)
3 a! d6 N; D3 r0 k; a% N  if(link[i].number); Z* X+ \+ j+ O$ A" G
    printf("%3d\n",link[i].number);& F) q3 |% o: ~! ?$ G

) b1 r! m1 l* @- ?" m+ a8 R  t* Q; n5 q4 A8 t% w5 ?, m
}

; ~8 a& o+ f, G5 L" F3 E* C' l) q7 E第三种是普通方法for循环

" L0 O2 Y- Z3 v' N2 z. v#include<stdio.h>
3 h, w4 G3 u+ ], e$ Fvoid main()
, E5 A4 b/ t( X$ J! L{ int i,k,m,n,num[50],q,*p;
7 Z) N) ^! p) u8 d    clrscr();5 n' E% x) u8 m; ^# W( I
   printf("input number of person: n=");
0 u4 r+ R' x" i    scanf("%d",&n);9 e; e  M2 I) d  `
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只+ w* ]9 G8 k+ I0 c8 X
    scanf("%d",&q);4 E( h) \1 Y$ B: c) E) f
   p=num;- {0 ]2 p. r: _
  for(i=0;i<n;i++)
; P; Y) p  f, S    *(p+i)=i+1;" P# G3 V* y1 A* [  E+ |
   i=0;
$ Z% C: X; k: K' @2 H   k=0;: r- y/ _* b+ h! l: U
   m=0;
. I% ]8 y# f2 h! u% P$ |  while(m<n-1)
7 y6 A' p* O$ h' P  j- t   {if(*(p+i)!=0) k++;$ b) C% I  Z+ Y
     if(k==q)
  r# Q2 h+ I1 a% ^# H: {      { *(p+i)=0;0 @: t% G- O9 l# c) k% l' I" X
        k=0;
9 O& M, p, n/ O% m* L5 x' l        m++;4 W. {3 u" x% W" \5 v
      }+ E6 j& F. v) ]3 D9 k
    i++;
+ D) K8 Z) a0 }    if(i==n)i=0;
$ R1 d: m8 Z2 H/ u0 x# |9 B" [! R   }2 M2 H* p- O: m/ j5 ^3 h3 V
  while(*p==0)p++;- V* Z; U8 B  n
    printf("The last one is NO:%d\n",*p);
9 I  V- u; ?8 H% a1 @' z  {0 ]  V     getch();
( _- f8 K0 C( e, ^. ?( r9 G  v: _, g% |( p/ c3 A- p
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
; D! H$ r1 U. X- }5 F4 `namespace 又费马达又费电3 g3 u7 g% g; }+ _: f
{
% U& U& V3 \6 R/ n# V    class Program4 o+ k  e. ~# t& c; H
    {  i6 G* i- H' P% h3 ?7 W7 r
        static void Main(string[] args)" O, ~! p7 j* [
        {& u* ^8 M% {- Y: j& `' G' S
            int m, n;
$ x0 t  C% t1 _: D( A            Console.WriteLine("请输入数组长度");
/ _2 P5 J8 q% y1 T            m = int.Parse(Console.ReadLine());//m为数组的大小
- f; ]9 \0 K' m1 [' G! y2 Q            Console.WriteLine("请输入要截取数字的大小");5 ~' |3 p" W0 V/ T0 u  O
            n = int.Parse(Console.ReadLine());
2 t3 R3 H/ y# w1 k5 M: s            int [] numw=new int
6 e# @3 n( j/ ]& L* w# [6 p3 `# g2 b
&shy;&shy;&shy;;: `! P7 _, G/ `: k$ h0 {
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数6 A+ p: Z' o) ?) X
            {
2 c, r8 ]) v# ^1 N- a                numw[j - 1] = j;. ?$ t5 S5 N& l
            }
! x, f0 ~& S3 Q            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!. M/ H: F1 N5 `- j  x; I
            while (d != m - 1)
. I4 u  u9 z# W) @            {
. K; q$ Y0 }, Q) |# }                if (i == m && d != m - 1)
5 g% Q6 }' l! X6 ?                {
2 u$ B7 q! t8 I4 l1 T; d                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
6 y0 s2 }7 H+ S                    continue;
$ z' u- P* x4 R5 y                }
2 X. q0 i5 y7 ^6 R# k                else, S  v6 M7 ?/ }3 u& K6 B
                {
* T4 k0 ]4 k" E9 P9 }9 ~6 F                    if (numw[i] != 0)/ H7 n* L/ ]) ^( P9 \/ y9 m
                    {
4 @& n( l# b( M" Z                        i++;
9 V7 I# w9 D# Y% c5 x                        k++;0 N. b) K. {" _  [5 j. x9 I# L, \
                        if (k == n)* X; D# i3 P- t3 K. \( ]
                        {
! Q) L* ~& c) h                            numw[i - 1] = 0;//把在n位置数组元素的值改变了4 V6 o- {! m0 V( D2 }7 D( @
                            k = 0;
; u0 ?, X) n" V  w, z8 g& j              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1* Q) {% Z2 n* j6 P
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);: Y, H  |5 }) L  n+ u8 ]: A
                        }
/ ^5 _" ?) W6 l/ i2 M8 M. b                        else//输出暂时还没有改变数组元素的值
4 h% ~; w" O3 d* {% q# m9 K, {                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
8 Q2 h: _! G+ k# u% R- L& A4 `                    }+ }0 g8 m$ c$ L% I/ w% v
                    else
+ H1 E6 w- H4 f/ d2 q                        i++;//数组元素为0,直接跳过,不计数。。。
* s/ r2 g$ B7 l4 v0 ^+ b, \                }
, `6 Z+ @5 t# [/ N7 W6 `/ ]% O " w/ s2 A' W& h
7 S/ S6 Z2 x* S* r) E0 l
            }//结束while循环; i/ Z* @) [/ A( m* f. i
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
# Z. l1 s  ~- W           7 K; U4 S' i* M8 D( Q
                if (numw[i] != 0)
& X& }( d' O6 C* \  |1 m                    Console.WriteLine(numw[i]);
. m' P% l* ^7 I0 w           
7 t& _) J. t6 l4 I# M            Console.ReadLine();2 ]7 [6 t* D% A: q" Y# n, R
        }
* ], o9 N; ^6 S/ H9 s    }
6 b, j" _6 G) x. m% s' y) G( j}
# x2 U" F; B% O$ {" [; t
小甲鱼最新课程 -> 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-25 12:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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