鱼C论坛

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

猴子问题

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

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

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

x
大家好!
3 C% w+ y# z" Z; C8 p这几天我在忙着编一个问题,我用了一种方法编出来!: J: I* Z  H6 A5 m7 U; ]
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
% n& _  m/ C/ ^8 D注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 % [* \- G$ c$ Z1 I4 T( B0 C
3 @  ^  x/ v# p! S7 G

) v& g" q: \; [; Y9 _8 u
                            题目
" ?1 }! o: Y) b8 u山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。$ t. n# d0 H2 ~$ m
第一种方法:利用循环链表6 P- U1 ?" U) Z8 R
#include<stdio.h>% h9 A7 J' x8 M. n
#include<malloc.h>
( ~$ w- u' Q/ D- j0 K#define M 8            //共有8只猴子# j! @4 d$ |; p, `9 j
#define N 3            //数到3只时退出第三只
4 R; E. X) z6 K- b& d# \) ]6 wtypedef struct monkey
+ k2 I& V& p2 N; ?* z{int number;
; F2 ~3 v. Z+ m3 }0 Aint flag;
6 Q. X# G3 h) m3 g3 {- Ostruct monkey* next;
4 ^2 e, {$ t0 X# w- m4 L$ ]- C}MONKEY;
8 U) Y* l1 ~, w: V% @5 Rmain()" M: q5 E, g+ I9 n4 @. N; `' V
{ MONKEY *head=NULL,*p,*s;
0 y) a2 M1 Z# k, h& S  int i,sum=0,count=0;6 g0 f$ T& L& w# B" l; x
  clrscr();              //清屏* `/ F* T/ l( G: r2 w
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
, F6 o$ @2 P3 ~* Q  p->number=1;p->flag=1;
9 t, M- K* E  N5 n) @5 k  p->next=head;
2 z9 |; V- H+ B  head=p;
' C# Z/ J/ A4 d/ d) n  for(i=2;i<=M;i++)
: M& o5 x" U4 Q& R; ?' L    { s=(MONKEY *)malloc(sizeof(MONKEY));% p4 I6 a, ^! g( B+ v& R3 v
     s->number=i;s->flag=1;( p+ @; c3 e- d! j
     s->next=head;
" v* i/ \9 K- H0 K" _6 E: f2 T     p->next=s;p=p->next;
; X8 m3 A* @% L" V6 x. Y' S    }4 Z; |0 E; Q' ^5 X( P
    p=head;
1 ]7 K( J' f) E) [   for(;;)( s# w, y2 a$ ]9 m( l
    {if(p->flag==1)% }7 r5 c$ O6 R) n$ |- D$ e, s( ?: }
       count++;
# i) y5 C5 w2 }     if(count==N)
! D6 }0 Y: S7 t4 m1 H0 Q! t9 O+ W        {p->flag=0;
) O0 l  w1 |$ d- @. A- T1 {  e: g         count=0;! i% R' Z+ H1 _# y. i- {' C; Z% F9 p  w1 Z
         sum++;}
" _/ |/ q+ ]! a) b/ i6 ?     if(sum==M-1)
; F; R8 l9 P8 c4 J        break;
- s0 H2 ~8 v. Y4 {9 J     p=p->next;
* z; T% k& F! S9 |. p& @    }
% U+ R! c6 \. a& h    p=9 o2 S, q) }& x9 G: J% A- k0 D
    head;! F* C& P: [8 P9 @! x
    for(i=1;i<=M;i++)
5 G' t, A- ^9 j# M! d    { if(p->flag==1)/ v7 R0 v7 ~2 S0 f* ^& Y* K, q
        printf("\t%d",p->number);
6 _( u: p5 O& P9 s      p=p->next;  ~) m' H1 P8 K- K. r+ I
    }* a" d  |% u' {* |( Z% F

" H: h$ a- ~) }  a2 M5 G. g  d: M5 k8 v; i
3 R0 l: ~/ Z" c; Z' f# \
}

