鱼C论坛

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

猴子问题

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

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

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

x
大家好!9 V% }( Z& a1 m, f. X) V' N
这几天我在忙着编一个问题,我用了一种方法编出来!
# |2 M0 {8 t9 r6 L2 i2 r但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!& n0 Z/ i  m! C# P- H3 [2 A/ w
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ( b- p( {% _, N0 ?( Z

* [9 D  U( x/ u# w3 ?/ u5 F  V" N1 w% m4 J  }, K
                            题目
8 V0 ^" z! b' l4 e; ]山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
7 o) K$ E$ [4 n. L& A% J! U第一种方法:利用循环链表
" m# m( p: s* r8 B" z#include<stdio.h>
% ]0 ^) d% p& y" H0 Y, r. ^5 W#include<malloc.h>" \# R3 i6 b2 h6 I- ?
#define M 8            //共有8只猴子2 @/ c; \" I9 s7 Z* a
#define N 3            //数到3只时退出第三只
7 v5 e, L1 X. htypedef struct monkey
& J1 a7 G0 v/ M! f/ O4 c{int number;" c) f5 c' o' \  ], i7 \
int flag;! g2 H& q- {8 p2 H1 @0 c7 d) a, F
struct monkey* next;
! v: Q: ]2 B5 a}MONKEY;
3 \; |* h4 v4 f; E1 K# j- o/ imain()
# R# w2 }% S  q4 U) C2 F1 b+ g  g  W{ MONKEY *head=NULL,*p,*s;
7 }4 C" ~+ J& v6 ^' R7 E. d  int i,sum=0,count=0;/ X8 \/ w- r* ?
  clrscr();              //清屏  b0 X8 O( u4 Z( Y8 W' i
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存( q5 b. w0 `  {: U( Y+ }" _' K
  p->number=1;p->flag=1;% Y4 E9 _5 {2 m4 R' K
  p->next=head;
, v/ q4 B8 [7 A- I% v  head=p;
: U% v4 ?7 W% H1 E) F  for(i=2;i<=M;i++)
! a- g+ i6 v5 N; V    { s=(MONKEY *)malloc(sizeof(MONKEY));- c' _  T& Q9 E5 |5 g
     s->number=i;s->flag=1;) i. R' f7 N$ Q" c
     s->next=head;( V# L3 e! n% t" V+ `+ a
     p->next=s;p=p->next;# n, A+ A* A: ^
    }
& z% b! R" _1 g! A& f* Q    p=head;
/ ?8 Q. m+ T+ G& K, U+ Z   for(;;)
( G, M6 }5 N' R- a. k7 I    {if(p->flag==1)% v8 W2 S5 r& }9 D
       count++;' Z+ v. t! q" l2 d& H$ x$ L
     if(count==N)
$ [# U0 }5 ?2 k3 t: l/ s/ h  k: M" E        {p->flag=0;
- k' [/ ~+ [# x( a' @1 S         count=0;* I' h5 m& p8 V# @" h/ U
         sum++;}% ^& [1 i) D# Y" h' Q" k
     if(sum==M-1)' |% r/ Z+ v  ]* L- c' l
        break;
" i8 N' Z( d# b     p=p->next;
  `9 f+ g4 x, H9 q. @    }& F* O" r1 O" M5 l  R# b8 M
    p=
8 y: ^0 h) p- {. [# U1 \" z    head;
  `. _- B- T. x4 G    for(i=1;i<=M;i++)
6 ?3 w) A- @6 J+ H; y7 `$ m4 t1 u    { if(p->flag==1)/ s; x& L% r' Z1 g7 r9 E! r; f
        printf("\t%d",p->number);
6 c4 T2 \2 o# H; r3 A9 ?0 D, ]      p=p->next;
, b, _* z7 R% R    }5 y  @: r/ I4 c* j" K6 K0 [
( l2 y! \) t  W$ x; W) W

, X# X( |4 L* y2 \% D' o
. ]) ~$ l! O9 s: X3 o8 W& e}
/ R( E: ?, E$ P" a* Q
第二种方法:数组- k, S/ R3 l) a5 ?3 |
#include<stdio.h>
) g5 ~' T' U1 s6 e4 `( v#define M 8
# K  W0 [# ~& Estruct monkey
, x" p$ d* g: ]: ?{int number;
% ^3 Z2 \  ?2 }% x3 f7 I8 gint nextp;
- Q/ I9 \$ J. C" K) i' h}link[M+1];, Y' L7 S+ I: ?  y$ I

- X+ v, A! {5 r6 P' E5 r6 M0 `/ Z+ Kvoid main()0 `2 b' }4 f+ {
{int i,count,h;
  H, ^: h7 L; i$ J( u6 E6 z0 d0 N- ~for(i=1;i<=M;i++)
2 `' G1 ^3 e! h: z2 z+ z) _{  if(i==M)
4 X3 z4 m0 {7 s" j) F   link[i].nextp=1;" a3 g6 I! l3 n* b, z0 c, v
   else+ u: e- U* F! `) D
   link[i].nextp=i+1;
" i& j9 ?" n- ?( R  link[i].number=i;4 m5 _& p: S* Y3 R6 \
}% j& v9 N1 b0 Z
printf("\n");
/ H+ q7 @0 c) D+ }# R3 Scount=0;
4 c6 T8 ^) H; u- ^+ Oh=M;2 h# u) n0 v* D. n# d5 k6 `, }
printf("依次退出的猴子: \n");
! `; g9 {) s3 V6 V, Q# l+ Lwhile(count<M-1)
/ T4 p# t% N" [( v{i=0;
# L, i# G% r4 R6 ywhile(i!=3): E) @0 d2 h5 S  i6 ?: l- C( U
{ h=link[h].nextp;2 x/ L" P- c  D  c$ Y
   if(link[h].number)
+ K) e& w! \& s$ ^$ B     i++;}& R- v. x6 }( O
  }: J, _8 P9 i5 t( k
printf("%4d",link[h].number);
) {3 W* _) F+ h$ V, d% A" A; Tlink[h].number=0;
5 p' [6 w! T' F+ S: Bcount++;6 B- k! f- s, ]& Z. P
}1 `; h+ V' g0 k! d  `6 [2 f
5 C/ i" E& t2 h$ z& c
printf("\n大王是:");7 P8 G' K+ d  C
  for(i=1;i<=M;i++)
