鱼C论坛

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

猴子问题

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

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

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

x
大家好!
2 i7 g: C0 O9 v. [这几天我在忙着编一个问题,我用了一种方法编出来!
, b& B1 k0 R; M' z  ^' L但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
8 [7 ^: j4 b- \: A( v注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 : i/ _+ {  l9 ~/ R: p

" D: G0 a8 s& F( W; R* C% `  d3 G- z# }3 G& r
                            题目
) r8 k2 H* |- O6 m6 ]7 u$ [0 _" r山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
0 X. r4 a0 N& \( l1 f: C1 ?第一种方法:利用循环链表
& `* t* i: P( }/ u) h#include<stdio.h>% `+ j% p6 d" @1 F# B
#include<malloc.h># V9 Z8 o4 u' u! D
#define M 8            //共有8只猴子& ]+ @. N8 \2 y
#define N 3            //数到3只时退出第三只
# e# v1 S& G# @' A: G# ]9 L9 }4 Ltypedef struct monkey
8 B: R& y7 e8 q5 o* c/ K{int number;
( r' {; W5 U9 M# b2 T) zint flag;
3 E  A3 E( q5 T4 \struct monkey* next;. X3 Q! c; O2 V& s
}MONKEY;
* W1 x. ~" V4 ymain()
. B5 C6 I( P# b- h{ MONKEY *head=NULL,*p,*s;
7 i* \/ `4 s5 _1 t6 Z  j* l  int i,sum=0,count=0;
" X, o5 |8 ]& P: z! ?2 f  clrscr();              //清屏
5 }1 `7 I+ Y1 D* `* c  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
$ _1 m8 b8 v5 t3 V# O  p->number=1;p->flag=1;7 m( }8 R7 g5 K1 `6 P4 X$ S
  p->next=head;
* [5 Z) `; K* Y9 v% S! J* r  head=p;
- s2 S% z* N, q  B9 k+ a2 x6 z  for(i=2;i<=M;i++)5 Y3 D+ \" u4 \
    { s=(MONKEY *)malloc(sizeof(MONKEY));
% c# i" w% ]7 n2 O2 ^$ q+ d     s->number=i;s->flag=1;
, j0 @# V* E, k, I7 I     s->next=head;! d+ \1 ], S% M- o% f
     p->next=s;p=p->next;/ u  t% r  R- q8 l* x
    }! {2 e8 z0 `9 D, G7 i4 J" t; g$ f
    p=head;
* v8 X) I* ^: y/ U) V! |   for(;;), |8 L: J# \- K2 ~# D, A0 ?; I+ R9 t
    {if(p->flag==1)
5 E" V, j0 R0 [4 w3 [       count++;$ Y  v1 Q: D6 i0 W3 f  q# k
     if(count==N)$ k3 L/ Q' ?7 q
        {p->flag=0;! @4 F$ i8 t7 E
         count=0;$ V; }5 n4 ^9 p. t+ [% [% L
         sum++;}
5 x6 t% R( s" U& E9 w7 ?     if(sum==M-1)
& R3 D* c. C2 k        break;
& Y; e9 y& K% p8 ~     p=p->next;
0 M% m1 ]3 i" m5 ^3 D8 K    }) t7 K$ c$ Y+ v; k
    p=
6 t, k- _3 a4 ^: a0 M: s) p    head;0 y, V8 w2 z2 H0 }
    for(i=1;i<=M;i++)' S3 `& C9 ]; M8 y8 L$ Z' y, h
    { if(p->flag==1)
1 K1 b8 [9 s! v) V4 }/ C# n# y6 K        printf("\t%d",p->number);# M' O  n4 ]( E1 ]) j5 R
      p=p->next;* q$ `5 X, w/ \
    }
1 i+ `' g5 R" e# \& C- J9 j
' T5 a& Y& v2 `% Z1 ~: |. i
$ d: f( [$ {' v' n4 ]
8 o0 v) N) Y! c3 u! |7 z}
! t0 F$ r+ v- F( a1 C# w
第二种方法:数组
% V+ G2 _: T5 a9 L# Q; ^5 J#include<stdio.h>. H3 D. K, K8 [1 X4 {) m) R3 ?
#define M 83 I% O! n+ l4 R5 s0 r/ Z
struct monkey
" S' P3 x3 w2 H$ v/ Z4 e6 J, o{int number;. k4 ]6 ]9 c  X! a/ W. r0 a
int nextp;
& S" v" `  o/ G/ j0 J$ j}link[M+1];
+ M9 J7 ~: U  ~, Z) k) P9 v' C1 U5 W
void main()
. U: ?2 g7 O& V5 ]{int i,count,h;
- d6 e; T: J/ q6 ~$ B! F& Tfor(i=1;i<=M;i++)  _8 F7 ?. _" j
{  if(i==M)
. \  e% v9 X8 x( m* Q: i6 [" t- J, {   link[i].nextp=1;
- |& w5 a. \! s/ C8 T   else
9 }- [( g* `0 Z/ T. R0 v   link[i].nextp=i+1;
9 H4 V7 p) i1 F. X9 P  link[i].number=i;2 A3 Y" |: H; Y/ l0 Q9 c
}, u. B8 v' ^6 W* G  q
printf("\n");
- j/ B9 Y% H# y0 k  Vcount=0;" k& d  |% Y3 f5 [+ j3 A1 l0 ~" f
h=M;
( x6 _+ Q2 E# oprintf("依次退出的猴子: \n");. Q8 ?; L7 q6 V+ Z
while(count<M-1)
( B' |  \4 b! C9 W# ]{i=0;
( ]* d+ `+ m, u$ ewhile(i!=3)
" C- l1 ^' q2 G' ]{ h=link[h].nextp;% k" J- R7 f( Z. [3 f
   if(link[h].number)
( t0 S# j- z$ }- |7 l1 ~0 B     i++;}
7 d7 s1 `% i) x: m/ C: }  e5 n/ r" l$ @5 B9 P# ^
printf("%4d",link[h].number);
: v% k5 n4 Z- u& {$ t/ ~, p7 _0 x3 Klink[h].number=0;+ p  d* V, U. P3 R# A2 r
count++;
& M; y* j. r- e# ?) _}2 @% q( m/ G3 `1 C7 ~
6 F! z1 o% H# H1 C
printf("\n大王是:");
% j2 _- y" B) z; T! [- j% d9 r  for(i=1;i<=M;i++)+ k, A3 |  s( s* j% S$ _0 P$ k
  if(link[i].number)
! f5 h3 R; j8 F4 s( k( D    printf("%3d\n",link[i].number);
6 {1 I% P0 I0 d
6 w: E: V6 l1 B7 z0 G, p
! _- l/ S6 o, U& v0 s4 J}

  ]/ G! }. h3 @! A6 U5 s第三种是普通方法for循环
! T$ l/ S3 A( L; l8 [
#include<stdio.h>
7 G5 U. d  L) b+ w+ Y& R. c7 R/ Zvoid main()
$ D' W# X  n2 Z2 ^/ W$ u{ int i,k,m,n,num[50],q,*p;0 |6 l6 ]: `# j9 v: P5 Z
    clrscr();
+ b  C0 {, }5 ^1 ~. j. h   printf("input number of person: n=");
, s: |/ H' ^; J" d. K- G% m    scanf("%d",&n);
0 y; ], B& V! T! U' Iprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只2 J* |! q" G" N7 y
    scanf("%d",&q);
; S3 M4 G0 h  u/ H* B9 @   p=num;
1 O* V2 R) a" i$ o5 M8 k# H2 K) X  for(i=0;i<n;i++)
1 P. o1 u7 p& y: @    *(p+i)=i+1;, L8 i+ t+ o# g0 N2 v
   i=0;
5 F' p# O  b  {& W" Z  E   k=0;
7 a' x$ x' R9 L. J7 Z   m=0;$ M3 w  K9 g$ m/ x" h, l2 b
  while(m<n-1)$ p& `/ ~& H( g+ j  j5 h. Z
   {if(*(p+i)!=0) k++;  y5 y& i& s1 r. \7 ]& }" k$ l
     if(k==q)
6 U% m. @+ d: f; G- _  T  o5 \      { *(p+i)=0;
1 k; k' ]. d4 W- j. g; A        k=0;( ]& {" Q. l- b/ `- t
        m++;
+ T( g: C2 K; f" `6 J4 M2 c      }
9 K: ?6 k/ e+ _. T" j    i++;
' z' [0 z; C5 n    if(i==n)i=0;8 j1 X$ s7 z. W' y
   }/ m: Y1 m$ A4 [' P: C
  while(*p==0)p++;
( v0 Y# \) P9 h6 [5 _, k# _    printf("The last one is NO:%d\n",*p);" b5 _  `! _2 Q$ X5 _
     getch();5 s" H# ^' q, x0 n

$ K+ G# W7 s( F}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;; T" [; X  s- m- Q' J) B
namespace 又费马达又费电/ d) ?( B: v' `6 ]6 [3 p
{
. C9 R  G* z+ X/ D    class Program
: A/ U+ v, l: ~8 z    {
7 \6 S0 D0 @, F# ]        static void Main(string[] args)# B6 D1 s  t5 y4 k5 W- o
        {- Y8 v6 n! ?5 x: z
            int m, n;
$ r2 l* Q/ Z7 X' |+ G/ S7 }3 Z0 {5 Z            Console.WriteLine("请输入数组长度");
; k( g8 z6 p1 O: c            m = int.Parse(Console.ReadLine());//m为数组的大小% ?" \, A* L& C9 k" ^4 Q  C
            Console.WriteLine("请输入要截取数字的大小");
+ j2 |# h, E+ g" O, I            n = int.Parse(Console.ReadLine());
, S" w8 C5 Z( j1 p" y* O2 V" a            int [] numw=new int# ^2 h: n4 b& k7 s; v8 i. a

3 f9 w! C: b3 _" R1 |+ H&shy;&shy;&shy;;8 J+ \2 w) v# R: b- P  T  Z3 e
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
. c5 z0 `2 e# a( `3 X# g            {$ V# L& L5 M$ t
                numw[j - 1] = j;3 k: d# K' w2 x. D$ B
            }
; U' K, M' D! g+ F            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!* `3 T9 j9 B0 d% A
            while (d != m - 1)" X) ~" K1 a% D( {8 N
            {8 Y% S+ c' K  e; r2 C4 l
                if (i == m && d != m - 1)
/ g* ^, G( ~* r' G8 ?/ S. B                {
8 i# c" C; |- l                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!! [8 L6 o* s8 Q( C
                    continue;8 V. q- P+ x% n2 C
                }1 ^- ]& W2 {: V' j* F6 \5 G
                else
9 V8 j. q1 q& z: A  e8 K* M+ N                {, Y5 V2 c6 d5 C  j: n# I2 w
                    if (numw[i] != 0)
) ~8 \0 J2 A% O$ X  P$ P2 B                    {
7 B1 g! a$ i4 E. ~9 X' h( o$ N- f                        i++;9 \! b# ]! h8 q  A' N* g
                        k++;
/ Y' `. [  Y9 A( w) T8 ?% q' z9 f                        if (k == n)
) J8 q! v) [" k                        {* J0 i- f5 l: W0 W
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
$ g3 ?4 m/ m4 E/ v                            k = 0;
) t% R3 C: L" Z/ E3 s% k! O" Z              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小14 d# q* v) v  ^  P5 b5 W
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
) b. x: I  c5 x6 k+ W  ^7 v                        }
9 n# Z0 A- `+ g# u1 I" f, p+ N+ O                        else//输出暂时还没有改变数组元素的值! n) ~/ Y- D7 u  Z# I2 B4 ]! K
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
* M0 V: W2 I+ G                    }" c; m" ~4 I& T, r% w
                    else
1 W5 b2 U! p  w2 W5 w                        i++;//数组元素为0,直接跳过,不计数。。。
# g7 r1 W, z0 j+ g5 L0 Z                }9 O0 G+ ^7 }$ N! T
; J: b2 T" s: d6 X1 A( K/ o
5 x. E4 w; a' G; f3 G& }5 _
            }//结束while循环! I8 K' @! L) z3 y  B8 b9 U+ n
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
1 s: Z# X6 A  |( E. O           
3 y7 [/ M. I* ~& [) g7 e                if (numw[i] != 0)! h' H$ J' [" E2 K% f
                    Console.WriteLine(numw[i]);
9 ?3 ?" u+ L# n  ?: c8 B3 z2 h           / g2 ?* _& x; v
            Console.ReadLine();
$ d% f7 z2 p7 R# a2 X        }$ j# a5 O% E. l+ o3 M, N
    }3 u% m9 P; E) Y( V( {6 U
}8 o1 a* z( A4 O+ p+ d  R' 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-10-12 16:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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