鱼C论坛

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

猴子问题

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

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

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

x
大家好!
$ K5 I8 l: _/ m. F; a这几天我在忙着编一个问题,我用了一种方法编出来!0 G( |8 Z4 s0 f  E# I
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
1 H5 G; X0 {& a" K" e1 }% m$ M8 Z注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
, [) X4 S" f% [+ J* W3 H/ N7 q. c; m4 b& v' p
" y5 j5 t$ f9 R) l7 u- L
                            题目# ~5 U1 F7 q( y8 k  D8 E$ x
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
) \& _3 Q: [& N2 l第一种方法:利用循环链表
# X% D  H. n, \6 t#include<stdio.h>9 u# R6 k0 u/ T% y  A2 J5 ^
#include<malloc.h>
; Q2 }! p# A& y/ s* \9 m# M* S#define M 8            //共有8只猴子
: h0 A8 A0 A9 t. R#define N 3            //数到3只时退出第三只
$ E% a' J' o  z! q# S, Y, otypedef struct monkey
5 c% v, a  D: z: [- s{int number;
8 a# W5 P( K. s. s; i- C4 Eint flag;
% G) F  M. T. }) f  O+ rstruct monkey* next;
+ h5 G, u* X3 Z( @}MONKEY;
$ A$ E9 h4 ^7 L- P" lmain()8 T; u9 g: [5 O
{ MONKEY *head=NULL,*p,*s;- |* e+ m( k2 q5 |8 Z4 a
  int i,sum=0,count=0;
! C, P) M% T9 S. J& w  clrscr();              //清屏
& v1 g5 e7 _" w2 b  c9 k5 G' y  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
; f; N# A7 |; e) H8 e  p->number=1;p->flag=1;  n3 L2 q3 K+ m) m! A3 d8 L
  p->next=head;
+ o4 |1 L9 @, s  head=p;# b5 p- N8 h8 {( Y
  for(i=2;i<=M;i++)
$ K8 r) {9 A6 h) F    { s=(MONKEY *)malloc(sizeof(MONKEY));8 O+ {* L9 s9 ]) g
     s->number=i;s->flag=1;: E0 [  a- S, a+ ?8 ^# d
     s->next=head;
8 e8 ]! C' {9 J; _. R     p->next=s;p=p->next;
/ j* P$ s* I+ u7 s- E0 F  _" j    }
1 I' x9 J& c5 e5 v9 e/ a1 \4 h4 d    p=head;
: u* R( o. |) {  I* ]   for(;;)+ R8 y/ E' E0 N# ?; a" \
    {if(p->flag==1)
' X# \; ^2 Q- W! e6 F       count++;$ z5 o- f, ~; j; t
     if(count==N)
