鱼C论坛

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

猴子问题

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

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

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

x
大家好!
* K& g" d* N1 o) l, h% u这几天我在忙着编一个问题,我用了一种方法编出来!( E  C9 V4 t0 _& m3 f
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!8 n' H9 p- g4 @4 Y. x! O
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
2 m  I; u" j0 P0 l7 y9 B" {* C9 f% i9 l& z) |' Q
# x. x! i$ G( `! C; I2 D
                            题目
6 a" I  X6 G" }& s8 A  {山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。$ t: A2 p" P# ^! c. r" M7 p
第一种方法:利用循环链表6 |+ t3 T7 r/ o; A
#include<stdio.h>. H. l- }+ {* `0 n' G4 z1 ]1 y. \
#include<malloc.h>6 Z! `. F7 O, J& y" |4 u
#define M 8            //共有8只猴子
# G/ f0 F% \9 r: F#define N 3            //数到3只时退出第三只6 D3 ]& R3 b/ b0 I3 C0 j
typedef struct monkey
0 f+ }  p8 U0 R9 g{int number;
5 Y3 E* k. _, z* h( Yint flag;  K7 ]$ l/ x: {. j" q
struct monkey* next;# t+ y4 ?" D0 l. c
}MONKEY;% y8 |' R& A5 F+ |+ n
main()
% }* [8 }& [1 T2 o0 L) `1 _2 b1 c{ MONKEY *head=NULL,*p,*s;
! \" w3 U0 e" Q& t5 b  int i,sum=0,count=0;5 G9 _  ^" {7 Y! L: a3 e' A% a- {
  clrscr();              //清屏
2 I; ~% A, W) G  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
& M3 z% D5 U( y: G& H8 z$ Y+ ^. y  p->number=1;p->flag=1;# E2 t* o5 y7 u# ~; h) D
  p->next=head;
+ v% F# c+ Y* H  head=p;
6 [6 v  x. w* ]- `1 R6 }; ?- M4 m  for(i=2;i<=M;i++)
4 I/ E4 Z& X" |    { s=(MONKEY *)malloc(sizeof(MONKEY));7 R  x, H7 P& i% s
     s->number=i;s->flag=1;5 R0 C5 K; t$ P% X
     s->next=head;
8 t0 t0 E4 u3 D6 _2 P0 r/ e     p->next=s;p=p->next;
  F( p$ l/ j2 j3 |$ F7 D: L    }4 H2 ^* u, ~. ~' s3 ]  Y( P8 X# c
    p=head;
. L  V: X" T* R0 m( x2 K& T   for(;;)
  j. H, M! t+ ^7 B4 }+ O    {if(p->flag==1)
' ]! r; ^1 T$ K/ R0 [+ ]; d# \3 F( N       count++;. o) M1 b" m& D* Y3 P
     if(count==N)
% S/ o# H4 c6 |        {p->flag=0;
- ]2 ]0 M6 y0 s( s+ G; B         count=0;
6 t  x2 E4 D4 n/ U" ~% ]         sum++;}2 Z( B; I) R1 H8 j
     if(sum==M-1)  z4 J1 {# Y) `
        break;
9 f$ H: ]: W- m# r9 f9 {7 \     p=p->next;9 M0 M( n( Z  b) O6 R! A9 m5 B
    }