. k- H$ a) A- ]/ X: b# q( a; V第二种方法:数组
- C8 z3 a' U) E#include<stdio.h>. N+ b* W( X7 W/ @
#define M 8
  D1 I9 b8 b1 o) L7 W7 [( mstruct monkey( r- P+ t$ q$ B/ U
{int number;
! L; n' v# `, B$ ]' hint nextp;6 c% b& K1 b5 y, ^
}link[M+1];
1 ]8 z, y; i" h$ q- X: s$ F. F, [0 E' S$ M& u# l
void main()
! Y2 Z; `3 I9 |$ U2 R{int i,count,h;. y! t$ G! ]3 i& {7 }0 V
for(i=1;i<=M;i++)
, c" z2 b3 G& Q% k. R6 a{  if(i==M)$ o+ B$ n+ j1 d, ]
   link[i].nextp=1;
* g* x8 `+ ~- s+ t) U- ~- c0 w   else% A9 S8 @. Z& O
   link[i].nextp=i+1;
( \3 i7 E7 ], M% w" c3 B  link[i].number=i;
6 x" D0 [$ u' t- l" F2 r1 ^$ C}9 }- ~& `  }( X
printf("\n");
& M* `0 R1 R& X% @; S+ }9 I; gcount=0;
. @7 r! ^4 `" a- |* _h=M;
6 k, A" m2 H* O2 d& ]printf("依次退出的猴子: \n");: E0 g& K, f4 L0 v! ~  O
while(count<M-1)
# j: _; R' }# h! _; `& G# B{i=0;
; a/ H8 ~9 g: T' ]) m" Wwhile(i!=3)+ j8 @0 m3 Z1 c/ V& ^& ]
{ h=link[h].nextp;
' f8 u4 u4 j0 x5 K& v: e   if(link[h].number), l  F3 U# R( O# j
     i++;}
