鱼C论坛

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

猴子问题

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

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

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

x
大家好!6 r: @* i* {6 v9 E% l8 g
这几天我在忙着编一个问题,我用了一种方法编出来!
8 V0 i7 s4 r; V# y2 d& Q但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!2 y3 `* K. @) ~$ N
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
+ @- D5 K/ E- b+ `. }  Z, `. G. d) |9 B, v# @" E( r
2 F" Z" v5 D1 h- v3 E3 t
                            题目
3 q0 u+ Q% y; E( M( n0 i山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。) H2 [% v0 i, M
第一种方法:利用循环链表. D% F2 d  b' t* Z7 h
#include<stdio.h>! a; O7 j  Z1 f& w2 n, C
#include<malloc.h>8 z+ I, E% p8 V$ H
#define M 8            //共有8只猴子5 E( Q: _! F5 ]3 p; v
#define N 3            //数到3只时退出第三只
3 [- F* Z+ x* S4 j) e6 mtypedef struct monkey
3 l) W$ _* @1 L$ h1 b{int number;# H/ _: m/ M% Y5 o% Q. T$ F
int flag;
) Q8 Z" v5 u/ |3 Z; T1 v$ B+ pstruct monkey* next;7 N( S* Z/ ^5 t7 @7 s' ^$ U9 s
}MONKEY;
$ I+ K5 Z5 o7 H% S' d) S) smain()
" f+ U) F6 m- G  {9 j0 @7 {$ ?! e$ A{ MONKEY *head=NULL,*p,*s;9 }* }0 G+ `2 |8 L0 }) B
  int i,sum=0,count=0;- U1 U( z* I# F/ `5 e& r
  clrscr();              //清屏
0 t- L, ^" K8 A4 Y4 B  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
! p4 Z% X6 Z( F1 N  p->number=1;p->flag=1;# n, w, B9 y4 C/ S' v, @
  p->next=head;
7 w" r" o! L7 \5 D# ?* i% [  head=p;
; X. `, M6 V$ g" ?, t5 |  for(i=2;i<=M;i++)
# V+ b: n  O3 d4 H& _    { s=(MONKEY *)malloc(sizeof(MONKEY));
7 S5 S5 \9 q2 S     s->number=i;s->flag=1;: w% r) s3 P( d( E. X
     s->next=head;6 K3 s5 J1 l# Q9 n+ v
     p->next=s;p=p->next;
4 w4 R3 I$ Q. s# s9 I( m( S    }: v6 G% \% l' |7 Q
    p=head;# h1 a# ?& H3 s& v1 H/ g) M( z
   for(;;)! u% u3 k4 k; u0 q0 w: C
    {if(p->flag==1)4 d9 S  U% p6 g6 S0 K+ A  Y% _
       count++;
* a+ W/ L9 _# D; D4 b     if(count==N)
. T9 L, q# P  C+ u        {p->flag=0;
6 x7 k' m$ ~. @" a) h9 U6 O0 z         count=0;! v* `: V! n) s& D
         sum++;}
' w4 W% [1 v' K     if(sum==M-1)
1 T4 N7 L+ r- p5 T9 c        break;
. b6 u, I, w4 e5 ]- i     p=p->next;
7 F( l) \, E1 g& ]( q    }# ^1 a# R1 O8 F; Z* \
    p=
! W6 n" o( ~, |    head;0 d, M, b0 a# u) v2 H( Q1 Z9 z' n
    for(i=1;i<=M;i++)
( x' P' ~8 j+ S, o& T    { if(p->flag==1): @% D7 b. m7 G$ G* n
        printf("\t%d",p->number);. g. ^; R% j7 e9 m
      p=p->next;
8 H1 r& {5 T9 E9 q: w6 H/ B  R    }- B8 H4 I1 b) z
( |- s+ L: Y8 l" u

9 b  K; R. H+ j, R; }2 P: O7 A: V8 w. w% A0 Q3 j; J& z
}

