鱼C论坛

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

猴子问题

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

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

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

x
大家好!3 m. h1 t" `9 Y
这几天我在忙着编一个问题,我用了一种方法编出来!6 U* E% n, i+ \' c# m
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
$ Y6 n- |6 q; x$ X: ^7 ^注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 , d( _/ H& }* d  r: d5 E' {& [# K6 G
: t/ i5 ?' k. ]0 U

* r' f( r$ p% W* d
                            题目. V, c% u1 N2 X
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
2 [2 ?9 e& G- k- k2 ^第一种方法:利用循环链表6 r# H: _3 c- l5 l* e' L  L
#include<stdio.h>4 i" y( u- ~* ^
#include<malloc.h>+ i3 J' O- `- ^" w3 {
#define M 8            //共有8只猴子
4 {) c5 ]2 v2 J% ?#define N 3            //数到3只时退出第三只
. {( N4 v6 r. {6 K# F/ jtypedef struct monkey5 e, I1 _" n. Z# v% j7 N7 e
{int number;! ^7 ?9 M, z/ f: ]9 c' T
int flag;3 v5 {/ R  W/ S* Y
struct monkey* next;- {* n7 |: M9 I& Y" H5 h+ Z
}MONKEY;; H% o" c3 X" y) p$ |( H8 h0 y# [* a
main()& C6 e$ s* s4 m% ^
{ MONKEY *head=NULL,*p,*s;
; j: ^) ]( y- m) H  int i,sum=0,count=0;3 g1 Z2 h# [+ [# z. V& v
  clrscr();              //清屏9 `- r9 n* K( P& E
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
( J3 ]/ s6 ]1 N3 a  p->number=1;p->flag=1;
1 ?' H; K1 ?( j( G  p->next=head;
* d6 @5 s+ C' t5 v5 {  head=p;
1 t" V  y. O# ~$ x3 ~  for(i=2;i<=M;i++)& I3 c) I" @  X  o. `5 k
    { s=(MONKEY *)malloc(sizeof(MONKEY));
9 d( }9 H0 N4 r& g" C8 q( o. ?     s->number=i;s->flag=1;; r  N/ D. W8 x% l# P8 Q2 U
     s->next=head;
: c6 a, ?1 ?( W# b4 {: R& C     p->next=s;p=p->next;" [# m0 H6 A! R$ s( t, n
    }
, ^1 e4 X# Y# N7 o% @' f1 g    p=head;' \; {' S3 N6 D  [' ?) {( |6 j4 c7 R
   for(;;)7 b6 s& y% P$ q' V, Z% ?* Z
    {if(p->flag==1)$ d1 i( I2 t  W4 E
       count++;
% L+ J6 K& L6 s+ _& F7 w2 b     if(count==N)) L# Y: Z, u; W7 r) M* h
        {p->flag=0;6 Z& {& \8 {) Z! `- n( J6 Q
         count=0;
8 ~: l; a, A: R! I4 F6 B! s! x* U1 E         sum++;}) u/ k* r% G0 X) ^5 P2 w
     if(sum==M-1)
5 B9 ?, ]* S1 Q) e( j  I        break;
  J1 q& p/ `1 A     p=p->next;
( z! L2 o, |( b* j7 H5 u, F; A    }
) u# M' z9 b: A2 W& d3 n4 E+ X2 a    p=
) i; ]7 S% M& U, F    head;
8 f* p$ F+ c6 _6 }, h6 X- L    for(i=1;i<=M;i++)( x9 J0 F/ l0 k2 _; N1 ~& T
    { if(p->flag==1)
) @% }. q( `5 t4 v- W' ]& @6 C; H        printf("\t%d",p->number);+ `3 z% H& ~& w* W* S. m
      p=p->next;  y! e" |+ o& ^* a+ M3 J+ j4 l0 Q
    }
" e9 {9 t# p( Q- K# A1 d1 L' a2 L& B4 u  k# K$ \
! Y, [+ E. @7 t  D, T
! R# V: \7 k9 U" p: J
}

