鱼C论坛

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

猴子问题

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

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

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

x
大家好!& M* `$ M3 j( X* v
这几天我在忙着编一个问题,我用了一种方法编出来!
9 u6 j4 ?+ O" S! ?6 f7 F; |但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
5 \# ]0 ?2 X  ^( i注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
4 t/ P: a# P" A/ c7 `. I+ j& m
& G( Y+ j$ Y6 x& Q6 ^: U" T7 ^) L7 i
                            题目3 C3 B  E1 x2 l" J  D
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
  v/ K4 J1 p, j& V+ `) {& l; [第一种方法:利用循环链表: t7 z/ f5 Y: {, S" h4 Y
#include<stdio.h>
$ M# \8 d' n6 @5 C; c. Q#include<malloc.h>3 F4 d2 I2 J% E4 L. _  D/ M2 _( [
#define M 8            //共有8只猴子% o* r* P( X! H
#define N 3            //数到3只时退出第三只
9 Q+ {- w) s" X5 P- o' C% i5 R' z5 Ztypedef struct monkey
3 M* e0 o: @$ G: s: R{int number;
& _$ o' ]$ A1 X+ _int flag;6 x1 }) J6 ]1 Q9 M
struct monkey* next;
3 }+ @/ k5 f- Z' w: k+ k}MONKEY;* Z/ U; d; I7 X" V+ s& E
main()
- ?: c! `8 }! D2 b1 B- R3 P{ MONKEY *head=NULL,*p,*s;9 Y. a2 H' T1 N, N5 f1 b
  int i,sum=0,count=0;: K5 j  n& s! ]( ^$ k
  clrscr();              //清屏8 \3 M+ k( P7 U! L  K
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
2 M* S3 R# @: z0 i; ~5 {  p->number=1;p->flag=1;
3 ^5 A. G' s% ~" k( a( c& x  p->next=head;: G# g1 _. v/ c9 g( R
  head=p;
) R4 `) s5 j% u; x" g  for(i=2;i<=M;i++)
% C$ A% [' X7 c! W' a# D4 W6 P    { s=(MONKEY *)malloc(sizeof(MONKEY));4 P# _: C7 v+ Q' F& N8 I
     s->number=i;s->flag=1;
/ z* v9 ?( G' O& H/ e     s->next=head;1 t6 P! R) d! z2 t
     p->next=s;p=p->next;+ d0 k) `8 O& H% |8 u2 |
    }
