鱼C论坛

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

猴子问题

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

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

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

x
大家好!8 d5 d, W( D1 @" c1 Q2 \
这几天我在忙着编一个问题,我用了一种方法编出来!
2 _* O/ Q& F( c/ r- @但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
: |* i/ C+ P" X注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
9 i; E8 B- S) q2 j; p2 |
, n8 D  P+ y- m1 ?/ U6 |- L* X/ m/ d$ ?
                            题目
/ G5 c3 ?* e. C0 T5 Z- t% j0 o山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
/ ^( N: Y7 ^; {- C: X第一种方法:利用循环链表' V' k- M' Z$ B1 v1 l; K
#include<stdio.h>
1 A2 G7 q% a/ G* ]% T& d% E# ]#include<malloc.h>
0 u: [# R8 {$ i- x* h#define M 8            //共有8只猴子; ?* R  S$ V3 o- p1 t+ A
#define N 3            //数到3只时退出第三只( t8 v+ F' h# s# v" V
typedef struct monkey0 x5 t& I7 B& Y) }
{int number;
- \8 }2 S. r/ @5 oint flag;
  v3 t2 k( w9 i1 L5 qstruct monkey* next;
+ g) b6 W# d' P/ R% q" I. t" m: [}MONKEY;$ z8 w$ N6 @9 u4 ]  j
main()( [4 M, |: k9 z- B, X; L7 J
{ MONKEY *head=NULL,*p,*s;
# B3 B" B9 a2 M  int i,sum=0,count=0;
8 v6 Q  Z- \) k3 v( S0 A1 x1 x& O/ G  clrscr();              //清屏
7 \* h! g* u. ]  G8 K  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
1 k1 i. ^2 j5 d  p->number=1;p->flag=1;
0 L, y2 h2 q; e# N0 @  p->next=head;
# z  h, i; y7 |" A  head=p;
, ?& Y  w  B2 K" |0 R, C  for(i=2;i<=M;i++); S* u! d2 A& k4 F7 h* ?5 x
    { s=(MONKEY *)malloc(sizeof(MONKEY));9 c9 F+ q: g) H3 J8 [/ `* {; @1 ]
     s->number=i;s->flag=1;
! x) e$ E& ?* t! t. |4 o     s->next=head;* F$ ~; K( _' b6 n
     p->next=s;p=p->next;
1 G  h2 G( C5 f  a/ O0 |    }
! f6 H; e; l( y3 X, f    p=head;+ Q( o9 H2 c  x) t( O, Y3 S
   for(;;)" ^4 `. R7 p' e8 x
    {if(p->flag==1)0 X& O; C: {6 y
       count++;% b8 ]0 ?1 v; j6 ^
     if(count==N)
7 X! S; T8 F5 f        {p->flag=0;7 d. h" ]/ j, l
         count=0;
0 r7 y: Y$ [3 r' C$ E         sum++;}5 Y3 d" o9 I  E$ A; s4 u. \
     if(sum==M-1)2 _  w. M% ]" p: Y7 J- z' T
        break;6 d4 j+ C. R: e3 ?. \( t' }0 Y
     p=p->next;6 M9 x( [1 x1 g- n  W* X- _& U0 q
    }& W/ v# |* \) A9 w  r. D
    p=
3 u$ U" r4 d3 J( X' n    head;% Z) q1 ~" P9 v
    for(i=1;i<=M;i++)
3 B" v# L3 t$ a4 A    { if(p->flag==1); y- A7 j$ Q" [
        printf("\t%d",p->number);8 j7 ~9 ~8 V% W+ f5 Y2 i  F
      p=p->next;
: K* ]2 x% n* A, ~! _! F    }; E  @  x7 b( p% k3 F3 T# c' K2 x
9 }( q! _$ l' g- a% n

4 `; `! B' \6 u2 Y5 A! Z2 U+ x: p& M* M* R. ~0 w4 i  w( w  ?
}

& n9 o6 i1 _" `第二种方法:数组2 q9 R8 ]9 p+ }
#include<stdio.h>6 v5 L! w3 ]: e5 S) K. T$ R
#define M 8$ k, w, N! h! e; A( M$ G( O- g
struct monkey
0 o1 U) X0 A% t# Q9 T{int number;3 x6 W# D  m+ X. x  v/ I' T
int nextp;  l+ o7 g* X& i" a6 V' o
}link[M+1];1 k! {! t0 R$ g/ e/ g

. a5 j0 d( A4 z0 g* uvoid main(). a  |9 Q9 i! |% p6 p
{int i,count,h;
* r+ Q; E$ O( c0 G: [for(i=1;i<=M;i++)7 p% X# x7 I" v- {2 w
{  if(i==M): ]9 {) B1 @! n
   link[i].nextp=1;
( s+ `; \4 c; q- Y   else
0 D+ G5 }/ ?/ a. M   link[i].nextp=i+1;
4 ?  e7 k' j2 t4 E/ j  link[i].number=i;
' U/ a4 g1 I' s+ U9 ?}
6 F( `: z+ b9 ~) x# sprintf("\n");
5 }( q% l) ~6 o& C5 ^3 b9 vcount=0;
& [8 j* O4 d" t/ Ah=M;
7 ]" Y3 S9 T/ q# p" Z% _printf("依次退出的猴子: \n");
: W6 _; }  y. C6 W) m) z; x9 S- Swhile(count<M-1)% p6 I8 H1 R( S2 r& @) F( }: r. J, h
{i=0;+ @5 O# h: p( |) m5 N/ n
while(i!=3)% l( S' l' J% q4 |: F: _3 g( W
{ h=link[h].nextp;" T, M9 R6 U1 O) y% r! Z  @
   if(link[h].number)3 V9 m  Y  j0 U" n' g0 C. t7 E' L
     i++;}* q! T( G. q7 d9 c  [

( b+ \5 v6 m7 R6 Vprintf("%4d",link[h].number);
7 W4 E) z; h# O8 }link[h].number=0;7 i0 o* u1 {/ s8 @2 X
count++;' Y3 U/ {/ ?/ z( m+ G
}
+ E5 d8 ^1 @& s/ y" t
) x4 V; D. k8 f4 V1 h" lprintf("\n大王是:");
( H- o/ y0 @- t& c  for(i=1;i<=M;i++)
) m7 s5 c9 z! r% `2 D  if(link[i].number)! C& u0 Q  a5 Q9 X/ p
    printf("%3d\n",link[i].number);
3 c9 V) G1 L$ v( Z* `+ U
1 X: L8 I; \3 o+ ~( W. q9 M: D& n1 I* g9 ^' {( }( Q) O5 ?
}
3 x" P" L& E* H9 }& B( l0 J# E
第三种是普通方法for循环

% `  Y6 e* y3 l9 J% a/ b$ Y9 @- f#include<stdio.h>4 ?6 f: g: W+ @4 e
void main()
+ |0 q2 Z- U/ N( g8 j" b! J$ ^{ int i,k,m,n,num[50],q,*p;
6 q- p5 d6 H' A. u( y% Z! W    clrscr();
+ W/ ?) g4 l) v/ `' {   printf("input number of person: n=");
$ n7 t0 I2 X5 D- U    scanf("%d",&n);
+ `6 b. i# u6 y4 E; I$ ]printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
7 Z$ P+ }: Y& u+ ~; P4 B* H8 c) E    scanf("%d",&q);( h  E' m/ d8 k9 o1 W1 A
   p=num;
- q3 W$ j% o/ a$ B  for(i=0;i<n;i++)
$ Q. z: \1 H" Q) q; H    *(p+i)=i+1;6 w; J3 X" O1 {4 g! q  a" g* B1 g
   i=0;
! r0 ^+ |9 L3 V$ E! b$ A   k=0;5 @' ?# o4 _/ ]5 ?1 y4 C- t; C* C
   m=0;
& H: O8 k. R( k6 M3 a  while(m<n-1)  r$ C  v) i$ g/ _* i  |; s
   {if(*(p+i)!=0) k++;) G7 e) ~7 Y: s) N( k4 Q
     if(k==q)
. q  E. L$ Z& g  x      { *(p+i)=0;
* O; t0 I3 j+ }: F' p6 ]' h        k=0;
6 L+ g& c4 [& u* y$ J# E        m++;9 E1 O5 N7 [0 Y' I3 ]; E' Y8 e! P8 A
      }; K5 u) S% v  P7 ^9 L1 e& x  |- \6 [9 A
    i++;
" Y5 w/ t& s* a: `0 l3 Q4 D4 C    if(i==n)i=0;
, P1 _9 Z2 K% L# u' `   }
' w; |7 T, x5 V+ H. f0 Y8 C( x  while(*p==0)p++;
4 N3 ?$ G* h& u    printf("The last one is NO:%d\n",*p);3 ?: I. V# ~2 u$ Q) ]' Z" D
     getch();
* H% O) ~9 @8 S4 l( T: j
+ B- \  U6 Q4 S! {# l}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;% f4 A) \, D; ?2 i* D1 \, ^
namespace 又费马达又费电
5 @; l0 ]. C/ V7 [# A7 w: u4 l3 }{* X$ |: {& ]6 q( l
    class Program
0 F3 s9 R" I, f8 q' v' I    {6 ^6 h  ?! \! f" Z( q
        static void Main(string[] args)6 N/ H5 U9 M8 ~
        {* n. k2 M3 q7 O, w! H
            int m, n;& {. o1 Z4 b2 O" D# f7 l. G
            Console.WriteLine("请输入数组长度");
# P" I& F/ m' n1 ]2 N- P/ Y, _0 Q            m = int.Parse(Console.ReadLine());//m为数组的大小% O5 o8 m+ [2 H
            Console.WriteLine("请输入要截取数字的大小");5 J; z1 K( Z4 g; L7 f8 g1 ~" ^# L) V
            n = int.Parse(Console.ReadLine());* B/ s1 _7 Z. ?; q& h  u
            int [] numw=new int
! g: [* r5 _! B* {# d# n
; x; e5 k4 t5 ]7 ^* Z&shy;&shy;&shy;;
8 O- ?, }6 u$ A) h9 J            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数" k; e2 Y, O9 L- w6 }* A) f! A
            {
9 y& R& L: E( W& ~                numw[j - 1] = j;$ y+ M$ H: V* s9 H; _
            }2 q) U% M9 i2 f0 q8 {. V; |3 Y
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!: D2 _$ y: L1 o4 A6 V$ O7 ^
            while (d != m - 1)
* G8 o% Z* J3 P0 l' O            {9 Y& F& E0 s5 w# V
                if (i == m && d != m - 1)
3 E6 T& p9 E% Y, m) D' q3 P                {# I+ ?& }6 t8 a; z  R
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
6 u+ q) i1 u2 @# e$ \) `                    continue;
5 r% J' s& u7 k* X! u$ }" G( x                }
9 k, T# i& D5 ?1 s! d% b                else
: R9 t4 o+ O* {/ S) B                {6 Z7 d0 N' T2 _$ l* p$ G
                    if (numw[i] != 0)
& y. x% g' c9 M. z$ q( J                    {, r7 V% N% U7 ~. K$ q
                        i++;! O4 ?5 [$ g$ b" D0 n
                        k++;9 h0 G4 Q8 H) R
                        if (k == n)
) ]  T* `# ?- h) z  |0 \                        {9 V$ Y. R5 z1 d& I& b0 V8 [
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
. {7 E/ p' g/ o0 B# a9 R3 _; Q                            k = 0;
) ~+ Q6 g: f% u, s              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
" f& L( r! P2 X1 [4 v/ x6 R% V                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
" e4 ~1 l; k) w" h                        }2 P  e' V3 _0 M+ I
                        else//输出暂时还没有改变数组元素的值; ?5 ]% a# y" p9 A; e8 _$ H1 L% P/ {
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);& m; P% G9 t) t4 _' G
                    }
; W1 {, X: [/ r0 z/ I7 ~8 o" v                    else# l0 z6 {3 G: b
                        i++;//数组元素为0,直接跳过,不计数。。。2 R( T1 q% N& B
                }. P6 G% F5 @. V! _0 A
: d# H" T+ A# K/ I- g3 a/ m- k
  n+ Y' G- |* N" q9 N
            }//结束while循环6 m1 v0 u: x9 Y5 f
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
. j" ~# }) Z' N. [. _           
" Q1 [  C" m! Q: M& q2 y! n                if (numw[i] != 0)# r8 L2 g( j: \$ u5 A. ?
                    Console.WriteLine(numw[i]);3 _. T; E! q9 c
           + F5 o# F% X0 y
            Console.ReadLine();; U$ o) k* |* P! W+ }2 F& Z, z! G
        }) X" i! m. r6 a: _2 }+ G8 H
    }+ ]- b- Z3 r7 A% W, `0 N) I6 J) \
}2 L& i; q8 e% Y( S6 |. X- P8 a
小甲鱼最新课程 -> 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-10 19:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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