$ e3 y7 [5 b. j1 E! w2 P. X/ t    p=  E1 q& I; H0 z  T4 {+ v6 P& o/ C
    head;3 q' a; ^2 R4 r' z9 f5 Q; m
    for(i=1;i<=M;i++)( U# n7 h- m- ~, }7 y* `/ r
    { if(p->flag==1)5 p% V. s) Q3 U& O. y# _/ ~* P) x
        printf("\t%d",p->number);& x, r0 i- u9 L1 I, G
      p=p->next;+ @1 H: ~& P$ U5 k2 Z& G
    }
1 E0 ^( I8 r% _8 g: _0 h& G
$ B3 l4 ?" ]) p: J5 I- B5 ?
( `0 v( Y/ e& X; K6 M4 n0 }7 b7 l, V0 }# c3 O1 J
}

% f% Y- V& |" w2 S7 Q8 ^( q: a& E1 d第二种方法:数组
! w; R, s  N0 V' z0 X#include<stdio.h>
8 h2 B# s) A; n3 j* v4 {, I#define M 8
, v: s8 K+ R% p! Ustruct monkey! A, G% L+ k- ^3 W+ ?( J, L: O
{int number;
1 E6 D5 L8 J% t( ~4 Rint nextp;' N5 T# M' r7 Y/ k1 m
}link[M+1];. Q% m+ B' ~0 x
! I5 W" S* d" O- r
void main()- ~7 L) ]7 G" S4 }1 m- K9 L( H
{int i,count,h;
/ P+ r7 B0 s2 o1 Cfor(i=1;i<=M;i++)
5 ]3 S+ _, W2 J{  if(i==M)9 S" _% Q& Z; u" h* K
   link[i].nextp=1;
4 h0 q6 a0 D) u  _, D' }0 a. K+ w   else6 \) N. }0 m$ m0 D  {
   link[i].nextp=i+1;
/ x( x9 b7 e0 y5 E( Q  link[i].number=i;2 G2 T6 g6 g2 O( j! V& _& v
}) o& C# h* ~( u
printf("\n");
/ f% n% F/ r; v' S; R# vcount=0;' u% @2 M6 C7 ~; Z3 m  W7 ^
h=M;
+ }  n/ W( v# _printf("依次退出的猴子: \n");. [5 p. s/ c+ @* q; x
while(count<M-1)
% ?0 N  I/ ]4 q5 y7 k: A{i=0;  n! b  K, F: j# \5 G! {4 v
while(i!=3)4 a$ }4 ^6 \9 u2 G
{ h=link[h].nextp;
4 F" C/ t5 ~) L   if(link[h].number)
' k7 |9 r  p# s: d9 P3 F. z     i++;}/ ]6 L; k4 C, ]! t8 J3 ?( o4 [- i
$ w- }( ]# b* u# u7 j8 [; U
printf("%4d",link[h].number);, X% @; m, r5 e# ^+ Y& ]
link[h].number=0;
3 u( H' E) M# I6 a9 v) A! Gcount++;% b8 F, k7 q; h  S  \
}
7 h9 o* U. l: K. _: P# M
3 i+ [4 T" A. H, x7 Wprintf("\n大王是:");
3 `9 _, u8 n5 O4 |) c! K2 S  for(i=1;i<=M;i++)& w- f4 B* a- X7 k' l
  if(link[i].number)) K, _; b" S- G) i* X
    printf("%3d\n",link[i].number);+ ?+ q1 `( s- g# W5 [" @7 Q; k

' `4 B! }. p2 v- o' ~) X' T9 p' n7 s% `! y3 j0 Q0 z8 i
}

1 o1 D$ k' o1 h第三种是普通方法for循环

+ |* _- |2 w8 S7 |2 Q& O#include<stdio.h># x0 \4 p# W- k# {  l: f
void main()
/ {: |* k- S& [{ int i,k,m,n,num[50],q,*p;! h" t' L/ X& I/ Y' l
    clrscr();' b( G4 R; L+ Y
   printf("input number of person: n=");
& Y5 b9 L% O6 {% i    scanf("%d",&n);
, M: M8 h9 @! \# H' Tprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只1 D6 s; p, L6 j! @. t& e
    scanf("%d",&q);
, |4 @1 A: r* Z. ~, b7 X  D7 m   p=num;
; g3 x9 \) t' F  for(i=0;i<n;i++)
8 k  O- a7 S% B+ z& U- }    *(p+i)=i+1;) U" S/ ]* J& t. u0 |
   i=0;
# w3 q( ^0 [# U: z4 n   k=0;
6 Z# c! |* i  m, E   m=0;9 K; X  \; v& }  I3 i
  while(m<n-1)
3 B+ h6 ]% r- q- q   {if(*(p+i)!=0) k++;
) z( L$ T- D& j) H3 w5 Y' a  x     if(k==q)
: ~4 R, L, ]$ s      { *(p+i)=0;
% c; x! w  x2 T+ J! \        k=0;/ E# w6 o% `* E+ d' E( Q- u
        m++;
) Y4 ]( B- D. N/ X      }7 D2 V8 g+ X! s. Q- x6 s7 A
    i++;- T2 z; s2 Y8 F  z
    if(i==n)i=0;6 d7 a1 o; T) f
   }5 ^* Q1 D- D) a, T" e
  while(*p==0)p++;3 K' }* z* x1 T. v, Q9 H% |
    printf("The last one is NO:%d\n",*p);