4 w4 r0 P/ W9 X: _5 q0 c    p=head;3 T$ B4 T% z) w, f! r: u& f) Z( w
   for(;;)! k7 N# N3 K; A4 o
    {if(p->flag==1)
" l3 y) l/ k& I& W  L& W       count++;6 e0 B& |/ L3 }: \# D+ G# C
     if(count==N)
3 G% e! ?) J1 C        {p->flag=0;
! b% e$ A  k6 [+ t         count=0;# T9 E) C; A* j0 f
         sum++;}
* `' k6 e7 j1 E0 l! K+ {     if(sum==M-1)6 V$ ?9 ?* U$ U* M  S5 a+ j
        break;, S5 J: f' [: @5 G1 H2 Y$ u9 v
     p=p->next;
  @7 }. \1 i; p9 g' ~    }  ^  T! ?( U8 j$ F# }9 M
    p=& r$ T" d0 b: W( T
    head;
. e1 i3 C5 r, R; D5 ], F    for(i=1;i<=M;i++)4 B: C# z3 V4 a$ o! }
    { if(p->flag==1)1 m; s5 t. F: d7 ]6 _3 r, M, H
        printf("\t%d",p->number);3 V7 k  \2 R' [% V
      p=p->next;
( S) h. T: a' z) c; [1 W  {2 O5 S    }
: f, i" r* p1 i( y- r
8 r9 W- M6 U9 ^
3 m! q! V( a5 y  A( r8 q' \5 \- v" s
6 h# w% Z* N7 G; W/ r}
; \$ c" Y1 u4 {4 L0 \1 O! G) R
第二种方法:数组  X  V! D2 N( Z* f
#include<stdio.h>
4 H7 b* |, r- K#define M 8, ?9 T& K# v: ?8 `3 n
struct monkey- ^) y0 Z7 H- x/ h# q$ x
{int number;
( B6 b' A9 P" ?/ rint nextp;' V& o9 s9 x5 `
}link[M+1];
7 I2 p- b) W  b, X7 I8 h
1 S0 @4 H8 G( L1 |0 N. z7 Ovoid main()
3 ^# ?4 n0 V* h' l9 m) t{int i,count,h;: A* y9 v& f, C- [
for(i=1;i<=M;i++)& v" z$ R8 k, Y& M7 z. N, B& T+ ?/ U+ d
{  if(i==M). E0 g' l5 E% ^" h
   link[i].nextp=1;
: Z$ t3 ]  n. q; n& x2 X6 B+ G   else
% }- f7 C  ~$ j- l( h) e; h' j   link[i].nextp=i+1;+ A! S3 }  b" w
  link[i].number=i;1 \2 g/ a$ @- V
}
" i5 p: T9 D3 p. y) rprintf("\n");, ~# V. y! a  z6 k& j  R' \
count=0;
, j. ]3 ?6 R5 Nh=M;6 M" ?- f$ d6 L4 y, A
printf("依次退出的猴子: \n");
" d! c* g) _* V" P) Wwhile(count<M-1)
2 C( V3 k; T" X* O6 [/ S{i=0;
1 q& g9 T4 [; t( p0 V, `  a) twhile(i!=3)0 U" s& y( X/ c3 L9 E* \# b
{ h=link[h].nextp;
# M1 G+ s: P7 C2 k! X   if(link[h].number)
, J  M+ U& X# T1 p* \4 H$ l     i++;}
; H0 w* T8 o2 I; \2 {' n0 T
! S* ]* O' V4 Q; y: e' q" h) Eprintf("%4d",link[h].number);
6 q# R) l' u- m6 r! j4 Zlink[h].number=0;
0 u% T: B5 [; v) n& V, Ccount++;
; l3 i5 @' d$ y7 e}
# T& u) J) ~4 F0 q4 z+ u0 q0 C& v8 f) n+ M1 q0 U% L
printf("\n大王是:");6 H" p% p/ H, Y
  for(i=1;i<=M;i++)
- Z# b4 k7 W  ^- y/ ]& u  M; [  if(link[i].number)+ N1 P: M- N9 e/ }1 O- w0 F
    printf("%3d\n",link[i].number);
9 m3 B0 V8 {' W" p; V, P$ Y& O$ h. n( \4 c8 F
6 v* D0 ]6 v- i
}
8 X. F5 i9 t# B9 ~* Y6 P/ V
第三种是普通方法for循环

' p" x" M, m0 t' J1 m) l7 j6 n0 P' a0 ^#include<stdio.h>
# b# c" G5 Z' S5 A  [. d( H. [6 |% fvoid main()- T* d: @+ O% {/ _; Q6 N7 j
{ int i,k,m,n,num[50],q,*p;4 p* L3 O+ r- O. _: ]( z  V
    clrscr();
! e; e) T5 A6 V) p" m8 V$ W9 U   printf("input number of person: n=");3 y7 s. q- i# s5 A
    scanf("%d",&n);5 A4 f- z8 `$ e& b
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只3 M8 P- x8 G) a8 C% m6 P% O
    scanf("%d",&q);
- W/ Y. B+ X2 r- b7 A4 _# f2 a7 @   p=num;: ~  y9 v# T; Y
  for(i=0;i<n;i++)( X9 k/ E! T5 |- ~4 \6 x0 F
    *(p+i)=i+1;' h. Z7 ~! H$ u
   i=0;- [. ]4 [  C) _* y8 P: Z. V1 C4 Y
   k=0;
& |; Q; x: y' B- M2 [% |4 d; u; g0 x   m=0;( g  H+ B$ c. Y- b
  while(m<n-1)
! s5 k! @# c0 i: ?, ?   {if(*(p+i)!=0) k++;
, O% c8 @, K( l8 o     if(k==q)9 ?/ j# @5 V! \1 j# m
      { *(p+i)=0;6 Z* s% r; O, M% W* f# v
        k=0;' o) X8 o, K% D1 k( z
        m++;# F( e. T6 o+ o3 P# l
      }% L, e; A7 y# z9 r, `
    i++;
( M; b1 |+ X  u* \    if(i==n)i=0;
$ V2 U7 P7 ~; t4 ^, k$ E   }
+ f$ _* e0 }& S4 ]  while(*p==0)p++;9 I+ j; B" M/ t. G$ i; L5 q# S
    printf("The last one is NO:%d\n",*p);& S" ?5 d2 P8 L- w
     getch();