; Y2 ^9 b% i5 P$ E第二种方法:数组
1 R$ C7 v/ c3 D8 M7 D: o% O#include<stdio.h>
; P; _! Z7 Z" P4 z( ]6 H9 F#define M 8: l3 B/ q" W5 F( Q" x' _0 J$ i
struct monkey
9 w/ }  s/ v3 S1 K! [{int number;/ E- ?4 _$ a8 J5 q$ {- B9 u/ y
int nextp;
8 U4 G0 B- \& j; s$ V4 D7 }9 C}link[M+1];
: c* N3 w/ U' V0 L3 @0 b( _+ A2 W* m, M. E% s7 L
void main()
( @( q( L+ i. |/ d{int i,count,h;$ C2 ]. _9 d9 F- v
for(i=1;i<=M;i++)
) `3 x- t8 v" _1 T4 g4 n! D{  if(i==M)
6 ?& Z6 o5 A2 z; n! _   link[i].nextp=1;4 B1 I/ u1 r' p+ l, V4 d
   else6 _( ^# N1 V0 H/ M- Z. a* F' @
   link[i].nextp=i+1;
% `1 R9 N4 t6 l  link[i].number=i;
" \5 v3 l- Q4 n! X" ?}) D7 e( v& g2 [; [; ~8 w
printf("\n");
$ Q# a: x+ ]+ S8 jcount=0;
" A$ I6 X5 s- K7 A, E" b) rh=M;+ f3 S, d3 U0 T6 Z; k1 f: m2 D4 R
printf("依次退出的猴子: \n");5 e5 O; Q3 X$ `( u: }  T
while(count<M-1)
9 ^2 v6 F9 v" S: ^1 |{i=0;
" B( X$ T$ Q' x% i! `/ Qwhile(i!=3)+ I2 i5 m0 b( F$ j! x+ v
{ h=link[h].nextp;
5 c+ M/ ~7 `& x; [   if(link[h].number)& z- f0 S1 C- A, m: Z- B
     i++;}8 B  {# X. i* d" \4 d& ]: v

" k  z1 H; j, bprintf("%4d",link[h].number);1 x2 [/ j% o- Z  }9 G# K( C
link[h].number=0;, f( {- k. f7 K
count++;
& F8 @( Y5 y1 y0 g% a& G7 T: O}
  b) Z% F( t4 r# A
% o$ w8 \" J1 P, ]printf("\n大王是:");
+ l1 ^* {$ K; ]: Y* D  for(i=1;i<=M;i++)/ E9 S9 ~+ G( r2 u* v, @
  if(link[i].number); C7 _; a) t$ d: `9 J% K$ `$ I
    printf("%3d\n",link[i].number);9 ?& P: J) {7 c
0 f& _( o* j6 l+ P$ D$ k
) i$ k" B* o: ~
}
, I1 y& y4 M' O( F( @' R* D/ |
第三种是普通方法for循环

+ c6 B  s+ H1 |" b( m#include<stdio.h>
9 z& i, E; ]5 _" v9 i7 zvoid main()
3 W; }8 ~6 g) G/ ^3 z+ B6 T% E8 S{ int i,k,m,n,num[50],q,*p;5 ]& j4 N/ T: L& U0 D
    clrscr();
  B9 c5 x, b4 K: g( K! d   printf("input number of person: n=");1 V9 g" ?) X( t4 S7 v4 n/ y/ U
    scanf("%d",&n);
; G$ n* k6 Y2 p5 P/ sprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只6 w! N% }) m$ {+ z; F* U" Q( \6 Z
    scanf("%d",&q);& o; h' s) A6 Q% P5 R
   p=num;
* I5 [( O2 }6 U: O: h% m6 `* B; [  for(i=0;i<n;i++)" k7 A8 y9 X- Q3 K; J# z# F2 ~
    *(p+i)=i+1;
; E7 R- \: @# f6 K   i=0;9 e8 {8 u; d0 ^" m2 \
   k=0;% s8 X; R, f6 m3 y
   m=0;: U- k+ R/ i7 J3 t- e9 P) b: k' e
  while(m<n-1). a& Z+ q; B$ S. j( ]
   {if(*(p+i)!=0) k++;
: q$ Q( c1 r7 V2 v     if(k==q)$ m5 u: [0 K5 V% F0 y+ Z
      { *(p+i)=0;& k- u. `) \! ?$ ]/ ^
        k=0;0 |7 J+ y! R6 J1 m% m
        m++;! h/ j, K6 y8 H+ P, W: l
      }
# b1 a* T- T- J1 u/ F" O# h    i++;$ ]4 [6 M4 [! p5 K# I
    if(i==n)i=0;! J$ ?  N9 i! D# f
   }
) s* K+ |, z; }* Z: i* y$ C  while(*p==0)p++;5 N' N5 P4 @2 X: W1 R
    printf("The last one is NO:%d\n",*p);
( o, A7 y$ P9 P, d: e3 S7 u     getch();
& W- M: v- ]* s/ i3 G
5 _9 U" v- T& T}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
8 v3 }( a6 l1 t5 d/ vnamespace 又费马达又费电# }2 j+ ?% K6 s7 Y
{
- K+ h& Z8 X7 c: l2 m) ~2 _6 k    class Program( N5 ]" y! \! B3 e: @* d( c. B- I
    {
8 u3 C- ~7 |" k4 e, P        static void Main(string[] args)
4 R* a+ l$ g" B* y) Q" o        {7 i  Q, o  J( j# ^) Q
            int m, n;
" I' s* p: K3 h6 Z7 i            Console.WriteLine("请输入数组长度");
  ?5 n, H5 {2 B3 v4 ?8 T9 s- C            m = int.Parse(Console.ReadLine());//m为数组的大小
% F, `3 I' }+ F  `            Console.WriteLine("请输入要截取数字的大小");
6 Z) @$ c9 R. J0 R9 M' w0 H8 m( s- n            n = int.Parse(Console.ReadLine());( L% S, R, V6 _4 y5 ?8 Y7 h
            int [] numw=new int" R7 u$ V/ v- {- W

8 S7 W9 C, w. X. I' A&shy;&shy;&shy;;" _" K7 ^9 t2 H
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数; P. z/ ^4 D: N7 ?; U) G
            {
: v  G6 I1 ?/ e, V! v+ @                numw[j - 1] = j;
3 U& N/ ?8 B! N: S* f: z& ~            }# X" m+ u/ }! K
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
( w! b4 p% f# `% K1 g            while (d != m - 1)+ s/ f- h' A4 |! l) {# C( K
            {) ~, f0 Q3 I) ^7 X
                if (i == m && d != m - 1)* v% b1 N/ U8 [# Z: h
                {' `3 F  j% I1 G/ q
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!, Y0 u& o, l) E9 I* _! U
                    continue;
- z2 W3 |' A1 g: g                }  j: R  w8 N: U' \* n  _
                else: T: c; o* k; E% H4 c0 F" v
                {
7 w- I% o) [! r9 \. z                    if (numw[i] != 0)
6 c1 j2 I% R! u; x2 z( w                    {
1 V/ J. L8 Q3 Q: b8 e* U                        i++;& L; t& e' t8 V: B  z$ }1 B  x( x
                        k++;% \. t% f; \- `7 c) v
                        if (k == n)1 g: Z) Z" g/ o6 R& U
                        {+ H, ?# A/ Q& D8 P+ N
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了9 d" S) W3 z, ^5 e- `5 e
                            k = 0;
( e! r2 X8 T$ ~6 R' n$ Y$ g              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
/ d- E; b0 z# G5 t                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
. J/ b% X$ r$ Y) N4 F+ f* T                        }
# J% _9 k" [! s2 @$ l                        else//输出暂时还没有改变数组元素的值
% g, J% L2 y. @* b                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);% l% e, K! L! z# D) V* G4 [. f; A
                    }, a1 J7 T* g& [
                    else
; y& m% n& W" U! N                        i++;//数组元素为0,直接跳过,不计数。。。' ^2 _( g* h: v" I% ?4 {
                }$ Q: o1 y; b# }* l
) g, ~6 Y- @& g2 |7 I( Q

( m, Z4 M3 s' P+ {3 J" t; t; f+ ]            }//结束while循环
8 E, ]( c2 `6 a. S            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦$ c, g6 S; z  c1 m* v' U' P
           $ t7 i. Y( S8 s/ ^9 M% U7 e
                if (numw[i] != 0)1 [& x7 m" D# B3 D! o* i$ k5 N
                    Console.WriteLine(numw[i]);) }) \0 o0 M& g4 D' k
           
' b( r) d. z, l' M+ a4 K" z            Console.ReadLine();- ?# W: _# v1 c
        }! u' [; Z' F4 H2 _
    }  k+ |) ]# B! ]% ?6 N; |1 a
}
7 x8 B. C: p" _  W
小甲鱼最新课程 -> 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-2-25 19:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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