9 f( d* p7 M5 B1 \. a3 {( _1 J  if(link[i].number)
7 x2 s8 I, n& b    printf("%3d\n",link[i].number);
" ], h( J2 A. O" U- T# S2 b! N. i+ t
0 |0 s5 P' |$ R- p0 S4 W8 I* b! {" {) ^8 F% D% J
}
% a9 Q4 M7 y8 N0 o4 `: j
第三种是普通方法for循环
8 I2 p, \5 Z9 j" S. s5 z
#include<stdio.h>/ J3 Y4 |+ x  x+ r- |& E
void main()
: m# y+ J3 H% O1 @! s$ ]% G{ int i,k,m,n,num[50],q,*p;, v; b4 |! o  k! q
    clrscr();
. V9 ~; f* _) H" F0 b+ d8 F7 x$ h- m   printf("input number of person: n=");0 J/ P$ K" z8 Y7 D( t
    scanf("%d",&n);$ w$ I* w3 a" v/ m  Q& M
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
) g% B! {$ [1 v' m    scanf("%d",&q);
* Y8 B% ^  O6 ]5 _  C) t8 [   p=num;
9 W& a. u! M! O) ~! L0 M4 X6 s! ?  for(i=0;i<n;i++)0 J  F6 N6 [; X- f
    *(p+i)=i+1;
5 e6 z% O; I; o2 m3 \   i=0;% B+ P' `. p3 _1 _* y0 f
   k=0;: r9 P$ Z3 @) ?; B4 i6 J1 L$ D2 N
   m=0;
+ d3 @/ G6 Q3 ~( X1 p  while(m<n-1)( n2 e7 v# E8 D9 o" U5 b2 d
   {if(*(p+i)!=0) k++;
+ V  z6 S. G9 h     if(k==q)% m4 u. G0 }  d7 w* x
      { *(p+i)=0;
/ j& D9 Z' {8 R4 r% E        k=0;+ t  W8 D  P1 ?& S- S. @; o# E
        m++;* K7 ]& ]! g& h5 R. P
      }
+ |9 O, L2 {1 W, V+ s. P    i++;
# }% r6 K4 j1 J& |5 O    if(i==n)i=0;. g' R, r+ F8 D, p
   }; p7 n4 [. u& m& }
  while(*p==0)p++;8 A" W: C. W' d0 v- I* g
    printf("The last one is NO:%d\n",*p);
% l& p8 r" j% q0 I) U     getch();
6 G' ?# N0 G4 T9 C* `
6 F3 ^5 a4 S6 q}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;( @) y5 M) w( m9 f  p% t
namespace 又费马达又费电9 ]: J2 n; \# ~3 k' W% D: ]& x
{& g8 z6 C3 I  n9 S; C$ h
    class Program
+ q: O$ K' B4 p0 ]9 M' L) o+ M    {
6 q2 r' t. n0 W6 k; P- i3 w3 D        static void Main(string[] args)
( c6 F& Z* a1 Q) A        {5 \( F4 F2 H6 [- o/ r) k% ?7 m
            int m, n;' G$ @3 J1 l" A! h, G5 M5 H) K* [
            Console.WriteLine("请输入数组长度");: ~- u9 @- x7 u2 X
            m = int.Parse(Console.ReadLine());//m为数组的大小
/ F' T, `! H% H+ g            Console.WriteLine("请输入要截取数字的大小");
2 ~0 b& e  Q, Q. y; I4 z: ^3 x            n = int.Parse(Console.ReadLine());
" a9 L# `3 X2 G: ]% K6 W# |; @            int [] numw=new int
0 [! `5 {. S4 ^* l+ i( z7 b; o4 N5 I* }- X( N: J
&shy;&shy;&shy;;
1 ^; v" D  Z+ w- c! A; [: E            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数0 H: t9 n+ ~) C5 W' ~  l* o3 A* {6 ]
            {
* Z; d  z* d+ b3 ?( F5 s                numw[j - 1] = j;
) ^8 ^# i4 a1 C4 B" r7 K            }  @2 P5 A6 {! t  R( T
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!9 {/ [8 K- [* r" }7 E: Z
            while (d != m - 1)7 E/ a0 ]3 K/ r# N' S- U
            {
. w' ]6 c5 t! @# j. A                if (i == m && d != m - 1)
; t4 l/ j. R, N; _                {8 x5 c# A. l  |' r2 c& [8 W
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
+ G9 T+ b' `/ x4 t7 X( n                    continue;+ i+ S" K, ~% c0 D' n6 O4 L# ^
                }
6 p. y; i6 {' z7 E/ o( a                else
5 I# ^: p& I6 R# [- N9 y                {
8 w5 d8 {+ n* T+ K& ^( }# h                    if (numw[i] != 0)2 h4 t! {0 b- ^) e- e9 r# A
                    {
6 }, M5 v6 o* `- a5 |: ]0 l) R+ x4 n                        i++;
; H# H+ h' ^% f- \                        k++;- M: \8 u7 D7 ?) _) Q
                        if (k == n)
( _5 M/ W& o' E9 F5 p6 q                        {; Y, W# w& r, j' x8 p7 Y+ s
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
/ W* J( W# W# S- b  B. k* j& W                            k = 0;& S& e- }) N, |8 L, [
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
( Q6 E4 ~4 b+ c6 I                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);' a. `( q& ^# C9 U7 {% y
                        }
! n7 N* W; j- L% Q/ l$ x! m                        else//输出暂时还没有改变数组元素的值' T: w* |8 Q  K- y$ b
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
1 i! B9 J# n7 _' l                    }
( h7 @$ _2 ~! {% w5 `                    else: V2 V% i9 R0 \; R  g# }, j
                        i++;//数组元素为0,直接跳过,不计数。。。
3 _; u- m" U7 S$ `% n0 w7 j  B1 w) v                }
, x$ H  X( Z% k) h / D- L( ]  K( M* z) |

' g! X! s3 G2 @6 _( ]* S& V            }//结束while循环  w4 s5 Q0 A: e
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
8 {. ~# g: S; L4 u. Z           " o4 |0 K1 d+ R: ?
                if (numw[i] != 0)
) _) b, B4 J/ B+ Q( x5 j3 M# v                    Console.WriteLine(numw[i]);
) F, p9 q# P. A! l           
2 d$ n1 M+ E7 a2 g. e. D            Console.ReadLine();. U5 @0 V. j9 A% L: t: p
        }
4 N& b/ e+ i* @3 o+ O& R* C    }
8 p5 v4 i& U* I- g- Z9 J: e}3 Q3 X5 h7 z1 V: T1 _, a1 R3 t
小甲鱼最新课程 -> 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-1-15 01:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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