& I6 A, R) [# ^3 }5 p
  V/ K" L! M, ~% k}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;- J3 X% k/ I' o' \
namespace 又费马达又费电/ L3 `9 U/ l8 v/ o' u( m
{3 b8 C0 b2 _- z8 F
    class Program' @; S; }9 X) S& `) B+ n, B
    {7 d2 ^3 e8 p$ [- J; w' `" J
        static void Main(string[] args)
3 {7 e- a# z1 [' {! A        {
. c' t) j6 [! Z+ [: K2 r4 `            int m, n;8 p3 I% O& z" |: t# u3 z+ U
            Console.WriteLine("请输入数组长度");
+ ]7 W+ M0 _3 V+ W, A1 u/ V            m = int.Parse(Console.ReadLine());//m为数组的大小7 s' c! p! B/ ^) r% @6 E: a$ y
            Console.WriteLine("请输入要截取数字的大小");2 m7 {3 e) f) u6 x
            n = int.Parse(Console.ReadLine());
! T0 W; Z2 R4 ~" }4 U. h            int [] numw=new int8 j- b  ^2 W0 H6 ?4 Q( W& Q
5 g8 `7 H5 }* v# b7 n
&shy;&shy;&shy;;" f& u4 }* v" Z/ O  Z- a
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
! m/ H/ t) n$ T: M: r# ]            {
# ^% \7 W- z4 K* E( _9 y                numw[j - 1] = j;5 v( ]" A, L) @, a) e( @1 `" a
            }$ \  a0 k' S; H/ H
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
3 V) B$ m4 v9 d4 u6 S9 b            while (d != m - 1)9 F9 D$ W- s; V- R) L
            {
) R2 [, R( V6 ]4 U4 u  i9 M                if (i == m && d != m - 1)
5 L& P' R0 `' U- _! k9 }9 s5 _                {1 N' ?% V7 H1 l9 I) ~' w
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!3 z7 W0 [( G* e1 o5 p4 G
                    continue;* O% ~3 s: q+ P, E8 E! n- ?
                }) Y' l! w, z2 M1 u% ^
                else
* i4 {: L$ ]' ?, N                {( y) A9 w9 b& T# Q$ c; Z) t/ E
                    if (numw[i] != 0)( Y% m+ f1 y' E2 ]3 b  k
                    {
  ]" F4 u- X# G2 I4 `1 {& {3 Y                        i++;
3 y6 @5 X! m4 `& K! X# \1 s0 o! e                        k++;. K6 o$ o" t9 q% o- G
                        if (k == n)
. I# [- L3 j# u" i: V/ p                        {
! y$ t& E- J- e1 [4 d# Q                            numw[i - 1] = 0;//把在n位置数组元素的值改变了) W0 U( p- a" \( b
                            k = 0;
1 q6 }3 r' T8 E9 b  d              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
+ n; b0 E  l2 Q: s. M+ y                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);: u0 a( P: `! t. M  b
                        }: p, ?8 Z% x- a# v
                        else//输出暂时还没有改变数组元素的值
: t$ p! w5 e8 ^' e7 Z3 C# Q* L                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);2 i; t8 j0 }4 g$ l9 c5 o
                    }
) \- O8 j$ k2 i" Z1 ^                    else6 j" b- ^/ s9 b8 Y9 H
                        i++;//数组元素为0,直接跳过,不计数。。。
: E. h7 I9 D1 K4 i                }" F' b7 y% o9 d& s& C" g% q

( `% R) c% s# W# E5 w1 M$ \0 }
. ?! J5 T) B- Y3 P+ m8 r9 O2 l, c            }//结束while循环+ X2 }6 e* u0 D. y0 r' E
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
( y* L2 P# {4 r8 v3 n* |           
+ i  B* ~. E" u) l- [% }" R                if (numw[i] != 0)
1 r' C0 U' ~* M1 Q4 ^: z                    Console.WriteLine(numw[i]);4 u! w7 l# s9 j. R' {7 J
           
; _5 F) U4 s; ?0 }( e8 j: q( g            Console.ReadLine();& b2 B: E$ l+ {8 M
        }( F) S& L3 P1 j. I# c, H0 [
    }
; q0 n' S4 D: Y* c0 i* ?& U}
6 ]& P% h% s: W9 T, Q, I
小甲鱼最新课程 -> 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-9-20 15:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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