: t9 }4 }" |. ?: F1 X第二种方法:数组# i1 p+ }; ^$ a
#include<stdio.h>
% }( l4 x, f+ x4 R) N! |6 S$ x#define M 8
0 ~5 I! d( U3 qstruct monkey# T: h1 g) l2 Y1 n, M& {
{int number;
+ h' }# L7 i  Vint nextp;
5 _* e8 P0 N' K) a, L8 _( {/ y  M}link[M+1];
. i& u$ i5 V5 L5 E1 W7 L: M& U: J4 S4 K4 a8 r! X
void main()3 f5 V) d1 h0 z- f% `8 q3 t6 i
{int i,count,h;" E6 m- o5 a, }) `4 f! u
for(i=1;i<=M;i++). [: ]4 I  V+ @. G
{  if(i==M)
5 l1 x5 G( U/ Q   link[i].nextp=1;
, G5 Y. A1 j7 }, J' G   else
! T0 @: s7 }5 B- b+ Y1 L   link[i].nextp=i+1;
" R3 \1 j# W+ `  z% Q8 w  link[i].number=i;$ p& p- J! }: W& ]
}
' [9 j) p/ p/ B+ d: w4 Iprintf("\n");
2 ^' L' ~' H8 U: Gcount=0;2 I2 L$ t4 k% f5 I1 o% V
h=M;
& u6 H  o- J9 lprintf("依次退出的猴子: \n");
3 [4 T. S' J; n% a" Jwhile(count<M-1)
  r# ~+ Z! Y: t1 _* ?{i=0;
% Z# @, ]+ r3 S' Hwhile(i!=3)+ s8 g3 r3 J0 A" ?
{ h=link[h].nextp;( Z, J* T# {' \  K: Q' r
   if(link[h].number)
7 n( O( V1 H) w6 u     i++;}' x# ~' `$ Y% |  q

& N& A$ {! m( b5 R2 W. iprintf("%4d",link[h].number);
5 w; P- j3 ^8 v. \% {  u; o8 J; nlink[h].number=0;
) W* s2 A$ ~8 u/ G5 Dcount++;7 a4 d( i5 j0 `: \0 o4 ^
}
* j# Y) p8 b7 }6 L4 H9 @- \, a! p8 j' F( v/ o$ m; R& |
printf("\n大王是:");9 W2 Y, B$ E) V& |% I
  for(i=1;i<=M;i++)
3 y7 D7 m; _( Q, t& n" i  if(link[i].number)6 s3 R& q* i; s$ Z' ]- d" x
    printf("%3d\n",link[i].number);7 m: z4 d3 K. T8 I0 c
7 |, ]' G( O. k5 _

3 A9 o7 Z' H) D' e/ F. b  `}

# g7 @/ N  k1 I5 @, L0 @第三种是普通方法for循环

! X2 S" {  _! j+ j6 l5 K; Z#include<stdio.h>
+ j& k0 i3 D$ K+ c( @: E( Bvoid main()
$ P* q6 H. `2 _& \  Z1 K{ int i,k,m,n,num[50],q,*p;
5 S9 c1 {( l6 M2 N5 B    clrscr();
; n4 i8 |& v" A   printf("input number of person: n=");) k4 r! C2 ]. f5 X2 a! P2 D5 f
    scanf("%d",&n);
3 B$ T$ f' ^6 k8 x  s, N- pprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只0 b' Q; r; ~0 O! k$ w5 o
    scanf("%d",&q);
0 f  w0 R" g& N6 Y( O1 K   p=num;' f5 |7 M6 Z# X- N* q  k: H
  for(i=0;i<n;i++)
4 T  {# ?1 n8 \; L    *(p+i)=i+1;$ U& [$ k. X8 \9 ?) o% y4 S: _
   i=0;( M, y3 j4 Z3 U$ [1 j9 ~
   k=0;: \8 m- A( A9 W7 i% M
   m=0;
, W; D' G  ^7 Z2 e# a: B' w- a  while(m<n-1)
1 o* y1 y3 r7 F4 l  s   {if(*(p+i)!=0) k++;; B' n" ]- r$ a1 E3 k
     if(k==q)
- D% v) o- j& _& [. ?      { *(p+i)=0;! H3 F% r) f. z
        k=0;6 ^7 q& Z6 R/ @) i- m6 d2 n
        m++;5 Z0 Y1 ~8 Q7 q- M/ I/ O
      }: t! o5 e2 V. ^
    i++;' z- g$ _$ I4 R
    if(i==n)i=0;! ?5 n" Y7 n! J7 m+ V9 N( a& N- R
   }. [3 R4 U, |0 _& ?% |
  while(*p==0)p++;
/ `% V/ J7 O% g; {! i    printf("The last one is NO:%d\n",*p);
% \/ l% S: e4 M4 I+ a     getch();  y0 V; Y* w  p7 g. r+ x( g

, y. ?$ x" H; X+ e( ~8 G}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
5 e* v8 g" M7 [+ o" D. inamespace 又费马达又费电8 X' U4 u3 l! H8 [5 o& D7 u
{' p; ~2 r2 ]2 I( _0 t
    class Program
% q, P; |' _" s5 z    {& u  I* b8 ]& i
        static void Main(string[] args)" ^9 D. \8 a  }
        {- x1 d4 {) Y% X; q) E: E7 P
            int m, n;
! b9 O1 f" D/ ~/ v            Console.WriteLine("请输入数组长度");
$ |/ {$ z. t3 x4 V% ~6 O+ D            m = int.Parse(Console.ReadLine());//m为数组的大小; ^' B9 m3 V0 Z
            Console.WriteLine("请输入要截取数字的大小");' o- V& x' S  j& e
            n = int.Parse(Console.ReadLine());
6 {4 _# w, L/ r) v/ |            int [] numw=new int
5 f& S3 n) K" }' l: N2 {3 L( k7 Q1 w  V
&shy;&shy;&shy;;
( F8 W) e8 G( D% S: o6 |9 A            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数! @+ ^' _! d$ i+ D
            {
) H$ G5 X/ U& g  l- L                numw[j - 1] = j;
& \+ Z8 E7 |' X5 R$ r7 w( X* \# j            }
6 d8 L! U9 [! H3 w            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
  |1 q1 o( @5 [            while (d != m - 1)
. Y4 C2 a$ x) E! @! x. X7 F            {
* q* B3 U" e9 A( K                if (i == m && d != m - 1)
7 G& a" G7 m3 A% |+ d, ^                {
+ g$ e* Z# M$ n- M% C, l                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
7 T* |8 A( e3 ^. @( V9 n                    continue;9 e: Z; q( ]* u
                }% p' ^% K% D4 H$ I
                else5 f$ D" A% `, F
                {
* [" J$ s+ O. t1 g9 F2 T' V. c" x                    if (numw[i] != 0)
7 T) n# X3 ^' j- l/ }                    {
8 `- N# M) d" f                        i++;9 L" S* X  t! g/ r! g* ?0 p2 }
                        k++;
% Z9 [- i& v$ a* c0 @                        if (k == n)3 ^1 s( J* A# q! j. m: [4 I
                        {2 l3 t3 @/ G4 S1 _+ [
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了+ s" ?: h  b( ~7 h3 H2 T
                            k = 0;' c) R9 l2 x, T) F
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小12 Y- T# `9 F2 e6 I: X- B
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
& }9 x, y& r9 s" ?) u                        }  q; }/ y* c9 Q! i
                        else//输出暂时还没有改变数组元素的值: ~, D$ m* q' t; K
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);8 P# E( q# |  k3 j5 [
                    }* |1 X7 `; Y. u
                    else
' Z% ~! K3 g7 i- ?& o                        i++;//数组元素为0,直接跳过,不计数。。。
+ X" u) L9 E  l                }
$ Q2 f/ F3 G, p( {
% ~& ]$ O* \/ M0 q* |+ ]2 r4 V& O" D$ a9 }+ n9 h& S/ ~
            }//结束while循环
8 [  ~: O1 W: R/ @. c- W7 \            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
# j$ O$ Y  x& V& n$ J8 S: V" G           
  ]; K" q# _* W1 b, |/ v                if (numw[i] != 0)
4 u3 x6 C) w* V9 o" p! l, E                    Console.WriteLine(numw[i]);
. K5 c- k) @7 C4 i+ a( _           
! n& H" \- Y, L. d- d            Console.ReadLine();# G( {& E' j: z2 R! M3 V
        }4 o/ @6 F3 z2 Y% [, j
    }
" B, {2 b1 F, u) S7 U1 a! b& E}
' o# W7 N2 Y7 X& z% H7 Y  S
小甲鱼最新课程 -> 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-7-9 18:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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