鱼C论坛

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

猴子问题

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

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

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

x
大家好!
8 b& F' j, E4 g5 m( g" \8 T7 @% q这几天我在忙着编一个问题,我用了一种方法编出来!
# W" W* {# `. ?/ X9 n; ?' l) S. G但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!" I% t! F: r) p/ @1 s  R/ b
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 , e1 l( y% j. W. M2 ?; |  h" S
& n' z. E- r3 |( i4 G4 ~
5 F! l! Q% @0 q
                            题目4 k- o; V( j. a1 i
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
9 H& L; ^; V  s1 B( {  o3 a第一种方法:利用循环链表
" p3 s" L+ Z5 Q4 N#include<stdio.h>3 C0 E0 K; a/ d
#include<malloc.h>
* H0 r6 ]2 z" {' `#define M 8            //共有8只猴子
" ]* ]) l- D6 t) f2 T3 I$ \#define N 3            //数到3只时退出第三只
) N5 O1 @2 U) O; c* Itypedef struct monkey  Z. V% e! B+ Z
{int number;
: ^* i; e8 q2 @6 jint flag;4 J7 _. ?5 T8 S, ~9 A
struct monkey* next;
7 `% M4 d5 s/ a$ ]& z}MONKEY;
) D& @  E) [  n; lmain()5 x2 I6 a6 q' I1 x& y3 |" H1 }
{ MONKEY *head=NULL,*p,*s;4 S6 \' h8 Q8 P4 F
  int i,sum=0,count=0;0 a- C9 g0 e4 J& X* u' t9 j9 A7 }/ B1 W+ u
  clrscr();              //清屏
; _" l$ j4 {+ {- P! a9 F3 A, h% H9 L* X  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
% @+ j- O: C% \: L  p->number=1;p->flag=1;4 E) V) @9 O8 ]) K6 m8 M1 x& {
  p->next=head;. D4 J: J& f) ?: d; U; V$ a& W
  head=p;
$ D8 R5 K1 Y. ]+ ~$ h" x% f: m  for(i=2;i<=M;i++)( z7 F  P1 J4 C9 @$ t
    { s=(MONKEY *)malloc(sizeof(MONKEY));
1 u+ R  S  b/ g1 q     s->number=i;s->flag=1;6 A  J* r) `) Y1 }6 o4 a
     s->next=head;' q! a& I% a: R( F- D
     p->next=s;p=p->next;