2 o$ F* i& y  B1 Q     getch();
/ k: H, ^5 u+ I8 @) v8 N& K$ P. Q$ s; Y: }
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;: t) D2 R3 j9 x  I; W( R
namespace 又费马达又费电8 D( f* A( I  ?: a1 M
{8 c3 V8 i4 n) j; K2 N
    class Program
5 T* K/ d& E+ t2 N! n1 a    {& H6 R. _4 T% m4 j/ |' u/ |
        static void Main(string[] args)
1 Y9 B  ~& d4 I! n0 q  t5 J        {0 f0 i" s# A' m8 c) D
            int m, n;% B: v: k, w4 @( u% ?
            Console.WriteLine("请输入数组长度");) [% \, N$ X8 l) b5 _, v& k
            m = int.Parse(Console.ReadLine());//m为数组的大小
) b% B0 U2 [" j* U            Console.WriteLine("请输入要截取数字的大小");6 s- z: ~- C  o
            n = int.Parse(Console.ReadLine());
, K" }; E% K# x% a            int [] numw=new int
- k% v' W6 v0 D9 y; V  b9 y. [) r
+ ?1 r  V% R0 l  d7 Y: y' Q- n&shy;&shy;&shy;;# D2 K+ _+ M* S* R4 f" _
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数7 o$ G5 m+ C% t4 X
            {
8 R8 v; s" E2 e. Q/ O( I                numw[j - 1] = j;* @$ M- M1 O# c9 y
            }
( R) ]- D2 T$ g6 J9 A            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!+ A8 a2 j# t# b1 P7 b+ c
            while (d != m - 1)
' U/ K7 G+ Q5 ?7 ^            {' ]6 @$ t  j  T; n8 ]
                if (i == m && d != m - 1)8 b5 b- d  E! O- q  Y8 F" k
                {
0 e2 o, A$ d7 @) T                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
) d1 ^$ ~" K1 E. _# t1 G5 [                    continue;
) X' }- u) h% ?% X+ ~5 _                }. Y+ e  v& e0 y& P  K3 ~
                else
3 G1 J! Y8 g- r% ]                {
$ n  g5 {1 ~% P4 \, z. i                    if (numw[i] != 0)
3 }9 C$ H( t) U7 N% |. C4 h                    {& g. W  ~, Z( ~
                        i++;
5 G3 A( ?3 I; b                        k++;
; @0 ^7 c1 G) I6 [2 L( h                        if (k == n)
  X& J: f5 ~" E1 T# T$ O                        {
* L8 D, x, m# T( L% s                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
3 N& X8 V1 ~; X1 y- Q& @- M2 I2 g! H                            k = 0;2 i, Y5 k! I* @( y, Z( e+ l( f
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
1 x. Y: I; i, O  r$ T7 D8 Y# P                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
1 Y& `! J- B* s4 n+ K                        }- I) N4 E5 R7 }8 o; \" G7 P* f
                        else//输出暂时还没有改变数组元素的值8 _1 y% H! ]8 y: T: b; ?7 O6 C3 X
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
" H5 _2 f6 x% y2 P8 @& [" x3 m  y6 ^                    }
8 J) ?8 u: ]( W$ B. M                    else* A1 |9 h4 F, S5 p
                        i++;//数组元素为0,直接跳过,不计数。。。
6 g! ?1 x% O% F/ W- A4 k# A7 X                }
, Z. o6 n: e6 d' U  ^, w3 R
' _% u4 O! X. `0 V) m. V$ Y5 e! C( F4 Y
            }//结束while循环& {/ B! Q* c% A
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦8 d$ z& }, b( L, f5 H
           * |# X2 t6 F. V1 j8 `) x
                if (numw[i] != 0)
" Q. J. X9 `) v& o& F                    Console.WriteLine(numw[i]);
) {5 S0 m6 Y% i2 ?           
" B, q$ {# p7 f4 ~4 |. ?9 w+ D( A5 J* \            Console.ReadLine();4 ]: ~! m$ p: N$ |
        }
- A7 |# |: |: u2 U    }
5 K! ]6 b/ m: B$ \0 E1 m2 O}4 r& s6 d, z  }$ ]% ]
小甲鱼最新课程 -> 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-1-12 01:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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