鱼C论坛

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

猴子问题

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

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

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

x
大家好!* g$ ]) Q" s3 i  {6 N
这几天我在忙着编一个问题,我用了一种方法编出来!+ T6 ~' K; l- O! ?
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!- I; U, w" O9 R3 E7 R4 V+ v# [5 S4 y( t
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
+ A" W9 S1 ]4 U. O5 J3 }, B# n% G3 {

6 N) z2 |& S) z) C  c% `
                            题目
; I( j* H! b+ m# Z+ I8 ]* W3 l* K山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
' f& v: v+ [9 A( ~4 w' {$ c第一种方法:利用循环链表
: N1 U9 }4 W, a' j1 j( w" T" l#include<stdio.h>0 F7 L* O+ l8 `
#include<malloc.h>
- d+ S9 C* k, e#define M 8            //共有8只猴子) x8 E4 N# e/ ]- q
#define N 3            //数到3只时退出第三只
  E2 c/ W) {. F( R) j1 Ktypedef struct monkey
) I+ e2 }* ^$ P7 \( i  ?{int number;* o, w5 w2 A, w9 L1 i
int flag;
0 }  M" s  v1 D$ `4 hstruct monkey* next;
- g7 u/ q1 X# K# @5 k# e}MONKEY;8 g& _  q! y3 r9 w  Q- `
main()" x5 j! a( F# k+ M% P. G" g3 l) {, s: s
{ MONKEY *head=NULL,*p,*s;  `0 ~; e1 L) q. D
  int i,sum=0,count=0;- u5 O4 I3 p2 D
  clrscr();              //清屏
* K% F7 s: M) M+ L) b, Z, l  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存8 D" J. d7 H3 w* \* h0 B
  p->number=1;p->flag=1;
2 n5 R& n, a7 V( ]# [  p->next=head;
  b' ~  a& X$ V4 l" ?  head=p;- X* j  Z7 Y2 M( S3 r6 z
  for(i=2;i<=M;i++)( x3 l4 k4 T# n+ R' o1 G, C$ ?
    { s=(MONKEY *)malloc(sizeof(MONKEY));
6 E7 o2 I1 p! U     s->number=i;s->flag=1;* u" X; ^6 O; [4 {4 V5 h
     s->next=head;: P8 n2 Y9 |; l3 H8 H2 o
     p->next=s;p=p->next;
3 ^& x5 a+ m# q3 A. \    }. u# V# l! x" n8 l/ u! k  X
    p=head;) N! B7 l& x4 a, O0 h5 N
   for(;;)
+ \, o: U5 S( l) g    {if(p->flag==1)
& g! }8 V3 P3 r+ S, E& Y' N       count++;" m9 m& O0 w6 n& n1 _# w
     if(count==N)
$ I* H" t1 X* b( u2 m. g3 F( }! X0 v        {p->flag=0;6 t) }- }/ W  J4 ?% c' K5 }
         count=0;$ q) U2 W0 a) ]$ n. s" l* Q" w) v, [
         sum++;}
) L3 k# J$ o7 v1 I+ v     if(sum==M-1), E- Q- M# e7 |0 q  ]1 Y
        break;8 r( |5 K; B" P% ]* I* k
     p=p->next;2 Y5 K' `. i1 k4 \
    }% ^8 Q/ H  x/ k& R: k
    p=
  ?. C4 `3 F6 k. n- E7 S) @    head;7 i+ ^4 x# i, t
    for(i=1;i<=M;i++)5 R+ z" K& K' ?
    { if(p->flag==1)( q& w) u! [  y3 h: h
        printf("\t%d",p->number);$ v. y7 [( o8 n% O0 S* B
      p=p->next;( z) ?, |1 L. s
    }
/ b2 g. t$ D9 m3 s4 \% Y  C" C: z( A4 e, i7 ^- h/ y- l# M

9 u  Y% M- x; K+ z& C. f- g  d3 s
$ e) M+ W3 L- ~$ j+ {6 [2 }}
* m. x" ?- f6 f& `+ Z" S
第二种方法:数组
; g5 t8 d* Z6 d#include<stdio.h>" [3 {( C# T# l5 M% x; G
#define M 8
* j, A9 k2 ?) R6 T: T$ L4 e4 Cstruct monkey. P! c6 B# K7 K. |
{int number;
7 T* X( ?( r: p+ ^# c4 ?2 gint nextp;
- g3 W( W6 b7 Q* t/ |% d% V}link[M+1];1 E' M/ _4 L3 u% e5 u* P8 V# a

( {1 _8 Y4 v6 B5 `: n4 f8 Xvoid main()
) ]8 }+ Z& r2 T  I' R{int i,count,h;* M2 a' X( ~6 z% a. {- X
for(i=1;i<=M;i++)5 ], R( X# `4 {9 b8 M7 a
{  if(i==M)' V8 @( y- s4 t8 E+ d3 V" {
   link[i].nextp=1;
0 H4 ]" _. r  }/ w. s% ^' ?' ]$ A   else$ q" y" X1 g2 F, S4 I( v6 B
   link[i].nextp=i+1;% I$ q  I1 I7 F! L
  link[i].number=i;
- j( d, s+ J+ l. H6 U: D}
" Q/ Y2 j0 M$ E4 |3 i' Rprintf("\n");! i1 f5 a2 |* _
count=0;
3 i, w" X/ r, H; @4 _h=M;
( g+ S- G" L: D9 j1 s6 R- J  n9 Gprintf("依次退出的猴子: \n");* s, x, A9 B1 {9 l% F: d0 u
while(count<M-1)
9 Y% G* d1 F8 F- y0 d- \! ]0 B+ J{i=0;4 ?# `$ m$ Z! j2 H9 l( {
while(i!=3)- ~$ S0 a0 r+ f, y# d3 Q0 T* f
{ h=link[h].nextp;2 d" s; j- I( @6 H3 Y
   if(link[h].number)" E: ^! o6 C. ]; g# c' w. m6 U
     i++;}3 y1 i( u2 g/ v) {" M  L" W

, N! p% v" i1 _' f2 u/ q; @' P: E5 j/ aprintf("%4d",link[h].number);+ [" ~1 j+ t& y9 Y2 F- [% N
link[h].number=0;8 z1 W1 z# Z6 Q" Y; g
count++;
: h% i# c2 c: ?- R" g; b}
# m. ]% v" y9 x& a8 J% }) a' M' H% {# G) g
printf("\n大王是:");
- H' s) H/ q6 r# F  Z4 T  for(i=1;i<=M;i++)
# l0 w7 b! N1 ]; f  if(link[i].number)# l- G: q; J1 `8 ]; i
    printf("%3d\n",link[i].number);8 R! j; h: @9 X" e0 M& i* D& v3 t
$ Q" p0 [3 A  z3 l) o  ~- I

$ C$ {# L5 q' _! R}
/ Q) O9 ^& W# I
第三种是普通方法for循环
2 M1 [* M. r8 y; W
#include<stdio.h>5 O( d# k+ Q  K$ _! R) ?) V8 w5 x. A
void main()
9 l6 a. f( M( Q* l) ?: ^{ int i,k,m,n,num[50],q,*p;
/ L1 t2 H* _+ H' |4 S    clrscr();8 L$ o  g9 w* f( f
   printf("input number of person: n=");% m4 Q  a* H) C
    scanf("%d",&n);
$ j" ?  C$ U5 gprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
' `7 d  l  e. c& u. E    scanf("%d",&q);
3 v, |( f6 W, t# X- }( b   p=num;) q$ s- Z$ K: T2 e* t
  for(i=0;i<n;i++)% |  V- E' @1 U) i, X% o7 Y
    *(p+i)=i+1;
+ N+ {8 O' L- t, F5 z" F   i=0;
8 l  {/ Z3 k2 P   k=0;
: I- g. Y# G7 n2 q! q8 c   m=0;$ _! ?  y$ Y+ ~, Q; T. ?) g
  while(m<n-1)
( ]0 ?3 R' x6 S   {if(*(p+i)!=0) k++;* A/ W4 J8 j9 G0 Z/ F" L" i
     if(k==q)
6 m# S1 N1 r! F9 r      { *(p+i)=0;" S9 p) L: Z0 v+ O" n( T, G( J
        k=0;
6 y# k+ Z% \- W) @* j& r# r        m++;4 m' Q* u" u5 d9 e- b
      }* l+ s7 k' c* t& G2 S
    i++;
- H& e: Y/ j* H. s, H& Q    if(i==n)i=0;5 Z  j1 k0 |7 \2 O
   }. V# }; [7 s* @: U2 H7 n# u
  while(*p==0)p++;
. _9 o0 O/ D$ b( f# j    printf("The last one is NO:%d\n",*p);
; W2 z: M. E+ ?/ ~0 g     getch();* ]$ f% c6 o9 E% a! E7 ]$ U1 @
8 F5 Q8 p/ [7 M0 q; f# Y
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
. p- W/ |$ n: v+ K. [( N7 V% Cnamespace 又费马达又费电$ e8 g4 I9 S/ X. d5 u
{
. q1 q% F! ~( G3 |) t4 }7 J. `8 r    class Program
2 v( C! l: p2 m8 \    {
/ f. |% e. [! D* _        static void Main(string[] args)
  d6 P; [/ C; F' a) {5 q% X        {
2 ^, `% A8 I6 a, _0 }1 Z0 j% S            int m, n;" u8 J( _4 T, Y0 i* Z0 I+ U" k; x
            Console.WriteLine("请输入数组长度");4 K9 O- D3 d/ q; e( r
            m = int.Parse(Console.ReadLine());//m为数组的大小
7 B- y5 P( m. R/ H            Console.WriteLine("请输入要截取数字的大小");7 T/ I$ T9 Z& D6 D) o$ _* s
            n = int.Parse(Console.ReadLine());- R, [' H  d5 H( o  |4 L1 b4 a
            int [] numw=new int
# i5 j# n' O. Q* d6 s9 k) Q) {" H
&shy;&shy;&shy;;. T* C( o1 T# P& a1 u. y% c
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数# ]" H9 |+ t" k+ n4 J% q- c
            {' L, n  o5 f, k9 |
                numw[j - 1] = j;
8 a# j6 ^: s- t3 E6 @( a- t            }6 m& C, R* A5 x- H$ Z2 |
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!9 d: x" ~8 a: H+ |, X6 O/ }/ M) p
            while (d != m - 1)* D+ m- B$ d+ O/ s
            {8 z- t1 V. G6 t8 h1 t5 W' P6 Q
                if (i == m && d != m - 1)
# m3 ^. E, W  J' @: W                {5 n* L* A1 y& P- F% j
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
. b9 x% A7 O7 Z, r5 k2 W0 Q( }                    continue;9 {$ b' H8 Z* F. M, u
                }& D* }) a3 {7 ?) m% Y
                else
+ [, b. @, ]8 p9 U) c( Z1 B# d. \+ y                {
4 G" A- @1 f, w                    if (numw[i] != 0)8 [( u4 r* }0 I; K/ D
                    {
* o+ U1 Z' n9 ]+ f                        i++;
2 W  @# w2 F+ n) E: V* A2 t4 ]                        k++;
% Z4 l; C; I# x* h                        if (k == n)) ^  e4 v& m, B2 m+ m
                        {- \, Z. l2 E' ?) E( D5 w
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
4 F: v- ]  {. p9 M" i                            k = 0;4 O# u9 Y3 c& N& T$ y6 `$ `) m
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小15 s& D- J# r7 I2 Q! U
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);+ B- a. y2 N" I- l
                        }
7 u: t% }; u8 \$ I; I5 ^: K% t; t                        else//输出暂时还没有改变数组元素的值
- K3 b+ h8 t/ Q7 i                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
2 x5 {& n% D# v; T  r6 s                    }7 l& R1 _5 h* {
                    else% r5 b% b, s. G. L4 s& Y4 X$ ]% D- a
                        i++;//数组元素为0,直接跳过,不计数。。。" t' M' U5 E  }9 y/ s$ N
                }
" d/ t/ h' D: c* Z5 E/ O $ X6 b: n2 ?# x, c, b0 b* v- f. F

2 V6 Q8 ]' P1 h7 M2 E            }//结束while循环
3 x0 a! c- D( q- {! J# O% `            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
1 ^4 W0 r  |+ c3 A0 K           
# H6 G) g" }9 S. X# \. ~                if (numw[i] != 0)* |$ f& I5 v0 E  w
                    Console.WriteLine(numw[i]);
6 O# b7 W) r7 k: K           . Z% Q* Q5 H) X
            Console.ReadLine();% f  K5 `7 h/ a5 X# q
        }
: ]+ v: D3 V$ G" ^2 F& ~# O7 L8 `7 ^    }
: w1 N0 w: V. t! `+ C}
1 O# {9 P& S. f
小甲鱼最新课程 -> 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-27 01:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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