鱼C论坛

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

猴子问题

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

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

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

x
大家好!0 t: C$ y6 v! Z
这几天我在忙着编一个问题,我用了一种方法编出来!
: A9 z% \" v5 @0 T但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!' K( a9 i' z3 ~+ `% c( T5 x0 O
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ' Q; @8 J6 S# _
# n9 z& m& q) c' v+ ?
: W/ k, [- H; w7 h0 B
                            题目. B; U: e- |2 j2 N& ?! b+ B
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。# P0 T- s% e, _! c6 B
第一种方法:利用循环链表
3 h) D  X* h+ G9 ?#include<stdio.h>
" B( L( s8 h& p! r+ I#include<malloc.h>4 W+ e$ \6 k7 F6 c) l% ]
#define M 8            //共有8只猴子
+ `' l! F0 `! S0 u8 x# m5 R. [#define N 3            //数到3只时退出第三只
2 x4 G* t# ]7 z6 t1 Qtypedef struct monkey6 J: B6 i: o1 E/ X
{int number;
; S5 E' f& f7 d4 w, B: g( q$ s" I5 [int flag;
: X/ j3 U7 Y2 Y# V6 T: ^, @/ vstruct monkey* next;7 U2 L: D+ M( I6 V
}MONKEY;
1 ]8 X7 ^& K, b. ?( d' Ymain()
. ]! i" o8 a7 K9 c# |{ MONKEY *head=NULL,*p,*s;: r& k3 C: Q+ c  N/ `
  int i,sum=0,count=0;; v  _' |: c9 W& z& x
  clrscr();              //清屏
( D0 x; e8 f7 ?$ Y% c$ v7 {, ]. u) m  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
6 b8 w* h! Q, r  p->number=1;p->flag=1;, g2 H' Z$ E* ]/ C
  p->next=head;
; G" U6 u# l0 z( [  head=p;
' j# q+ ]& d7 X. m0 _  for(i=2;i<=M;i++)
# ]# M5 s$ L4 h+ L    { s=(MONKEY *)malloc(sizeof(MONKEY));
2 ~& E8 q! ^) F4 K& X     s->number=i;s->flag=1;" K5 F4 d1 N4 @+ w. k8 {0 H' {
     s->next=head;
% {1 c; X1 y5 g+ Q# X     p->next=s;p=p->next;
) \) N/ f$ a( Q: k$ {4 W9 f9 k    }( \9 H0 U8 H# s( j
    p=head;) `. E3 I9 P  Q
   for(;;), @5 `! l$ e& s) {* A/ D& Y) `  p
    {if(p->flag==1)
% `& F) B3 j% i7 {$ ~4 y, |       count++;
# m: K0 v2 i5 H9 B4 Y( l7 D1 p8 B     if(count==N)' P9 H$ _0 J2 J+ l- |4 O7 K
        {p->flag=0;1 f5 x& ^6 W( v% s4 U, B3 N1 D  U
         count=0;6 ]# b  u% Y6 P+ R; F% f6 A$ P
         sum++;}* a! t$ M% n- N7 }. O
     if(sum==M-1)
% y, [% I* ~1 t$ A* N( P! ^        break;
! o6 ^5 p) D5 S. h1 i, z$ M     p=p->next;
7 @0 ^$ S( P9 V! O    }% f( R: y/ s% O  w) o6 Y# ]
    p=
2 l* d, T* T& d# a    head;
) |; e6 ]" n8 H# g5 y5 C    for(i=1;i<=M;i++)2 b; i) b3 V7 Y2 ^' O5 `0 t2 {
    { if(p->flag==1)4 D# _6 D$ ~5 @" l8 Y7 e
        printf("\t%d",p->number);! F+ n, z: |) q. c- A
      p=p->next;
% T8 P; ~9 S9 X& ]8 G+ k# ^' M" Q    }
7 i* S5 h) y4 X& x# c& C% k) F9 U* r$ p& G+ K0 E, L! [. r