. g6 B. \9 _7 l8 B7 x" N        {p->flag=0;" U5 z4 y1 H) ^/ e6 ^4 R0 [( k
         count=0;
0 z7 t. o# z5 Q: H1 r         sum++;}5 a5 c! t$ _# n/ B" t
     if(sum==M-1)
7 b+ a8 h$ @7 F  t# o9 ~        break;
' |) A: C( f  u+ L2 D. ?8 P7 g& m     p=p->next;
' ^) y. ^; U  M% @# F% n6 L% M* E    }8 F; Z8 G, A& p. @% C
    p=1 T% l9 i' H, V2 g. q3 e* g
    head;
6 D$ b0 p; c) ?1 C5 T1 K6 T/ K    for(i=1;i<=M;i++). W# }% o; M2 u, E
    { if(p->flag==1)
" p0 S) ^# k6 v7 ~5 N        printf("\t%d",p->number);
4 `5 S. _  c# d4 F3 T      p=p->next;3 K$ g6 v6 W' f! Y& M
    }
2 d8 Q0 v4 _! I5 I* S- ?( j# A3 K+ M% A. e8 V

; F3 Q" C' v. M3 r+ O, |. x, {8 I& g& y+ z4 o8 e) R# H- k) ]* w
}

% Q3 B8 H, e% d% [0 N9 t第二种方法:数组7 ^% I  d5 s; o8 Y
#include<stdio.h>
  G  g- O4 o8 M- Z7 G#define M 8- \+ i  _) h4 T3 _3 Y) a4 _8 `
struct monkey% A& O* Z& i9 |3 S1 j) e, G
{int number;
; k# K+ T  m. [3 \. n' tint nextp;. B4 W# N- M+ F; n1 c. P
}link[M+1];
" v. x9 q' |& c  m" E  N9 ?. v% k& F  y/ H
void main()
& _; s/ v8 n8 T# s# `: z$ q{int i,count,h;4 M* I: A! o9 y
for(i=1;i<=M;i++)+ x. V9 g3 s2 u+ Q1 |$ u
{  if(i==M)
& N; e( i) ?9 C% Y   link[i].nextp=1;4 @) }0 {2 B$ I" f0 H
   else
: B5 r# N( |: `   link[i].nextp=i+1;( D' j$ W8 F/ k; z$ B* h
  link[i].number=i;
6 S3 l6 e( \; s. P8 Z% }) b! K}. ^+ x6 ?0 {3 f
printf("\n");
. k( ?# R, j8 O# j* {  \' R3 Z8 zcount=0;, b, Z) |# p) [  ~" a
h=M;7 m8 W  \- j" D$ X. f
printf("依次退出的猴子: \n");
/ {# A# I) g# _! b; m0 jwhile(count<M-1)
4 ^5 ~# w( I2 X( m1 K, e1 `- l{i=0;
" R1 Q9 a8 E. V$ `- T8 |while(i!=3)
# z. m: ]6 P& s. s% W; k0 W% L{ h=link[h].nextp;+ {7 x+ k$ i' J% I2 H) ?' Z
   if(link[h].number)6 s. Y* V7 O3 H6 R
     i++;}: z  L2 y, m3 l& v; Y: S
% Y& a  V6 ?# @2 k
printf("%4d",link[h].number);$ s3 r) x! L) D7 r# s
link[h].number=0;
) M, x+ H" A* m4 z: \& |  w2 Ucount++;
* W, \7 N/ O: \/ O8 o$ q4 l; q}
! L5 p* Z7 J' v
( {% T. ^* |7 Zprintf("\n大王是:");8 `1 `8 |7 o. q0 [! z
  for(i=1;i<=M;i++)/ l! _. a1 P% `0 X5 b! v* Z1 h
  if(link[i].number)
, A/ T+ P  j: c& O2 g( o    printf("%3d\n",link[i].number);5 u: x- R. B: d% c$ W1 ?% }
1 u; S/ e) |( z2 f3 O

9 A) h3 G  W) m}
$ g, ]5 Y+ L. T
第三种是普通方法for循环

3 \" d) C+ v/ t  V  M#include<stdio.h>
+ {3 s9 e  y; ]0 Q$ Cvoid main(): i2 ?8 k# {* Y
{ int i,k,m,n,num[50],q,*p;
- u  g+ O: F7 [3 v; n    clrscr();
2 W3 G( V8 v9 G   printf("input number of person: n=");  G; M8 \' P. |- @& L% l
    scanf("%d",&n);+ j$ `! Z/ D# U$ Q3 @* i2 L4 Q
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
5 H2 G" ~+ O0 k! I4 w3 |    scanf("%d",&q);
9 d- N: N3 M5 ?4 }; i3 {& O& T   p=num;
4 \/ [( t# `6 N- K* W4 R: ^! K3 {  for(i=0;i<n;i++)3 |: N* g" L, o. T
    *(p+i)=i+1;: @  b, b/ a& }/ o. x$ ]9 C
   i=0;
' p& |4 r) D- y8 {" o   k=0;" C5 y3 ]. ]9 {! T
   m=0;8 j/ ]5 w; _+ S! n7 }3 D7 P
  while(m<n-1)
) l1 e- T* s  f   {if(*(p+i)!=0) k++;
' f6 N- h4 |5 d" H/ `, h     if(k==q)
: k0 ^0 W% ~' |      { *(p+i)=0;5 A2 T! d3 w( ]6 z6 [
        k=0;
" t' W  W' C+ p, ]5 O2 ]% \        m++;6 ?% |4 e# Q( r8 ?8 N2 V: [
      }7 @4 [0 c" P2 W2 b. T+ e, |
    i++;" C& M8 o4 y( U/ {/ _, A6 D* U
    if(i==n)i=0;
* O; n& D+ i3 b9 g/ q2 i+ ]+ y   }1 \; p# Z9 i, q$ y: J# }4 k; R1 V
  while(*p==0)p++;