" H  ~: z3 w+ W+ i7 ^: D0 Z4 g* Y& G% k
printf("%4d",link[h].number);
8 A( b* Q9 s" C) d3 ?! E- z7 Tlink[h].number=0;
* H3 n  J+ S  N  r: n1 g8 Fcount++;
6 o( |7 H; N3 [/ S' U& O; p}
% c$ g* U. [, q4 U- F) y
# y( K# ?5 z9 \printf("\n大王是:");
3 K. f1 c7 G) e* b6 e+ \  for(i=1;i<=M;i++)" U8 ?; d9 s( I( Y6 ^8 L
  if(link[i].number)
$ d& g7 A) n' F1 |+ ?7 J( `3 d7 T    printf("%3d\n",link[i].number);
" q4 _  P3 z9 f7 D' J- S
; x  F, ?' ^0 m  |' B6 [0 j0 s: \7 d
}

, j4 ?5 q" k* I% q7 c! P第三种是普通方法for循环
5 b  u8 n* T, p' }2 u
#include<stdio.h>: G2 P) @- e" n" I
void main()( `( d! P9 S% Z/ c% z; W
{ int i,k,m,n,num[50],q,*p;2 \9 v5 \5 ]' H. i
    clrscr();
/ ], A8 R0 h5 q( n( ^+ I8 n   printf("input number of person: n=");
" a$ L; b, t7 Q3 U. Z9 c    scanf("%d",&n);4 V7 V! G6 A3 Q0 r6 c
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
0 {, E8 v6 p2 |( y) t6 W, @    scanf("%d",&q);
; y( ]  J- N6 S   p=num;
6 Q, P( Q: s. V9 i9 G! G: v  for(i=0;i<n;i++)1 i* `2 ]0 b1 L. q, e4 r
    *(p+i)=i+1;
& i) [( f* d: G; o( {0 o0 \   i=0;, D; `8 Y  @" C! R$ f
   k=0;0 F8 j, I8 |0 L- F1 v/ J
   m=0;
3 k' H' W# j3 X+ w7 C: ]  while(m<n-1)
% H1 w% j) U. a   {if(*(p+i)!=0) k++;" Y& F; \- ~1 ?  O3 v
     if(k==q)
# s0 C0 f7 S& u( b( r2 @; A      { *(p+i)=0;$ V# h3 C! g8 z/ w7 Q0 H
        k=0;
. _& ?# V! _2 z& f  O$ ]( {        m++;+ O/ \1 ?; K9 B: t0 V
      }
8 @; n( ^  ~: m8 j7 f. P4 ^    i++;- H- Q9 o- y5 t% f$ r$ Z6 e
    if(i==n)i=0;
$ b% N" f. j0 |) b   }7 d; N+ R/ o+ J  G$ t
  while(*p==0)p++;
8 J& m* o  _" [5 h    printf("The last one is NO:%d\n",*p);
" P% H. N  d- b     getch();
" `/ m: F- F( `7 H5 p' b6 h7 }* e" B5 i4 k9 J3 U
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;4 H4 |) N  M' S7 B) [5 l4 \' d5 s
namespace 又费马达又费电
0 _- Y1 d* o5 O! G8 W( W: I{* @; m6 u! N; k2 [5 }
    class Program
/ O% _+ Y, m/ ?, P4 ^) v& R& m    {) j7 I' E* k& A* r6 W5 J$ b+ k6 `
        static void Main(string[] args)
7 o! }3 ]2 r( @  ?8 S9 ~- b        {
5 G" j* @, E; {6 |) E            int m, n;
9 M7 d6 }1 f% Q& ?0 ~+ P5 @2 f            Console.WriteLine("请输入数组长度");) i. y+ Q/ S6 R4 B7 g7 p, d
            m = int.Parse(Console.ReadLine());//m为数组的大小
( r( J. D. e9 |4 i3 Z. V+ q. d: A            Console.WriteLine("请输入要截取数字的大小");
$ n9 I7 s3 _; W1 m5 U9 H            n = int.Parse(Console.ReadLine());
- p2 g# j) c% d9 U            int [] numw=new int
8 j1 ]. A& o7 D) [9 r1 H( s
0 K4 s  O0 ?2 [9 a' O' q7 |9 k&shy;&shy;&shy;;
1 c+ x; F' u) ]6 t& ]            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数$ h: ^- n. p: g6 _) R. O0 [: O
            {4 _" g$ I6 n* f
                numw[j - 1] = j;
4 n" r1 W7 ]# b2 f- z/ |            }( W# {. m$ I  V4 p" b# O) ~2 [* A
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!% S3 c+ [% H! _
            while (d != m - 1)
/ ^& g6 A$ y4 k) |0 y            {% ?5 s! y4 ~& A* \
                if (i == m && d != m - 1)0 F- K7 l4 o% F) N, N$ ^7 r* R
                {* E3 X! @( P/ U) w# Y% A! F
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
  N- @' a6 T, f                    continue;" ]: w0 ~  _% M. R/ M; k) `
                }
  u. z' k+ `8 f- F# D                else$ C; p! R& c8 s) {
                {
2 ]5 D$ @& U( X6 Z  U                    if (numw[i] != 0)( w# w, g9 t  _' R4 g
                    {# K$ a4 U5 S4 z9 X9 K& M
                        i++;
  X5 n# f) M9 \! @. Z# O2 L4 j                        k++;
0 ~* R8 ]9 G6 K3 O. U                        if (k == n)$ _  }) G# }- T( p# L1 s
                        {# P. H9 Z& |( u8 n" w; e6 P
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
7 J  x9 @" P5 e9 P  _. ~* K                            k = 0;5 g2 O0 j) {1 ~
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
& G" ^% K' V# B( R3 [                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);, m# T& C1 B0 S" y
                        }
+ ]1 t+ V& k' E+ s; q5 q                        else//输出暂时还没有改变数组元素的值7 R2 [' @9 L/ _$ _3 E: P
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
: v2 R8 u4 O, W, g$ ]                    }
7 m& Y+ F+ d% K8 w" c' w                    else
5 {! `- L! @' M8 x                        i++;//数组元素为0,直接跳过,不计数。。。
& p- a( I- ~9 z  ~9 p& X0 Z                }
# b/ `" p0 L- _ % d3 e! e. ~6 @2 m" C3 `
# _$ t5 _- B6 P: \: ^
            }//结束while循环% w; p! F6 t" I! R5 ~
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦. q" A- u0 P8 k/ X
           4 \3 ^2 Y+ X- M/ ?) Z; J
                if (numw[i] != 0)
( o( t4 T: {: j7 ~0 E5 J                    Console.WriteLine(numw[i]);0 p3 S! K5 e5 p4 Q) Y/ A
           9 T1 s0 C( b" e* ~4 H0 N. H/ U) k
            Console.ReadLine();
( b) n7 {' y( `& x0 _# g( h$ V( E" ]        }
! E- u* \, t$ X* w; b/ O* r! _    }
; t- g0 R; V1 L. m. ?2 s' o5 s}
8 P: L! Q: c# g& w- o
小甲鱼最新课程 -> 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-2-1 14:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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