, x% C* w& g# W$ v. l7 a" W8 l8 ?+ z
}
+ `4 k7 |' U% b7 o" U
第二种方法:数组) M, J# W- T( e: o9 O4 f
#include<stdio.h>
( Y  z0 S" p; d4 L#define M 8
+ G6 U7 f/ ?' H" N' nstruct monkey
4 q( b- J' M- j, ?; y{int number;
: x2 a9 p% }- r. v8 b5 |. M1 Rint nextp;
1 n7 C! P3 L  {, m}link[M+1];% j& h: K" w  i0 U8 G

% |3 Y+ f+ W7 t0 a, zvoid main()
! X- t: v1 G0 ^# O5 t8 D* r" T{int i,count,h;
0 V: B% e- r6 I$ Ofor(i=1;i<=M;i++)
5 y( N! N# O  U( x7 Z- W2 V( ?# Z{  if(i==M)4 C4 O. g2 Y, O9 W* p
   link[i].nextp=1;
- J8 }- V) o! H" X   else; Q" s, i$ W- {. S
   link[i].nextp=i+1;1 N- U9 G7 l1 b
  link[i].number=i;
. y: v, O  W- M0 B2 a  V}
; z# `$ P) T0 k8 t9 {3 vprintf("\n");% w4 v1 r1 s$ U& r3 J* h0 U
count=0;! @# W2 I4 F( }+ `
h=M;7 n& k; r5 {/ \+ q
printf("依次退出的猴子: \n");  s$ L" t$ g; p6 l2 \0 _2 U0 j
while(count<M-1)
" W% ]% N, L- }3 j& d! V" o{i=0;- x0 W/ z. R3 B4 {/ h8 D
while(i!=3)0 S- _* c& G3 Q. n" `
{ h=link[h].nextp;4 n+ Q- Z+ J6 B# n5 T. z$ L3 `
   if(link[h].number)
0 L, H2 M6 K3 f: e     i++;}
! y6 M9 {% r& W: d* O" L. m& i# k# |; `4 v* X) E- U# }& d
printf("%4d",link[h].number);
: |+ w3 F1 V, rlink[h].number=0;% r+ q! ?" P- _6 F7 _
count++;
5 V8 s, d9 ~' `}
# H: l' p& q2 J. R  C" ~& J. D6 U: s
printf("\n大王是:");
( e/ {" Y3 ?# V' E" H# D; G  for(i=1;i<=M;i++): H0 @, e1 r& Q* Q6 g0 B
  if(link[i].number)# i- ?3 O. {- z6 i4 {; j5 J
    printf("%3d\n",link[i].number);7 z$ T# W- [' Y" H

6 X9 R6 b; b& a; s  p" x) u5 Z  n) ]9 x( ^
}
+ U7 e5 }7 H! F  i
第三种是普通方法for循环
) [0 S1 c* Z9 ^  W( c# W) j
#include<stdio.h>
; ~; D+ U0 w, A  a8 V# {# Ovoid main()
, ]- c8 [1 M! T( h{ int i,k,m,n,num[50],q,*p;
" A; e& r; Z6 }( I! S" e1 q    clrscr();
- }  ^2 ?. s# D* p& n   printf("input number of person: n=");
5 V6 H5 h+ D: |4 K7 V    scanf("%d",&n);
( c$ y6 @( ?: p6 Z3 T+ W* l4 eprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只1 \' h( w, E" H; F3 U/ h1 _
    scanf("%d",&q);
# z- _8 y" Q% h6 S5 [   p=num;5 s* j4 V. ?' S
  for(i=0;i<n;i++)5 ]9 h5 \# ~! I
    *(p+i)=i+1;1 \, L$ j0 y* Y! F* Y
   i=0;
* |2 R. w3 j( b   k=0;
' [+ p- s7 B+ J0 f# F3 Q: \   m=0;
- s( W7 W5 H) l4 C9 h& U: L2 `  while(m<n-1)
; U9 P" @. E+ L/ D; g   {if(*(p+i)!=0) k++;: M* i" ?" v; T1 F
     if(k==q)
' m% n: l9 `( q- c* t4 w      { *(p+i)=0;
7 Z( k( N8 _0 Z) l        k=0;
. g% N: @* _( f$ A" n8 j        m++;; q8 f+ F+ b' t& I7 L* D
      }9 e  w# b( h9 [6 X- |
    i++;( L$ u9 O, q# L) j$ H5 @- C
    if(i==n)i=0;. ]$ t2 V* r2 i$ g
   }
$ \) t8 N* \' M+ i2 i  while(*p==0)p++;2 d9 h3 r) L! }3 G
    printf("The last one is NO:%d\n",*p);0 @% Q+ J  q1 U9 I, J2 H0 X) f; y
     getch();
* F; y$ q4 N* U) B; k2 g: s. X
* |, }+ A$ \+ l. g4 z- R2 v; y}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
- ~9 X. n( {. D& f4 N$ wnamespace 又费马达又费电4 l1 Q3 S" [# i# Y) ?  B
{
$ z% G$ q# O8 i+ H8 H8 I    class Program& V. N- ]- T0 `0 q" B( ?5 g9 t/ ~* t
    {
( P' ], a7 e% s: l        static void Main(string[] args)
6 H# G0 }3 w# b        {
" B5 h$ U( b% x            int m, n;
; h0 _( I, ?4 [* N0 U$ T/ o            Console.WriteLine("请输入数组长度");  G- Y5 M* P( m' m, m: O
            m = int.Parse(Console.ReadLine());//m为数组的大小2 W/ z8 z, I8 y
            Console.WriteLine("请输入要截取数字的大小");
. s1 `; P  }1 m. r/ k! _9 X. l            n = int.Parse(Console.ReadLine());1 ]2 ]( Q; E( _" J- n
            int [] numw=new int
0 l* a, |% h1 H- _7 g, G
: V0 I# v7 Q, }1 F" M&shy;&shy;&shy;;
8 x, a+ ]% e8 J, n4 J6 m) b            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
+ y$ i+ h# P; G! S            {" |$ {! V4 w7 b3 U. Z
                numw[j - 1] = j;+ A. U' x  m0 B. t' C
            }, J0 a5 f) ]% ], s/ c
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!3 q" w. c* S. p2 S8 a! o1 n
            while (d != m - 1)
/ Z# J& Q. c% z$ t            {8 S, P( Z" b% @, G& i
                if (i == m && d != m - 1)
: H. z9 T1 `' N: o                {
' W; [4 o; R7 }2 n& x                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
$ v% j: F: J) n) }3 N                    continue;
* @! P, c* S9 f5 O0 d                }8 Q% b: R' r" q. M8 n+ R9 |% y0 F- @
                else; a2 ]% J" q* Q& Z  p
                {
* c! Z% M* b# N2 F                    if (numw[i] != 0)
; a4 [5 _8 E5 H9 q- A' y                    {
/ T0 E8 h: t0 E* q                        i++;
  s0 h# ~+ c8 M2 @8 S                        k++;+ S6 w; ~# Q. s
                        if (k == n)
; ^/ r8 E$ j" q' F, _6 g& n                        {  V% I# |$ F7 B. Y# a$ V( Q
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
( [2 G4 o* K  J6 M6 X  d) Q9 N                            k = 0;$ P% k) M. ^5 R+ l) j- J
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
7 p1 {4 V" S6 O: B( `3 s                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);- K" f/ g" U- k" `; g
                        }
/ e! z" g- [) _- [8 N                        else//输出暂时还没有改变数组元素的值
; ~" P, [% g7 c' ?6 [                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);; e8 K( B% v$ G" Z& o! p2 ?; B/ r: H
                    }
/ F8 }# w9 X' _                    else/ H$ B0 T5 _# }
                        i++;//数组元素为0,直接跳过,不计数。。。) x5 U5 y- p0 A) @" X$ j
                }& O  L/ q; c5 H* `* X
5 u* y5 T5 [% G) W; u

$ k/ z% Y3 \4 b0 V- _            }//结束while循环5 y% I: u) A. b$ k1 a! e. e
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
2 ^  B9 f6 l: G) K  E' N           
% T8 C4 a6 S/ O2 X7 m! l0 d' D. R                if (numw[i] != 0)
- Q; o$ x) E0 ^                    Console.WriteLine(numw[i]);) o$ m* D. n5 x
           
* F& ]: r% x& C6 p( ^& F! q            Console.ReadLine();9 y2 }( k; o' l5 p
        }
, i: C- L# b) r2 c: B& ^    }& y7 z7 W1 M: U7 w* m! F
}
4 ]+ c% y9 ]4 J+ w, k8 u& z. X
小甲鱼最新课程 -> 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, 2025-11-8 11:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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