鱼C论坛

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

猴子问题

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

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

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

x
大家好!9 l& Y5 J$ ?0 J7 }/ u# Y
这几天我在忙着编一个问题,我用了一种方法编出来!
! u; r% ?3 `3 u4 T9 x; [: b但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
( Y' r. I( K0 }8 `5 K1 J! f注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ! A% Y' y* {! \. @
2 }" x" h( A& a0 J4 I

& P  H* n8 |0 C6 z0 G
                            题目/ Y1 \! U* v' {
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
6 G/ P5 E0 E9 w4 e* \( F& \. S第一种方法:利用循环链表
  R( `6 v5 ~% j$ Z" @8 Q. e#include<stdio.h>
  V$ b" V: r+ ~1 H2 f  y3 N#include<malloc.h>
' v9 o# ]& W( D  y#define M 8            //共有8只猴子
/ Q$ z1 ^6 U1 M#define N 3            //数到3只时退出第三只
) S* ]7 K& v! [: V, a) T6 T. _typedef struct monkey5 W0 b5 n; S) y, L
{int number;9 K$ a2 T  b( k- F5 i
int flag;
' N: M) \% M3 gstruct monkey* next;. n! U2 @! `5 l0 X  d, p" X  ~
}MONKEY;
- Q) z) c: q! @* ?; i  T9 m5 Lmain()9 E$ F: U/ t5 X$ d# t+ l" F; @
{ MONKEY *head=NULL,*p,*s;
( s6 w. f" N% g" H( p  int i,sum=0,count=0;
9 j  t* a" R9 g/ p: g! m5 b  clrscr();              //清屏
4 P/ ]/ j. `( V3 q; v  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存* o/ r: y1 M% Y6 R( [* v  y3 Q
  p->number=1;p->flag=1;
8 h/ @" z7 b2 \$ M6 ?  p->next=head;6 `/ G+ ^/ C0 K9 T
  head=p;1 ^" `" S" Q$ ]* r. H
  for(i=2;i<=M;i++)! C5 z  a2 i" W
    { s=(MONKEY *)malloc(sizeof(MONKEY));4 M+ \' U$ Y) W+ i( y
     s->number=i;s->flag=1;8 [% M% r4 b3 m; \" ?* A
     s->next=head;
( V& B! E- U$ ]( ^$ A     p->next=s;p=p->next;7 S1 U% V  \, M" k  z- O
    }+ o8 a' L3 m, H
    p=head;" w# v5 d( V; a; E, Z+ ^" e, K9 e1 o8 a
   for(;;)
$ P/ ~) k0 V# g4 J5 u4 A    {if(p->flag==1)
; b( U; d) ^& o" [; _% @       count++;
3 z  q/ [- Z. K- J" L6 `     if(count==N)
) [% Z+ M4 M; t        {p->flag=0;8 r6 v( k: F! a2 W% V4 E& w
         count=0;
9 s' v( C' g, f2 i, w         sum++;}
+ v3 T( l3 c( B+ s1 H! Y1 {     if(sum==M-1)) m: b& `% N  @
        break;
) z2 s* ]8 x) }7 c" U1 V1 u+ A     p=p->next;
' I( w- q2 {6 Z9 m9 N, E    }9 M" V# t/ R/ |
    p=8 N8 b+ @4 U- ~$ `, @" ^, Q% C
    head;
  p: P8 ^- @; [4 A0 Q    for(i=1;i<=M;i++)
. l3 f! l0 p) ^) U3 ?( A    { if(p->flag==1)  D: @) M5 P, \5 {4 u% Y
        printf("\t%d",p->number);" x& }9 _" H- u, ~
      p=p->next;0 e& e0 C6 S0 p  R( ~+ f
    }
! O( k; C( ~( D$ ^# D; x; m0 H+ i9 e% `

  Z3 f4 W$ Z- Y5 W8 a4 S5 U9 x: x* \5 I& z5 v/ M6 D
}

* X+ [$ S5 R6 f  }- m$ A第二种方法:数组9 o" k- g1 s- V3 e2 n, @
#include<stdio.h>
% h8 g$ u  A+ G5 U; w# i#define M 8/ q4 l* b" H+ U3 J
struct monkey
# N6 H; t: t2 {; q7 I) s: i. G{int number;. W+ Y$ q0 d& b. j" T
int nextp;$ o' d' d% [' M. j0 p7 c# ^
}link[M+1];
* I2 u" M: m7 D4 ^4 e/ M
- @. N1 r( @7 o8 U! l' C" R: Mvoid main()
" `4 \# Z* H2 ]& s* y$ _6 [{int i,count,h;1 ?( X/ S& E2 `- y3 P
for(i=1;i<=M;i++)
( n0 T$ b, q% {4 `* h& H{  if(i==M)/ J/ X* i$ u/ K1 q/ l
   link[i].nextp=1;# x1 V6 z; F) _
   else
0 r" w. u/ |/ m. ?2 Y/ R1 l9 o   link[i].nextp=i+1;, {: K9 Y8 Z8 ^/ b, b
  link[i].number=i;6 I+ l; ]3 o- N0 d1 u% x" }
}( ^$ \# {, e3 _$ N
printf("\n");
+ s- [" I7 B% B" X- icount=0;
9 J' {& W  r7 s# {& d4 Gh=M;  \0 G' S0 a# G4 C  A6 S! W% R
printf("依次退出的猴子: \n");; Y0 a2 |9 M4 |) g0 n" N: T
while(count<M-1). z* I' g/ V+ Q; E- g* p8 L  ]
{i=0;7 m% |* T; k: f: {7 n
while(i!=3)& o& T' \: u6 J* O  K$ _
{ h=link[h].nextp;. i% d, c/ K* S/ A, h7 @1 X; ]
   if(link[h].number)
, B5 }& c- F2 c     i++;}- m" _/ E7 @4 L

. O0 O( G( N3 eprintf("%4d",link[h].number);
: G* S+ T) ^0 b3 `: f1 h  }link[h].number=0;
3 P1 k$ z) P: r6 u4 w) ucount++;: R" j$ c: \# Z
}$ P8 k; w) v4 g, D" Q( V
: H0 z$ F6 g4 h) o/ e0 v
printf("\n大王是:");
5 G: j( S+ V0 s) B  for(i=1;i<=M;i++)
4 X8 y8 l/ _( t& |% |( `+ n. J: j  if(link[i].number)2 S' ?3 V' t4 `" x1 \
    printf("%3d\n",link[i].number);9 G0 L; I6 T* z6 T. l- I

0 {) u, w: q, O7 z, [0 b; g
  [, q& @0 h7 X. a}

" s3 Y- D* N4 u0 L( ~5 V- F$ w第三种是普通方法for循环
: n$ `+ b! G2 [% ~1 y1 g
#include<stdio.h>  a: ^' F1 I7 C. U! [" l. \" {
void main()5 W3 d$ R$ V. p. k1 v$ z3 y9 t, n
{ int i,k,m,n,num[50],q,*p;5 U: N! n# ^+ n1 z! y
    clrscr();9 `9 _  V6 A& p4 W6 N# {2 d3 ]: x
   printf("input number of person: n=");
3 P# k! V* h! B- o1 F; W7 x    scanf("%d",&n);6 e. r- V8 y& m' k2 r* C
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只6 h" ^& C. M4 Q4 Q
    scanf("%d",&q);
; c$ `3 c* Z( g: L% C   p=num;
. K' g# T+ `- f* U8 d  for(i=0;i<n;i++)
" ?* R  Z5 x) ~) @& ~    *(p+i)=i+1;& ]7 O- D1 }. x+ I9 m  l
   i=0;
6 y: Y3 `2 W1 D+ V+ T   k=0;% ?4 Z2 o$ F4 i# U
   m=0;
$ G' t* E5 ~0 I  t  while(m<n-1)
: G. U7 q! T' \* P4 k   {if(*(p+i)!=0) k++;
% B. s3 @8 T) r     if(k==q)
% p0 H, y& J5 y' C9 l7 X      { *(p+i)=0;1 k: c/ `1 \0 O( Z2 k2 N9 z3 |
        k=0;
" l" q- O0 S4 x2 R$ V4 T) K/ Z        m++;4 i- s5 b) P6 P$ _" _  Q9 [
      }5 q( y$ u! W" P  d7 s) _
    i++;: f8 v. f/ Z9 W
    if(i==n)i=0;
1 {4 @5 }" i0 D9 A8 U; T- [   }
) m  W" {5 J( T1 U. d  while(*p==0)p++;/ y) b! ^+ W, F+ S; U
    printf("The last one is NO:%d\n",*p);) C7 X7 T; e  w) K' m
     getch();: B& h, S; J3 ]7 f, q
% l' s" |; O# \7 h/ O
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
5 v5 j3 `' ?' h" enamespace 又费马达又费电
; F( s4 i* L5 e& B0 ~3 e{
* Z4 F  C! ~- K* @- @6 v2 O8 q    class Program
  Z7 T- o7 W7 F5 l( Y6 @# F$ W    {
! A# R9 V7 h: r8 d7 d1 n        static void Main(string[] args)
+ Q7 A5 H! {% a( [% R- D! [% i        {
2 u: L. G  U" H, g- z7 I            int m, n;" y) F( a7 @: q5 |8 k1 w7 R
            Console.WriteLine("请输入数组长度");
% h0 h, T. \& ~/ a' `7 ~            m = int.Parse(Console.ReadLine());//m为数组的大小
% c/ ?' I3 [5 K. ^0 r! z            Console.WriteLine("请输入要截取数字的大小");
' o+ w* z- X+ I# q3 z# n8 A            n = int.Parse(Console.ReadLine());
  v( q3 E5 L8 m8 r- u) U8 U8 y7 L) \            int [] numw=new int
$ ^7 r) P  V! c# S- f' Y: P7 p/ f" G' E3 c: h) Q9 N
&shy;&shy;&shy;;  w7 @: L1 _1 n+ x: c9 t
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
& w$ Q0 v. Y- m. S. l1 ?            {7 a9 W8 i/ q# N% E7 Q( `
                numw[j - 1] = j;9 _. s# U* e+ P# [& `" U) K: m
            }& J' n$ T" _; g# o: C
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!% o% [& @5 g# W' M  r& `" ~
            while (d != m - 1)
  N) N& [5 z" n4 m            {/ f- r/ Z( D; b- Z
                if (i == m && d != m - 1); ]% d. Y3 [$ w# G8 @- N
                {- z  |3 Q3 t/ R: v& _4 H
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!$ f& E9 D& U( Q
                    continue;
+ {  Q  C9 R2 r                }
- Y; l- W0 w5 Z3 D                else
7 q5 y6 P+ J; U* q' R                {
5 W" }8 A) H, W, G+ D                    if (numw[i] != 0)3 M* ^$ p/ }8 {0 K# g8 Q
                    {$ p6 l1 P2 }8 F. y7 b8 A
                        i++;2 n4 V% i2 s' C( n
                        k++;8 G4 t; m' z# ?7 }0 r
                        if (k == n)  x6 V& b5 H( Y- f* y; z
                        {
3 i& F! I+ G0 D! h; G                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
8 w  W& s3 T5 P$ @. [                            k = 0;% q: |1 U4 `5 j4 O. o( F
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1  I0 ~* N# t/ Y3 x# {! I4 q1 d# `7 a
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
9 ?5 k) a. L2 ]+ X/ j$ |1 N                        }' O8 g) C* [( c* e/ F# V/ V
                        else//输出暂时还没有改变数组元素的值
( w1 [6 X9 a1 J                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
& f: V! T* ?! [, M* P; K. R9 u6 ]                    }! W  }( {) O2 t0 t4 h% I$ F
                    else
' N3 g$ S: f3 Y5 a- n                        i++;//数组元素为0,直接跳过,不计数。。。: d! X% `4 h* m# x" Y
                }4 n% I4 Z! L; d
% Z1 S0 G$ F) w

1 Z# g3 Z; {* K1 Q" P' y            }//结束while循环7 C) {4 h6 o. }) r  s
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
) V: O3 J- D- F5 W% I4 z. f+ R           ! ^% H; O+ a9 ?/ [) {, [
                if (numw[i] != 0)
; X3 Q- ]. E3 k, x, T( J                    Console.WriteLine(numw[i]);; i& h% A9 @# G7 [" s' a/ z
           
9 W# ?) h( |' v! m& V* G3 ~            Console.ReadLine();, q% p  Z# x6 F( g
        }/ R, [& M2 k6 s% X& X- m3 k3 Y& q
    }
- i- Y2 I( s( f5 l1 Q}
( z5 u5 }/ t8 ?& |5 j
小甲鱼最新课程 -> 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-17 15:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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