鱼C论坛

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

猴子问题

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

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

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

x
大家好!
; t) e  s- U) t6 S1 |8 M: {这几天我在忙着编一个问题,我用了一种方法编出来!
. [. u$ @8 T* c0 \. u( P但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
* B: y) U3 f4 ^6 C( P) I, @注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 4 m' c1 h. m) _! W

' Y; M" v( J9 U# ]) n/ z% r2 c5 N# P7 q8 J
                            题目
$ a, [0 M2 W+ t; f; i: o) O5 p! _! @山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。" d. @2 M6 d3 x+ C( ]; Y
第一种方法:利用循环链表
& z1 w6 [) p3 W. {8 E4 @#include<stdio.h>
5 B! ^! _$ g+ u$ x% E* t8 y1 X/ L#include<malloc.h>- U2 y& `1 S; H+ M7 m/ J+ n
#define M 8            //共有8只猴子
% q( a# B/ T/ z# A: t#define N 3            //数到3只时退出第三只
( O$ s1 O8 r8 t0 v+ s2 ktypedef struct monkey- n9 R4 @' J* d' L  _, T  \; L
{int number;
: ~  Y: W  k8 pint flag;
& i2 r5 X; T( g2 T2 _# o0 H( dstruct monkey* next;- u8 ^7 G9 a3 g* O1 a. V7 b3 b
}MONKEY;
7 w0 C3 ~# B( n) T) h  ?( c1 qmain(). |' z( D, u' d9 v
{ MONKEY *head=NULL,*p,*s;
/ t7 H6 h+ ]5 u% x7 d: ]  int i,sum=0,count=0;" U$ \6 `& K" j9 ~% h
  clrscr();              //清屏" N9 j" O4 g$ U' s# G, f. i
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存. W( i* i4 F1 c2 m4 i! X
  p->number=1;p->flag=1;
' ]. l" q) W( o  p->next=head;0 J4 H- O8 o/ L. h' ~( t! A
  head=p;9 q, v8 ?8 {% C7 H  J/ @& |
  for(i=2;i<=M;i++): w( ^" }/ z" a
    { s=(MONKEY *)malloc(sizeof(MONKEY));0 A# Z( g  \" ]6 r
     s->number=i;s->flag=1;. D3 {' I3 i% e) n
     s->next=head;. {2 o" T+ {$ U# P! i" O
     p->next=s;p=p->next;- b" j  j/ K1 o* q' I
    }% l6 `1 T9 W, j
    p=head;
# \1 E- ?7 p# T3 o3 M3 o' N   for(;;)% i, ?  B. t! _# D) A
    {if(p->flag==1)& o6 e" Z* p& I+ M3 y! V# ~" h
       count++;0 {- D& m% f% N5 T3 |
     if(count==N)9 l( j: L$ ]8 _8 ^9 Q4 c2 w4 V, F& u' H
        {p->flag=0;" e" u& ]* p/ ]$ Y- I9 u
         count=0;
* [- D7 ^0 i5 W- m" ]         sum++;}. m# f' `* y" U' M+ f
     if(sum==M-1)
5 q: F' V$ T- H- |( p8 w) r        break;8 V. |' h) y2 R3 A: d. N9 E
     p=p->next;
+ h) S  j% W7 v& h% X0 D    }
7 m4 J# ?  o' v5 X1 o% l    p=$ U& m( }8 U) o- k% K% F
    head;$ t8 P& e% D9 q9 O. c( j6 w0 n
    for(i=1;i<=M;i++)1 g0 V/ \3 z( O* o; m" U! I
    { if(p->flag==1)
2 X# X. [1 _  f        printf("\t%d",p->number);
# h  @1 O) S0 j! {      p=p->next;
1 g! \8 [7 b& u    }  f1 r5 K4 N8 S( ?6 n

% q" s; v( K3 Z
3 {4 P9 ^0 W8 @. M/ I2 R
4 @- ]9 v7 Z% q) Z8 [}
& }& r& W  e. O7 n* Y
第二种方法:数组$ |' F" [" ]. t# i
#include<stdio.h>! R9 a! v1 W. E& [+ H" `" }6 e; C% U: g
#define M 8
- o- x9 @+ u; S) }/ Z, [. Z- Istruct monkey
' W# b  K" Y7 [  d4 ?{int number;- i" ^" U$ ~+ b& v! s
int nextp;$ W  ~+ e$ f' P( L% l6 R0 d* n
}link[M+1];
$ P# ^* I7 C8 o3 t
, g6 z/ x9 ]6 S6 Z, tvoid main()* @0 ~  G% v6 I8 P
{int i,count,h;
4 U/ u" l' C6 t$ v# Y+ Afor(i=1;i<=M;i++)
7 ]! J$ {$ p1 v/ @{  if(i==M)6 Q+ M: ?1 b$ D
   link[i].nextp=1;
+ Q# r: C8 c! s! M   else' d  E8 }7 C3 X' \/ K
   link[i].nextp=i+1;& C' K. ?/ X9 u! u2 H7 i+ ?' W
  link[i].number=i;
$ G: t4 O; H" v3 V# Y5 a}
4 J0 x5 n  f) y$ @. `9 Eprintf("\n");6 G' Q7 _  Z, j4 ~6 a# f
count=0;( P( U+ f- R4 n. Q( P+ Y
h=M;
4 T9 \/ b: y' s- y+ }printf("依次退出的猴子: \n");
9 H: Y+ F$ y+ Z: gwhile(count<M-1)3 s3 @! p: M9 x9 L& i& O  {
{i=0;
$ ?4 ^; g3 |, v6 k, w# Vwhile(i!=3)
7 ]8 u- r; I, s$ K$ d1 U, h, k{ h=link[h].nextp;* E# \! b* P9 P8 A, L' m5 Y$ n7 T
   if(link[h].number)0 ]' K) T1 g% P( r
     i++;}
6 v$ [1 L$ }& ], L; d9 e& N0 t4 [7 Z3 Q* t4 h7 O
printf("%4d",link[h].number);9 `/ L# p6 Y5 Z# W+ k
link[h].number=0;* a: C" V' N, H4 L' E2 Z) O) ]
count++;1 p7 U6 n" w; y; @2 _$ X
}
; X5 R; Q; C' Y4 Q
: x& ^5 P8 P% ]( u( Q' u8 d/ w* N$ I( L- Qprintf("\n大王是:");" G* W- ]4 {3 s! F: S
  for(i=1;i<=M;i++)
4 |  F# T8 V# y7 g5 S  if(link[i].number)
) s9 n9 ?( q# X# }  {    printf("%3d\n",link[i].number);" R- a4 _- R9 |7 ?# B. C. \
! }( d0 D5 Y1 U: Q
3 l1 K, j* O; A" s2 x: V( K$ N
}

" Z: ]5 Q4 s6 l. r+ N第三种是普通方法for循环
8 n$ a% g# J1 ?. K( `
#include<stdio.h>  ]8 N* w+ k# f! B- @0 Z4 F/ s2 x4 b5 w5 n
void main()
9 |6 O& |0 P* i7 r( \2 p{ int i,k,m,n,num[50],q,*p;
+ w6 C0 h1 [1 E9 C% H% M. f: o" k    clrscr();& I7 b) h; A- U% P
   printf("input number of person: n=");
; u, ?4 }8 o" w3 y    scanf("%d",&n);
$ k9 V( C7 `2 x/ X4 {printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只0 }" Y* ]5 Q' e/ s2 Y) s
    scanf("%d",&q);" ]9 k  R: X, ]- f
   p=num;
& c- O6 m! M5 c# }. u! t  for(i=0;i<n;i++)- z6 Y9 E- @- z; O
    *(p+i)=i+1;
( T3 B& Z- M% z% u$ W  n( q+ T   i=0;/ E7 v: T  b( ~6 B' y3 U% b. t7 I
   k=0;
- h$ }6 b+ b8 E; H   m=0;
  W, _, U8 ^: r1 h# Q+ q  while(m<n-1)+ X  L+ \+ f+ e1 V# |
   {if(*(p+i)!=0) k++;
! ~5 @' `- t5 o     if(k==q)2 U: q5 f0 H5 T: |  C( F
      { *(p+i)=0;
" l6 K+ {( o& ?0 s        k=0;% L/ M  t6 e6 s% t
        m++;* f( v" G, `- W6 q  @  R9 J
      }, V: [7 @" P7 T% e- b* G* S( {
    i++;8 J# W$ R/ j6 U& m+ o
    if(i==n)i=0;
" C. J2 ?. M, V" t* `: [( T   }0 _& _  d0 c9 b0 g* y! M, b( c
  while(*p==0)p++;
4 A; c4 B, Y9 f. O6 c+ c* J' W9 R) M    printf("The last one is NO:%d\n",*p);( |6 P3 p7 f# ^% m0 A+ a
     getch();
7 o9 g7 [. r3 w
$ b0 j! ~: ^! u: A( v9 k3 K9 I& c}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;) \" l# l  Q3 G
namespace 又费马达又费电* ~- S8 {  A" ?& M3 V# D$ ~
{
  ]7 n# M& u/ T) h    class Program
: t, w  |. @9 V    {' L. ?- s) n# `: i; Z4 d
        static void Main(string[] args)2 p1 f8 N; e) C
        {5 f0 Y8 B# s: [4 ], [. R# B. ?0 C
            int m, n;7 m7 D$ N7 J/ p2 ?* ~/ U
            Console.WriteLine("请输入数组长度");
, M7 [( ?1 I  J            m = int.Parse(Console.ReadLine());//m为数组的大小
$ L( P! }$ y0 `) X, j            Console.WriteLine("请输入要截取数字的大小");
8 ], }$ M. Q1 X: m2 i& [            n = int.Parse(Console.ReadLine());
2 z0 Y1 [6 Q' ^) f2 p+ h: A            int [] numw=new int% f) b. I, f0 p; N

% k2 ?$ i9 R/ {7 Q1 i&shy;&shy;&shy;;
8 m$ ?1 m2 d# ]# n2 w( _. y; ?            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数4 b% r' D8 J" V5 A+ h8 T& |
            {
" }5 W* w! `5 P% O                numw[j - 1] = j;
# c2 C2 R* |3 _; G) G            }& g2 i$ A! `/ D
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
) A9 l* m' N8 z# L4 G1 _$ `- C5 ^            while (d != m - 1)
( N+ ?0 I9 n5 z- |9 A" ]            {
. Z  S6 }- _/ t. [# }                if (i == m && d != m - 1)5 m8 J2 i/ B6 F& h' u8 y
                {1 P  T* B$ n5 v7 ?
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!4 E5 p5 o  k1 @
                    continue;/ s4 q# a7 y2 P# g; b. f
                }
" L; T: J9 E, V. g6 O9 A                else: {: X0 ?* w: |5 i, h& y2 H: g+ S
                {' l7 i' C1 B9 N0 E, X
                    if (numw[i] != 0)+ M7 B2 p3 n4 v
                    {5 a, x# }7 ]. t
                        i++;
# U" v9 g9 ]; |8 X, T                        k++;
, Z/ n! u8 K6 f1 M                        if (k == n)
* r1 F% s2 [" U                        {0 e7 b' a4 W7 N2 Z+ y( P
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了3 k8 o7 {) P, L+ }- Z0 q  g
                            k = 0;
! h/ U/ ?) q# t0 M, g) \              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
" F# |0 s; z" F2 Y9 b. Z5 y$ |                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
! A3 l0 a4 Z  p  D                        }
" F1 h  u  g% W$ F0 u                        else//输出暂时还没有改变数组元素的值
6 y  L6 J4 B/ |, _                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);9 ^9 s) y1 |, A6 @- N
                    }/ q1 P6 R! l6 }
                    else3 t5 W" C% C: @' m+ T) B
                        i++;//数组元素为0,直接跳过,不计数。。。5 s3 X0 J: j, u- y( x
                }. @& Y" s7 {9 C$ ^+ G/ }. D

/ J- |! m: [6 g! X
6 T* V% e' v4 b) b            }//结束while循环
' o/ o; o5 k0 P& a# V- M: M            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦3 o# s+ Q8 d( j5 z% n$ C
           * H0 V6 V+ d/ J
                if (numw[i] != 0)
" `" ~6 B& O: y3 e1 d                    Console.WriteLine(numw[i]);
  l9 D- k# r6 V$ a6 N& D. |           
( I0 P8 ~$ h/ Q$ N: D: Q3 c            Console.ReadLine();
. S& \5 v; u1 I        }
! x) x9 y: P! G: R    }
2 Y& N4 U2 K. X6 U}- a* Q* ~8 t! C  B$ d* 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-8-22 07:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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