/ g. h) F! c- P: m  I    }; G6 i0 }, _* r& w$ M; n5 M  x: y) g
    p=head;# K0 J% Y+ ^) y% P, _& Z' a/ p
   for(;;)
) ]; {7 A, B; T0 t0 Z    {if(p->flag==1)
# u8 J. @. A% ^% ]( v3 k1 \+ L& L       count++;
% J* F# `$ L4 u3 Z1 O% r4 A/ l     if(count==N)4 a' b  T6 m: A6 K$ `: V
        {p->flag=0;
! u3 f. o! ]7 n' f6 ?. |  e         count=0;2 f. P  O! {/ W& G  W! j* R# f! B/ ]6 }
         sum++;}
8 S# \& E. f3 C, C/ X  t; S, v% e     if(sum==M-1)
$ {( W$ e. w( i2 g1 h        break;' C: G  J9 m; [" q8 i5 c8 ~
     p=p->next;5 i4 k. {  @+ a. p1 O
    }
* P7 I; O6 W' H& m5 m* u    p=# L$ V* n2 N! B  s  S
    head;
2 v& e( ~8 R' y0 S! G    for(i=1;i<=M;i++)* A( d$ F! A+ q0 w8 P  d1 D: J
    { if(p->flag==1)2 N0 M: c4 q( R( r+ t# P
        printf("\t%d",p->number);
1 D" @8 O- |. V* ]! Y+ f      p=p->next;* Y2 W! S8 @6 k! E. L# y! ^
    }5 L  F9 |3 ^+ e" _. D
5 R- a1 w$ |# R
% _5 ?- @* E  e1 d& q" b2 P( L: l
- `2 e0 ~6 I8 i* z
}

6 v2 v1 J" z) T$ k, T! Z- z. b第二种方法:数组
5 [, Z$ U3 s- {' @, c+ P. X#include<stdio.h>
3 U$ a  t0 B% [' S9 W: V#define M 8
8 \: m1 G; e, {. U! Mstruct monkey! t7 C0 x$ B: D0 Q) {
{int number;$ b$ ?, `. n5 _: p
int nextp;1 C) m* y" `1 G+ C
}link[M+1];
+ A* s5 s- I3 l# p0 B; \* s4 L. }2 P+ M, G6 M" @) x
void main()
! o3 o' |; _1 x" |. z{int i,count,h;
! Y( S' g/ c( Gfor(i=1;i<=M;i++)
3 y( L7 k$ E$ A: s2 d" k{  if(i==M): `: t" m. k$ u9 `& d2 c) K- d
   link[i].nextp=1;
# v; |( X3 e+ N, _' g( o' u) v   else% u1 X: r5 f' W4 \) i! \
   link[i].nextp=i+1;- X. H6 B9 X4 P0 h# X  ?
  link[i].number=i;2 d  P% H* f' j+ _. `4 O5 ^
}
- M# u/ |- t& S2 |/ A1 ^- u, ?printf("\n");  p% E( D* I1 o% \. W
count=0;3 V5 J9 o. @5 S- w. ]1 N
h=M;
, p; Z' X( P& g% N+ \printf("依次退出的猴子: \n");9 ]+ y7 T# K+ v% Z1 l3 d$ m
while(count<M-1); `9 n+ n4 G& w; H0 G. Q# a' n
{i=0;
! Y0 V4 |' \- H3 j" Dwhile(i!=3)
, V) X/ ~9 I4 h1 A% k4 G% Q{ h=link[h].nextp;$ g* s/ g. {3 w5 k2 S& s
   if(link[h].number)$ k; C# D! B  W/ L
     i++;}
$ a( p4 |& Y. K6 E( ]% m  M6 c# v7 p$ R2 h
printf("%4d",link[h].number);
4 s2 K  c, _  z; V, G5 S" G. qlink[h].number=0;
) c7 T4 M  d+ g& f* S6 ~+ ?* jcount++;
" ]+ R- {" N5 A6 A4 U& w( j! z}7 ^! l. ?# X" y

0 r! u$ Y; l1 V" N- {4 sprintf("\n大王是:");& h/ z. d( w6 c( p' M
  for(i=1;i<=M;i++)7 J0 y/ V) I/ Y) u" A0 H1 ^2 X
  if(link[i].number)5 m2 P+ Z# a5 L! V8 F. i0 c1 ^6 f1 s3 |
    printf("%3d\n",link[i].number);
$ ]7 G% _1 I' x: V8 A6 J% n( x' i% _* \; C

0 G3 ]+ U: ?" B! _6 b}

% s4 z8 L; v: r) i& Z6 C第三种是普通方法for循环

* i/ u( n% b& G" P& w#include<stdio.h>; W( e* |$ K% Q% w
void main()- P* M& z" K0 ]
{ int i,k,m,n,num[50],q,*p;
5 _) t/ R' A7 D4 _- E8 m    clrscr();
/ t( W2 W  a* p+ g9 X   printf("input number of person: n=");& g# X6 |0 {: N! z2 a" O  ^7 A
    scanf("%d",&n);" z. b: z  Z9 W6 }. u$ H
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只3 H& s" Z" Y$ Z. s5 f
    scanf("%d",&q);, ?3 R- ^& Z6 x0 G# a, d% Z' ?
   p=num;
3 Y) x' j; b, F  e: @- H" ~  for(i=0;i<n;i++)
/ t; G* K' N$ E$ s    *(p+i)=i+1;
" P% t9 |* n. I* K6 M. T! j! p7 r& M$ v   i=0;
# ]6 a  y0 x& E5 g# d4 `9 U4 b& Y   k=0;
5 ~& M! v8 W& l( @' i  H% P9 p5 V   m=0;% @8 d7 s( W% u. m3 h- d
  while(m<n-1)+ _. f& u0 t2 D, c0 `
   {if(*(p+i)!=0) k++;
/ H& H& H6 Q; e6 j' P9 C$ A     if(k==q)
/ i" h% q! V! X8 M! o2 O. O/ G% K      { *(p+i)=0;, I6 f* ?7 O3 ]0 F4 p
        k=0;
* f, C3 C+ c/ K& p: C) S        m++;
$ _/ X+ d6 q: S/ _      }8 q. `, i7 v! t% R& D8 t2 z3 w
    i++;
: K, V( l) x- G0 W4 j, s/ A( G2 l" z    if(i==n)i=0;
& w' p( W( K9 ?5 S8 U/ t1 M; Q   }
+ l# ]! L: U! \! J, k  while(*p==0)p++;
- c* j6 n+ ?  n' C- i4 i, f    printf("The last one is NO:%d\n",*p);
2 ]3 k: j* t2 a- V) M3 I) i' x     getch();
5 V" ^) N7 r/ j1 i& _. N6 V. Y+ x) C- `- L& l
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
+ n; c6 x; j$ V: unamespace 又费马达又费电
, V" f1 `# q9 g1 U4 S{
& f; e8 m# n7 h: l- i& V    class Program5 o& |) \9 f  ?4 G' ^% O' H
    {1 q6 M, F0 z; D! q; f' D: H% Y8 _
        static void Main(string[] args)
$ X4 W/ R7 U+ `9 o        {5 H6 o) w& j) V2 f
            int m, n;7 \4 i: s' \: \- `3 z8 |6 B. M) `
            Console.WriteLine("请输入数组长度");
- e" y& ~  g; u. s            m = int.Parse(Console.ReadLine());//m为数组的大小
! O) f3 L, f- }# C+ P9 w' z; j            Console.WriteLine("请输入要截取数字的大小");
2 u( x! c- B8 G2 O+ `            n = int.Parse(Console.ReadLine());' }# D; O% f/ H; v4 o4 O
            int [] numw=new int: F. T: g1 x/ f" E

% W# P% H0 D0 J& W% F! B% e. J3 @! X&shy;&shy;&shy;;
' {. w3 h! h) Q1 R0 W0 ~7 G5 o6 s            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数. R5 f( T/ Y) i. Q" r. U
            {4 n; j- C; `+ m0 y% x9 d
                numw[j - 1] = j;* P$ J/ x' P7 Q$ x: a  n; |2 y
            }! Q: ~7 _. h% n0 T: k
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!- X/ N) v& h' E9 x0 c
            while (d != m - 1)
, [1 |! \  V% B5 E            {: i* A6 q/ u# O' N- A( P$ {
                if (i == m && d != m - 1)" r6 f2 t6 U8 Y. {# A6 e  S
                {
! f9 ^; @* @7 a5 }                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
+ F  {/ z- f; X                    continue;  O* L% v* N0 `+ |6 p9 W- [. M
                }8 Q( i* [' b. ~" {* x" j. D# k
                else1 K8 d, y4 Q9 t# V; W
                {" {6 [6 H! v4 S/ }3 a+ T/ x
                    if (numw[i] != 0)* S2 ^# d0 q4 Y$ G
                    {+ O6 i- d: \1 {) R7 g
                        i++;
6 J4 R9 b) a% @( f0 T- n1 b% U                        k++;
$ ]. l' U0 g& m                        if (k == n)
8 K8 |9 d4 \/ |) ?                        {8 @0 G0 v$ k1 u0 Z8 ]
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
/ Z9 X- F) c: \  r! A0 L0 M                            k = 0;$ Y6 c* M5 Y$ [! f- Y! p: ?
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1  p8 h8 M# e9 R4 ^! U& \
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
9 [" C0 q+ n# V# K  ~                        }6 N9 I. x! X% B- O
                        else//输出暂时还没有改变数组元素的值( a% e7 r+ y7 f& {1 L
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);* q# o0 ?! T5 \
                    }
/ T1 g5 ~8 {! O% p                    else) T5 O9 X5 T  m  I
                        i++;//数组元素为0,直接跳过,不计数。。。( R% M+ G9 [9 o" {# A$ @5 P
                }
9 d; N7 `3 y3 h
8 n: y; }" m' h( |: {' G; v* e% O, [; {5 A: N3 k& b
            }//结束while循环  B, q7 e, R; ?3 a
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
( s& E4 U8 a. |8 q+ L2 }           % L) Q0 B0 X0 `5 K- l
                if (numw[i] != 0)4 k  o; O3 X4 ]8 |; n$ L
                    Console.WriteLine(numw[i]);
$ U6 h4 w7 h5 z3 s. f) ^6 c; X- z           
  t. c( P. w. u0 P            Console.ReadLine();
0 E, F$ s+ b) y8 q0 z* x7 D7 O        }) i) x0 @$ V3 e" Y5 [% t$ L5 x) J" N2 w$ U
    }
5 d2 J' O2 n. Q0 v$ I+ ?9 P}
7 o7 u* |# u, [! U! q7 ~
小甲鱼最新课程 -> 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-3-19 13:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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