鱼C论坛

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

猴子问题

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

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

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

x
大家好!
6 p5 K! h+ f0 B4 r- N8 _- S5 c8 `这几天我在忙着编一个问题,我用了一种方法编出来!, m6 l6 z/ [7 l4 {7 H6 y
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!0 t. h7 j! R9 }; Y2 Z7 Q6 f6 K) a& ]
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 " k+ t; J. A$ i0 M, k# v: A0 Q
) m& D. s2 h/ m+ W
; H+ S3 H7 t+ R% v" h& P
                            题目/ x+ q& Q2 b  Z: l
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。* F. y  z3 z, N5 G* N3 }* o0 |
第一种方法:利用循环链表
/ @: @7 r4 r" x. d: _8 C8 Y4 I#include<stdio.h>
7 z  h* w& V' o" m2 m* f, R& G#include<malloc.h>
, Z  U. f& L4 J/ p% W  Q#define M 8            //共有8只猴子4 p3 Y* H  F9 a4 d+ c
#define N 3            //数到3只时退出第三只
6 h0 \& O0 v# n" wtypedef struct monkey
+ g. \& J. B: V6 Q# `$ [{int number;
2 c9 y7 I; w, `int flag;+ d6 n. j+ g1 l2 W$ Y! p
struct monkey* next;* O' S, b" K9 ^2 m! U, N% q2 X
}MONKEY;
; _% z8 i4 d+ H" X9 }) Tmain()
( F' A3 R9 N) l+ O( M& n{ MONKEY *head=NULL,*p,*s;) l: m% a2 F1 x- E7 l7 R- V
  int i,sum=0,count=0;
3 V# i$ w0 s, r6 l2 c  clrscr();              //清屏% M: o" q7 l% R2 i' Q- e3 Y4 \
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
* Q- O* f/ F3 [9 O4 O. z  p->number=1;p->flag=1;' f: I% p& D+ l- }1 a* p* r, F0 k* |1 \
  p->next=head;0 d, _1 {) F+ \8 Z- G2 {1 \1 M
  head=p;
/ u" p6 o8 w2 }0 |  for(i=2;i<=M;i++)5 J& m. L  c( b. f9 D
    { s=(MONKEY *)malloc(sizeof(MONKEY));, i9 ?* V; B  D6 y& ^" ~6 ?+ \3 \
     s->number=i;s->flag=1;8 E. ^# u0 a3 M; I$ W4 {% }
     s->next=head;
5 N' F" e; P* g     p->next=s;p=p->next;3 F7 j  V8 D' k" o2 X, ~
    }
: S0 e) Q* U, ^% s# K0 v; i1 @    p=head;. P6 H& C2 z; _* t4 H$ f5 M
   for(;;)$ J* c( g& X/ Z9 u
    {if(p->flag==1)
# t! a; {# q! m1 E  {1 ?       count++;
, D( W- D) ]% ^2 ?# y' G     if(count==N)7 C* C6 \& g) a' `9 A0 |
        {p->flag=0;) M0 I5 h& U( L( _! d
         count=0;7 y& e. [% {" [; H  l, H* w) d
         sum++;}
0 u4 k# i* b4 f  e     if(sum==M-1)$ D2 C9 w, x9 E; X0 P
        break;% P4 k& o6 C: g6 K6 I6 |
     p=p->next;' T0 Z% U+ q' ?; E$ t
    }
; W8 X, s: k# q    p=& I" e. e3 F7 V2 ]& F! t4 U
    head;/ u) Q! m; u( u* G/ x
    for(i=1;i<=M;i++)' _% L: h2 S2 L. p$ D% ?
    { if(p->flag==1)% _/ n- Y  X3 c; W' z* J  X
        printf("\t%d",p->number);
( }2 f* B% {% w( {4 ^5 z2 i, H      p=p->next;  Z0 u. ^7 s/ {, a" ]0 E
    }' K# i2 q, b# d5 L

. a- o+ q, n* x5 E
) [9 y; z* G& S9 @4 m- l. X; [) x; E0 L0 I" ~& i
}

" q+ N) D! `( D$ k) K/ b第二种方法:数组
& B! t- D, y, C6 Y2 |#include<stdio.h>/ X& O" g+ n0 d) T# j0 r
#define M 8
  K; d. R; F0 r5 [1 bstruct monkey* K3 p" F/ [/ ~
{int number;: E$ ?% i$ j- Z5 ~# u" A, {& d
int nextp;
- R) }& i& w3 v4 D" t# [9 T; M}link[M+1];0 ?2 ]4 i6 u" @' d7 `

( H# D; o5 J7 Ovoid main(); P/ i) \  R9 H. g% I2 R
{int i,count,h;  o2 Y( e8 v. V  w
for(i=1;i<=M;i++)
! N& v% m3 F9 w' I% K. J{  if(i==M)7 i; X. X4 Y0 e" d
   link[i].nextp=1;
2 w  F6 v9 o) ]  d" G6 G   else: o$ G& n) [. F" B/ Q' C
   link[i].nextp=i+1;' q& C8 |5 ?8 e4 Y
  link[i].number=i;: y& D# F6 y& u( K* f: x
}- c- n- s  G& C9 `  l% E; w, w
printf("\n");& K7 `5 B& s; p# G
count=0;3 ]) c+ Y+ L& s% G! }, `4 n
h=M;
- u9 @% e0 P9 f: zprintf("依次退出的猴子: \n");5 ]6 G1 a2 x( t$ J1 J$ J
while(count<M-1)) ]7 }' x: V7 U2 ~: V, z! @
{i=0;4 R$ `2 W3 J1 `( h  d' W
while(i!=3)
4 o. K* `5 P' ?$ c/ q{ h=link[h].nextp;
9 O" S0 [8 @! O   if(link[h].number)
- v+ [; G4 [0 W1 ^; d% E, B( i     i++;}
" I/ |1 c& \6 c( I8 R: ~( V+ s
printf("%4d",link[h].number);
& v% u1 o( T% t1 S, a8 Dlink[h].number=0;
  M2 r4 [  M/ q5 H5 ncount++;
- J* U, s% f' [: q' V+ n}
( k, v& u6 Z+ q' X
3 h5 r8 N( f1 E+ uprintf("\n大王是:");
- e/ d! C: K, a& D; p  for(i=1;i<=M;i++)
" p' u: P( d! h% ~/ t% N  if(link[i].number)" D8 K9 s, r+ }" B- ~9 ?$ L
    printf("%3d\n",link[i].number);) M+ i3 {  Z( H0 C( |# t
; O# ~, F6 ~; U9 w
5 [( q3 X5 K. G& \
}

5 w& m# Z; \4 @3 X第三种是普通方法for循环
& V$ S* U: c& Y
#include<stdio.h>
! }3 a& _" r/ ~% m7 Nvoid main(): |3 W8 w# j  G" m0 H
{ int i,k,m,n,num[50],q,*p;" M' H( k4 p1 j( c8 r% F
    clrscr();+ l, Y3 z$ U, n; T/ p6 c7 `' e
   printf("input number of person: n=");
$ {$ H! A7 t' Z8 \/ f! s; C, k    scanf("%d",&n);+ J0 D+ w+ t4 `- {. K7 D0 c; B5 T
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
+ y- S. t1 b1 K8 p7 L/ G; M    scanf("%d",&q);% o7 N2 C( \6 Q2 Z: @( }
   p=num;
& l1 o# R4 h" `5 p- d' [  for(i=0;i<n;i++)
! J) h2 N: f! r$ B2 [& S    *(p+i)=i+1;
% ^2 z1 V. l/ b# B" ?. c   i=0;5 T6 ^' ?6 N' S8 p; g, K
   k=0;& X; P  }2 C. U( {& b5 ^) H0 h
   m=0;
( i; P' D; @! Y8 W. l% n( D$ b: n  while(m<n-1)
0 V1 T% W2 i2 o9 x0 E   {if(*(p+i)!=0) k++;
$ g: A# }& @+ F: w: W( @" T! c     if(k==q)
" O5 j- [. E- l& \      { *(p+i)=0;
% `8 D  ?7 q, |9 T! n3 ?8 s        k=0;
- z& s" X( a/ }        m++;
- x1 ~3 E7 L$ x5 c; K' [4 V3 k      }9 Z( e1 X" Z, J  N# b
    i++;
& L0 W8 f! K& l) Q    if(i==n)i=0;
$ B# w+ D  s* u# M7 E   }
; }1 I- n  z# k. I  while(*p==0)p++;
) V  E' w# A. ^/ d    printf("The last one is NO:%d\n",*p);
' q% I  Y1 F" l$ ]     getch();9 J& b! k9 D. ^0 d5 q; k
. M, M' [9 _) t5 ?' e! q
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;9 F+ A5 [; Z7 f/ g; y2 S& P* [
namespace 又费马达又费电
2 x; D6 Y8 R+ d- G{6 D0 |6 B0 G8 `- W, b! s2 I
    class Program' f, V7 w+ y) O9 Y  q/ i8 B
    {5 e/ @/ ]) Z/ Q4 p7 H8 D  K
        static void Main(string[] args)
9 D: \0 R' Y: @: z5 n' N- g3 M        {
0 U1 |* M7 y: P7 D3 N. Z( D            int m, n;& V! t  Q( h7 ?) Q" z& Y% R
            Console.WriteLine("请输入数组长度");6 N) [7 e) @5 ]9 |# O( l
            m = int.Parse(Console.ReadLine());//m为数组的大小
* X1 {, P- C4 G/ E! y  L            Console.WriteLine("请输入要截取数字的大小");! U+ o) q, @. f% \* K
            n = int.Parse(Console.ReadLine());0 {2 p+ a1 F1 L; `* R
            int [] numw=new int' a& q# s6 F& `7 c: }2 i- Y, k) S
% ]# d2 u. C' {5 i, @6 `& @% s
&shy;&shy;&shy;;
9 k2 J. T0 {: ~% O5 F, g- b            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数' M" `) X# m, X1 h: A& K2 y
            {" D4 p: {5 X6 P$ F
                numw[j - 1] = j;: z6 @6 y: ^; _8 m2 U1 Z
            }
* e9 @5 ]9 E5 f: m# l$ v' q; L- b            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!: f7 u! k. I5 H! s9 F) O
            while (d != m - 1)0 n; u* B' w% p7 i& n
            {
2 H* R6 T. k, r" P. h% b                if (i == m && d != m - 1); B4 r# K* @' @! o% \
                {
( {: u' T. e9 r; o  R3 w" h                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
/ O4 p( V) P& d% H: s/ J9 J                    continue;
) J0 ?% F! q6 v                }( k/ F1 |1 r! J' F; `
                else$ v; d! @- `8 J/ S7 d
                {
! Q; Q& C) ~! c/ V9 J                    if (numw[i] != 0)3 i3 m' O) v. C$ J1 b2 m
                    {$ T/ {7 B$ t/ L0 P. J
                        i++;, g9 `1 T$ V" g! \1 M
                        k++;$ H1 U( L) r0 D" k
                        if (k == n)  \9 E7 m. ~& Y  O
                        {) ?$ C/ C+ K  {8 b7 o
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了1 A* T3 P  [4 L: W# [/ V5 S
                            k = 0;6 r4 Y6 g1 e, x+ }* m$ f6 e* W
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小12 r, f6 z, j4 ]7 p& O9 q1 V+ T- b
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);. x1 y! M) }' e+ @4 P. T
                        }2 v% {0 g/ m5 f3 r. f
                        else//输出暂时还没有改变数组元素的值" y( y- G6 u& F; d
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);" L) d1 C9 B9 A- n) J* H9 J% ^
                    }. L3 z$ a9 S3 j' g: D4 ~6 R- L
                    else
- Z& `/ U6 C$ ]                        i++;//数组元素为0,直接跳过,不计数。。。
' F" h( e+ O* q6 g* e1 U                }5 J3 z6 d/ y3 u3 b
; b6 W9 h! G/ ]
# T. c: ?  d: j1 `1 @* q! f. J% z
            }//结束while循环
, S( ~9 e- x. @5 C            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
# V& v! a  L+ F4 z           8 Z+ ~' d3 F5 M
                if (numw[i] != 0)
( K2 E1 o: \1 B2 `/ _: M& _                    Console.WriteLine(numw[i]);) q3 v5 [" O1 m% t1 P3 U
           
2 @8 t4 w$ `" D( E6 M4 m" u            Console.ReadLine();% b: e# H; J" I  u4 r
        }, w: T7 ~9 r# @+ q8 G# l+ p
    }' D. v8 }$ w+ k+ }# I
}
# z' C4 k. |' i, M9 Q1 d
小甲鱼最新课程 -> 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-4-20 05:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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