鱼C论坛

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

猴子问题

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

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

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

x
大家好!
' ~' H, ~& W) e这几天我在忙着编一个问题,我用了一种方法编出来!4 r2 b9 ]- N- ]* a) a. _1 ^" w
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
% a7 v: h+ _! Y- Q4 J7 d" n注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
# T  p* K8 ^5 ?# C' R4 R- r( w. X& `6 C7 n7 U
0 A8 _  L8 g1 l  X* U
                            题目" v) t! [- c; S: K7 H
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
1 Y# m# R0 b% \4 u! l: ^1 s8 s- S第一种方法:利用循环链表6 a' A7 r' G2 j- R6 t
#include<stdio.h>
" j6 A, C5 P: f" i#include<malloc.h>
- C8 j# s. c) d6 y1 w/ ~& b#define M 8            //共有8只猴子. s; y# V+ t  y4 W* W
#define N 3            //数到3只时退出第三只
3 [1 d3 J! x: A; h( w, k" {7 [typedef struct monkey
# [) J$ f$ q; s7 T- ]4 B{int number;
5 h7 L( _# h/ p& v, |; _: xint flag;2 G2 w" I' I# A: W! h
struct monkey* next;' `- u3 D7 c8 w1 }4 N
}MONKEY;
3 u/ r: i9 k; x5 qmain()6 ~( K9 [7 t1 x6 t
{ MONKEY *head=NULL,*p,*s;
( F! S/ J; Z+ D  int i,sum=0,count=0;* z6 P' T- l: u9 M1 f
  clrscr();              //清屏
$ H5 P" v8 G+ e3 L" l2 Z4 R  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
7 @- e3 S2 ]: H1 I: i+ `  p->number=1;p->flag=1;
4 v9 B/ H- j2 I9 f& q: I" @  p->next=head;, D1 }4 D' |: @4 G) s- l
  head=p;
. t* n* k( z$ j1 }7 l  for(i=2;i<=M;i++); |: A: O, u" n) F0 i
    { s=(MONKEY *)malloc(sizeof(MONKEY));+ W/ _6 k, j! \" N; b/ Z
     s->number=i;s->flag=1;
$ s6 h! j0 ?% V+ k* z- [& }     s->next=head;
" \) S  m6 b' b  N7 M% R4 q& {; ~     p->next=s;p=p->next;
4 S5 |/ ^5 U9 w9 n& g. R    }
3 [3 x: E4 S8 V# e& H9 }3 `5 a    p=head;) s) m( E* g( P! ?
   for(;;)/ t4 t. B8 M* p! N- J0 K
    {if(p->flag==1). s7 [' M& [3 g0 G- R+ `
       count++;5 f+ p' `: M3 g( a1 Z$ S+ n
     if(count==N)
& B# w5 v* q  A5 A        {p->flag=0;
* L$ b* E- ~" Y; W9 x         count=0;/ j, f  u5 ?! Y1 |
         sum++;}
9 E* q0 a1 c4 W* K3 D, i5 O     if(sum==M-1)6 g, q, v  E6 N- B
        break;0 d* {& T$ W2 o4 e
     p=p->next;0 z0 n; V9 t( t
    }8 \. J/ j8 m  W6 F
    p=
! r. x# Y1 ^6 ]- I    head;6 @5 i: n4 A) I) z; y) ~& u
    for(i=1;i<=M;i++)
2 I4 i% g4 T. g    { if(p->flag==1)$ x  R: p6 y) f1 U8 Q
        printf("\t%d",p->number);/ `/ [! ?/ z7 ~* R
      p=p->next;
( x6 P% ^! ]3 [9 I* d' \  G    }
6 x. r! I3 ?4 `2 E: c& v4 B- O6 C# U6 Y

! `4 b! V9 [, g4 X9 m: g0 f" ?7 G
3 `9 `- u: U0 `3 N& c5 J}
% [" W# ~+ T, C0 c
第二种方法:数组
( v, v" X# M$ a0 l# J8 K+ x#include<stdio.h>6 W& g4 ?. t; r, D; ^& m
#define M 8
, W. J; K* R. U+ x8 k2 M' S2 Ustruct monkey
( U& _4 b$ D2 u, w1 j{int number;
: M9 |1 v% B) Rint nextp;/ I$ R6 ~, I2 O" x: ~6 B9 B9 L3 t
}link[M+1];% |# T, |( O, Q3 l! M; W% Y5 `, N

; g# ~# z% P% X/ P! t$ Hvoid main()5 N' q: Z0 ]. l5 k. H) n2 k8 K
{int i,count,h;
/ t- R: C7 ^+ F! k( ofor(i=1;i<=M;i++); t0 @' W. d* z& `4 H) \
{  if(i==M)- n) }, }8 W8 i) c; x
   link[i].nextp=1;! q$ Z5 \9 n8 c; L5 I
   else
( O- f  w+ h# A9 v# G% X3 r   link[i].nextp=i+1;
/ @: n3 n$ k+ j% S% ~  link[i].number=i;" Z1 f0 K5 m+ a9 H. l
}
( }; e/ c+ V6 |' ?+ nprintf("\n");
  W6 }- e/ f/ J8 ]) c! L/ ^count=0;
8 t2 }4 h) q5 |! l3 ah=M;% |7 P9 Z* o7 Z% y
printf("依次退出的猴子: \n");
" K- P8 T: h' J; C; [* @9 @while(count<M-1)/ g2 W+ U& C6 ]. @! z
{i=0;
+ P% f0 r" y7 }% n1 qwhile(i!=3). p( Y* `% F1 N
{ h=link[h].nextp;& j7 ~, U4 q$ v; m9 G, f; i
   if(link[h].number)
+ ~" r, m2 u7 O$ t+ X% ?     i++;}' U& L9 T% ?4 O
7 E% P3 w; z8 L$ S# m. R1 q
printf("%4d",link[h].number);
9 u0 {! }+ v0 P- blink[h].number=0;
( Q% E$ K8 z. t8 v- s; Q6 j4 Bcount++;+ g/ `4 Z' N. D
}# F5 y, k) ?" ]

  V& H" ^  d# a" w* [0 _! sprintf("\n大王是:");' ?) w  k, B+ r+ S
  for(i=1;i<=M;i++)" J" f1 I- T8 s' i+ c  \
  if(link[i].number)
4 d& `( K1 S2 W; y  r    printf("%3d\n",link[i].number);  j# p6 `9 p/ `# t/ E: D* Y& X( k
  Z% ~6 Z) C/ @1 Y( C0 C( ]. l
, X( V+ ]4 H) N- K+ V7 o$ K
}
1 q3 E$ |& g) E4 ]: _: ~* V2 p
第三种是普通方法for循环
; |+ I% T, q7 g, @5 a
#include<stdio.h>
: J& {( M) b( c& J. B, Qvoid main()# b" ?9 e) i! T
{ int i,k,m,n,num[50],q,*p;7 \  a# h& Z0 z- Y
    clrscr();3 y; k6 U* s% [; |% a2 l2 k0 Y8 C
   printf("input number of person: n=");1 Q2 Z% M4 H! f0 P$ P$ o- G
    scanf("%d",&n);
; h* B' O- _3 K8 `  h1 Z$ _- |printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
& L# r" c. ~8 a5 n9 s0 k7 B    scanf("%d",&q);
  t1 h# N. b: C3 J1 g" ~" h4 A* x   p=num;: n! {- L8 |" E1 V) W" [
  for(i=0;i<n;i++)  W1 C/ U5 c. `
    *(p+i)=i+1;2 t; W8 c9 H' Y: v; j
   i=0;
9 s1 k0 B+ |5 |7 D, k; e; X   k=0;
9 ?+ O1 h( F5 [! H   m=0;
3 J. Q. i) {. @  u6 A) K  while(m<n-1)
1 H& _$ b' X' W& r   {if(*(p+i)!=0) k++;: {% x' O5 ~5 ~
     if(k==q)
1 H  j4 m. z5 j      { *(p+i)=0;# M: g9 d; W$ o& Q8 z  L- G7 Q( @
        k=0;
4 m% l' p2 _3 {        m++;& m* v- Z# D0 }8 c) |
      }
. U  {) J+ m$ P' _    i++;0 `0 y% t: J$ _
    if(i==n)i=0;
1 E6 x, j* C( g: t9 E4 W   }
4 f0 y# H2 F, V1 x( q' Q* d+ V  while(*p==0)p++;
' ~: `- a) A  Q4 r4 |/ F    printf("The last one is NO:%d\n",*p);: t2 r( X" ~" |: n4 K
     getch();
& L3 a3 H5 w/ Z+ j) G! r. y  C' y) P% S/ ?6 ~5 E; \' j% \
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
& J5 v2 U; v; n* I# L( {namespace 又费马达又费电
% I) N+ Q3 Y& B' ^2 C( z/ ?{
9 W! U1 D' m4 N+ n- R    class Program  J7 i8 K. q2 Y# ~5 H$ n
    {
7 c+ g9 m6 H& @        static void Main(string[] args)* T$ s5 f5 Q) x, n: ?
        {3 O9 E7 f/ i. |) i! k8 ]) @
            int m, n;
% V8 }5 H$ F" r( R& E3 z            Console.WriteLine("请输入数组长度");( ^. I# c7 m( s# ^
            m = int.Parse(Console.ReadLine());//m为数组的大小
4 n2 L  n$ E+ m2 ^7 m            Console.WriteLine("请输入要截取数字的大小");
. k* g3 U0 g8 @) Y; x( r4 F            n = int.Parse(Console.ReadLine());
" k! q2 k) n* w/ |) e            int [] numw=new int: N: f4 u8 k: x
; H& M; R2 M3 L+ f# X5 @. ]
&shy;&shy;&shy;;
5 @8 |% b$ C: @" f- Y! d; I            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
5 y7 E* b+ o: @8 x  {6 C8 W+ N            {
. Q) s- M5 Z# a6 P6 M" W                numw[j - 1] = j;( V- N% [7 _4 t: K" Z. q$ E
            }3 d# K0 h5 ^' Q- ~6 j& J% h( X
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
6 {* O' h6 P" l3 W6 n8 I5 ?            while (d != m - 1)7 d- _4 x; @. Q
            {# g& B8 B  p6 d. ^3 }
                if (i == m && d != m - 1)! C7 P- R. S" ^4 [
                {1 }% j" Z2 }" v. V# r% _
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
! H5 F: u7 d! d8 j8 ]                    continue;1 j+ d5 @/ V  D. O( G0 ^
                }- I% [2 Z* C* I& ]( I3 j* h2 }1 a1 a5 q
                else* N! F, Q: M% }0 n" [
                {2 X# R5 L9 W+ |
                    if (numw[i] != 0)
, }& `9 h8 ]; p: F# [8 D9 c                    {
' {  s- j$ L8 c                        i++;
1 ~6 g0 l  D7 t6 W+ i                        k++;$ Z4 u: M: K5 ^) v
                        if (k == n)
' a$ m$ `9 `: \: |1 Z& p' a; s                        {1 g! S& ?* R( G# u6 c
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
' i0 E7 d4 R: J& p0 L0 q) W9 {                            k = 0;- S: g$ b" O! l8 i+ v8 I& k3 c) ~0 b
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小12 i: z( I& F6 i+ Q
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
! f( m6 b. I* R, }                        }/ M( M0 e  Q0 `1 R4 R9 O, F
                        else//输出暂时还没有改变数组元素的值7 w8 K7 z7 p4 G$ m3 v! C
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
  k! U& r: [8 Q0 m* a$ G                    }2 T( P1 b& ]0 |4 g7 X3 e
                    else7 S5 L& }* [6 G* i7 \$ X& f
                        i++;//数组元素为0,直接跳过,不计数。。。
! R/ n2 L; p9 i: j$ Z                }
6 N: K; t% S; H8 ~+ z( k2 H, R" R7 [ + R) W" q; I7 g% Q2 o9 J  S

. z* ~- F+ M3 d8 b' P* Y6 E            }//结束while循环
! }) f5 z6 S% ^& X: ?, h% j* z5 v! C& N$ f            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦) S5 T% ?- E* F9 h0 Z
           1 W7 y" X  R6 n# r( M
                if (numw[i] != 0)
+ V% K4 X" p0 v  ~                    Console.WriteLine(numw[i]);
. N8 M1 j8 j& u           
1 @* d2 R# t3 O% ~7 f            Console.ReadLine();& h/ ~3 e2 J8 H; H9 F) h/ f3 I0 B& d; }
        }
/ e$ t. h5 p+ }/ f" }+ g    }* E. f' n7 u" ]1 x1 L/ @
}
  [( W4 Y/ g8 \" h
小甲鱼最新课程 -> 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-28 04:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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