6 o! U* d% N" |# {, i" x6 O7 T    printf("The last one is NO:%d\n",*p);7 P* g( M, h5 H. h
     getch();
! D+ A6 c/ ~# b) L- U
6 i: P4 Y  `0 P: {2 d0 f* T: \}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
2 \# A. d; b; v; j; Z! L) _6 pnamespace 又费马达又费电
' V, C- `" R, e# ^) z: v8 f{, Q% Q/ ]- W* V+ @0 J5 F
    class Program4 u% u9 ^  J- s, }9 o% g: F
    {4 P  n* K$ l% p7 O6 z/ ]
        static void Main(string[] args)
  }; i, f( Q* ^& |! S        {
/ M' ^: C5 A/ M$ B7 ~            int m, n;4 y8 W" v: r# Z4 N3 x/ D
            Console.WriteLine("请输入数组长度");$ ^, W- d4 h9 C: @/ k% f
            m = int.Parse(Console.ReadLine());//m为数组的大小9 T* m% P; W3 M! P& f) N" h
            Console.WriteLine("请输入要截取数字的大小");
% r$ ]) e/ k3 m3 N. S            n = int.Parse(Console.ReadLine());
$ j- n3 {/ I) d9 f. N; Z* e            int [] numw=new int- s( C4 |& S( w* O" U( r

; [! B& G, X3 c& L( |% R&shy;&shy;&shy;;
4 R5 u  c% s# Q1 U- q- w            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
$ `1 t+ J7 W, K            {
7 F+ Y! B# o" B0 {5 o' a8 }                numw[j - 1] = j;
0 w- @; k- v' {4 D( }            }' ?' F$ |! F5 g& {
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!. w5 e+ Y$ \( L3 ?# d& Q9 F
            while (d != m - 1)
5 u% y( i* Q5 [% I# m) b            {
* p  ~) [( n) R- K' [                if (i == m && d != m - 1)1 m* O' X' Y) B8 F
                {/ L7 @) H9 w+ c$ ~2 o. d
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
. ?, g7 f6 A# G( U6 x                    continue;
7 X# i1 W( G  U1 B9 Z  l- Y                }
5 ?8 H0 @( g# h0 ~0 ]/ I, i                else9 u3 W- Q% C+ R
                {5 W& U; |3 X1 J6 N- x' g
                    if (numw[i] != 0)) C& \3 {) k2 {8 Z  O/ [4 z- w
                    {
4 F  ~6 H+ E3 z7 c# D* w1 E                        i++;
- f' W) E1 ^' J+ \4 f4 z                        k++;6 D" z: u4 X6 |% p  j. p' m' y
                        if (k == n)8 g% K4 A0 ]% D8 [3 g3 B7 Y* [1 Y
                        {
( \( O9 W4 @2 L: w/ g+ _! e$ _                            numw[i - 1] = 0;//把在n位置数组元素的值改变了4 ^0 {% w/ o  j
                            k = 0;8 I6 |; q0 `$ Z  g7 B+ R, V
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
/ E; Z5 J. W+ e                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
" y+ M7 x' a# ]( b! z- r5 a                        }
  Y$ j; d  A7 _; V7 X. D% M9 v                        else//输出暂时还没有改变数组元素的值, f' z2 j1 a3 F3 j; M
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
5 S; ]3 N" Z' o  Y" {" \                    }" M, d& y7 ]6 D" b$ G4 h
                    else1 n1 `3 Y; `8 }1 |: [0 Y/ Q4 O& g) @
                        i++;//数组元素为0,直接跳过,不计数。。。3 r) O2 K9 w! N  D3 z# I* {* n/ V
                }0 K$ _8 F, U7 l+ I* c9 `7 p/ g
- u7 K5 j& y/ y) z! o/ n! M

! n/ ]0 W' I7 ?            }//结束while循环& Z$ a/ m( P* Z) E0 K$ K8 K+ E
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
- V1 I/ ^2 K) o- b! E, O) s. z           
; V/ d: ?5 K7 X3 x+ V4 I$ _% V                if (numw[i] != 0)9 c) `. R; D! t2 W+ ~
                    Console.WriteLine(numw[i]);
4 f1 G! ?; j# e3 e  J) }7 o           " a# d- M3 |  |5 K& n7 [
            Console.ReadLine();
/ u8 y+ p; L' k4 p" ]2 k$ F        }
5 g* i$ F6 k* k: U/ P# [2 D& t# c# e    }
. F; Z8 ~# B1 `4 v; u) M}. s2 I. _2 @) e( t! Z1 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, 2026-2-14 16:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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