鱼C论坛

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

猴子问题

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

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

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

x
大家好!9 W$ M, ^, l6 i, G* A
这几天我在忙着编一个问题,我用了一种方法编出来!" Q. l0 u, f9 v# I! W
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!. M! @5 |+ h" t& ~' ^; K) s/ c( O
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 . n3 X5 B9 k, T- x- c% p9 k0 \

5 c0 Q, Q. s+ K6 _0 ^: l& a1 Z/ f" P
                            题目
" B; e, @" J1 G# E% Y& O1 i山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。: N% e% C3 e+ Q
第一种方法:利用循环链表& W9 h# L# P# g) }$ M9 E& G
#include<stdio.h>
5 L! r3 m" M- U; B( `#include<malloc.h># V& h" q$ w6 [8 p) |9 }
#define M 8            //共有8只猴子
# Z% |' h# q# ^2 p5 T#define N 3            //数到3只时退出第三只0 u3 \- w, D; ~1 c; m4 R+ W/ e
typedef struct monkey( T+ W0 l, v. ]* k0 [9 J  r, }
{int number;% V3 ?2 e! ~% z  @5 k; b
int flag;- q$ r' S8 z/ G5 ^
struct monkey* next;
8 v: ^9 q/ v; f% p' {' [}MONKEY;* b- a9 D8 a  A$ ]$ i& u, s1 _
main()5 `5 b, P' K$ r  X. |4 O- U, \9 S7 I
{ MONKEY *head=NULL,*p,*s;" p( `3 V4 A" X2 j6 W( g
  int i,sum=0,count=0;
0 ^3 r. V4 o* k7 \% v  clrscr();              //清屏
* l9 D$ l/ \, m, z0 Z5 z  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存  D9 i5 \8 s6 C/ |) O
  p->number=1;p->flag=1;: D( W( j, L, v2 c# H: _/ {2 E
  p->next=head;
  T2 l4 E% t' n! l) U  head=p;
2 ^7 f- c0 L( }  for(i=2;i<=M;i++)
5 q5 T2 W& a7 B& K% e3 `    { s=(MONKEY *)malloc(sizeof(MONKEY));
/ ^0 W; Z/ H9 S! P' j+ b     s->number=i;s->flag=1;0 ?8 `, z7 T3 p7 I
     s->next=head;  N$ j& U4 E( N
     p->next=s;p=p->next;! `! ^. e8 t. }* K8 Y( G
    }; S. V( f! J/ Y5 \
    p=head;0 z# W- @6 @# b( w8 R# Z# Q% B
   for(;;)
4 u) D" Z4 Y% ~9 }3 Y! M9 d    {if(p->flag==1)0 L  `  o" m' f! a
       count++;8 Z% j$ A/ b7 v* i6 x& ^3 a
     if(count==N)" ]& n/ ]; s% s& G
        {p->flag=0;. ^6 u2 r' ~3 ?( H+ C
         count=0;0 i) A: c, e  F  O0 I9 |
         sum++;}
1 |) l1 B1 L* X2 @     if(sum==M-1)2 L, z7 R& ^8 `
        break;1 j+ u5 z, D0 {# W3 W, g9 ^
     p=p->next;/ ~) ]; K- K# B4 P* s; A( G
    }
  ^) |3 O; {, F0 `  Z; K! D    p=
) L1 H1 X" M7 q5 e& y. O! H3 _# L    head;. e7 j# d- T! b! U* V# y
    for(i=1;i<=M;i++)
3 f" b2 y0 T! ~/ R9 }9 u    { if(p->flag==1)) ]/ O5 B+ i  v! Y; j+ j+ h9 B
        printf("\t%d",p->number);* J# t* z$ n8 ^! `6 ~5 k7 A, [( E" O" c
      p=p->next;
5 p7 e3 {! K% [8 \+ w    }
# ]2 l) B8 d5 g. D& U) ~6 p
6 w& C  S% D8 D8 `% g6 R8 L" J! @5 ^" N
3 x8 H; a3 k$ C' i2 B; j
}

# e) }, y0 ^2 D$ i第二种方法:数组
/ b: v% Z* R' |( C#include<stdio.h>
4 u* h4 A, A1 i1 w/ e#define M 8
0 h$ F3 s& q8 t/ u" Bstruct monkey
- L$ j* U, J! h5 @: ?% E{int number;
9 y/ U. S/ a6 ^int nextp;
0 i+ F: N  H: C; D, S! \* h, E! j7 s}link[M+1];
8 F) C# t% a2 x. n% \7 m
' g# _8 K+ x* |# v  }* l6 D$ tvoid main(), K% i# ^/ }4 [' b
{int i,count,h;2 j; N3 l3 Y3 z9 |# n
for(i=1;i<=M;i++)
/ h4 H6 |6 S' \* I( i* X{  if(i==M)
# l- v! F& g) N. L4 [   link[i].nextp=1;4 @9 h% E9 d+ R  }) H: @
   else* Z9 L$ |1 F* z( E* K- @
   link[i].nextp=i+1;: `4 j( d) f! d' D3 T6 @4 L
  link[i].number=i;6 K; i) u3 D2 Y' z- e* A
}$ N. r( O. o$ G7 ?% S* P  Q( \) ~2 I
printf("\n");# x& V) D! f8 A+ Y
count=0;& D$ h! O7 d6 z, a  Z) y+ c
h=M;
& A* \- E: K1 C! u* u. ^printf("依次退出的猴子: \n");
8 ]& [( l( Z: r! q  L! i% K( J9 p, {while(count<M-1)
4 y0 _' {. X, f5 W( \  X{i=0;
6 T0 O3 o0 g( X7 t8 J  ^6 Awhile(i!=3)5 q4 Y. V- [- s; Q$ G4 `
{ h=link[h].nextp;
- i; J  `" q! c0 Q- @+ S7 }4 o   if(link[h].number): k6 L5 I* p  l( ]$ r# a* G1 g# h+ y
     i++;}: S& }$ @3 ]7 U
/ P7 O2 u# N, ?( O; o/ X, e
printf("%4d",link[h].number);
$ S$ d4 q/ U3 z: d# ulink[h].number=0;
& |9 T0 _& Y- g, ]count++;
6 x$ v' V, f) g  U9 G}- y6 v7 T' \; }$ x

+ {" X- B0 s# i- {6 \" X- _9 tprintf("\n大王是:");: B% X# W- x+ f3 O" ~6 S5 `
  for(i=1;i<=M;i++)
- K1 V5 `: j( o0 u. ]( u: {  if(link[i].number)
. ~+ Q; T! H4 c. |( S    printf("%3d\n",link[i].number);7 d0 ]' F+ E, s
) {# z! m+ ~  b

/ S1 N9 Y( n& J}
1 C5 k5 c6 K1 c- |6 m( s5 J
第三种是普通方法for循环

/ E- V" x3 e6 [3 i! K#include<stdio.h>
& n. q. g$ d- Xvoid main()
* E4 \: J8 w9 z4 P8 Y" H{ int i,k,m,n,num[50],q,*p;# X" H# x8 E# J5 o" D; Y
    clrscr();4 E* N( j# m9 B5 |) r: n  ]2 |
   printf("input number of person: n=");2 n. m, ]3 o+ M4 z6 R8 ^+ a9 g9 {
    scanf("%d",&n);# }0 a" n7 m8 N! A/ m
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只4 g3 h" z$ I; U! |6 d
    scanf("%d",&q);' ~' |9 k$ g4 Z
   p=num;
& M# Y% g& J7 @. M' E  for(i=0;i<n;i++)
" u) j+ }9 a) u    *(p+i)=i+1;
0 `; d3 v: H6 h- |: X8 F# I/ b$ w   i=0;
4 _& z% k' q, O) i   k=0;
+ S# l1 O& ]- x6 I2 f   m=0;( R' B( E8 r- O: c) g' y
  while(m<n-1)( }& a2 Q$ B8 x" S# c8 R
   {if(*(p+i)!=0) k++;
2 L; K/ V% E' m" D, R( T  ?     if(k==q)0 N+ y+ A# y+ c
      { *(p+i)=0;# o2 O% U+ {9 G
        k=0;  ?' H! ~+ t7 a; X/ K! s7 Z5 w
        m++;7 V' j9 F4 N* a& @$ G
      }. U8 H, G2 a0 V# X. I1 C1 i- X
    i++;( D1 S/ e# o3 v
    if(i==n)i=0;9 X7 d1 D- R% j* S5 `
   }
% x6 q, i9 {2 [9 w7 W9 l  while(*p==0)p++;
" c" g" ^) M0 k; s    printf("The last one is NO:%d\n",*p);
* j) B( b- T4 [3 V  B     getch();
' i, m6 h- ^2 j0 O; ?1 A% v( U7 m6 S1 H9 n/ |% f) r7 E
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;8 p! U, R* ]6 _+ F# p/ ]
namespace 又费马达又费电4 v- e1 _1 s6 w8 Y# T2 q# J  p
{  v* P/ f1 @) O/ ]5 m
    class Program- v4 c7 C4 Z. R: p3 k  c
    {
0 `" ]7 E* {) O7 s: `! W1 B3 k* X        static void Main(string[] args)- I9 K' r1 z. I6 U  w, R" v' u
        {9 H% f; |2 b4 `; [0 P( P0 D
            int m, n;
$ |; n7 p  E0 X1 ]# y# e  e5 e            Console.WriteLine("请输入数组长度");
% ]6 x, t! K0 \& \2 M: Q3 h4 @# C            m = int.Parse(Console.ReadLine());//m为数组的大小4 Y: x8 n* W4 i. s
            Console.WriteLine("请输入要截取数字的大小");
/ k% S1 p  k$ r6 M# J            n = int.Parse(Console.ReadLine());
5 C& z, A# g5 n1 k2 _' {( J            int [] numw=new int8 H$ j6 T9 j8 r+ e4 G

7 A1 ^8 ]  _8 U) a1 D- c&shy;&shy;&shy;;. f- h! a! _: J
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
5 j# {; F: q3 |            {+ h1 s4 R! E& l; D1 _, i: s( |
                numw[j - 1] = j;
' R- Y7 \: F) g5 m            }) C1 @4 {/ R  y3 U3 B2 o; S' {
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
. d1 }. l8 Q8 t+ |3 c9 E* k            while (d != m - 1)
: h1 C* p. P  Q" N% P, ^9 U            {7 V/ F0 x1 B  F1 [; P& I, \
                if (i == m && d != m - 1)
0 \9 z+ L3 o1 _3 r* x! a. v                {
+ K" }# f; W- A# I9 Z3 x) g. e0 S9 [+ O                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
; f) L7 y. o' t" W9 z8 w                    continue;' w/ U8 E2 |" D: I. ?
                }: Z1 _4 a# x" w- D1 |
                else) I5 a0 U+ [5 d. B6 \
                {
: O+ g, ]' l* \7 z% K6 P                    if (numw[i] != 0)
( p# x: [3 L5 {3 |5 s                    {0 g5 Q9 y) }$ `2 P) w* N2 k. T
                        i++;
+ C+ K, ?1 K  y4 H1 ^+ `' H* d4 B                        k++;
% k) `( Y- O, c6 q3 C                        if (k == n)1 C/ ^8 l/ L7 q( }3 I9 y
                        {8 X9 ~7 s' G& u! |) A1 c
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了6 O9 z. i: r6 W+ u0 y8 I. I
                            k = 0;' |, H+ H& K4 R' J
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1. C( K+ g7 x0 n+ ?9 N( w  a6 E" X9 B% ]
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);/ n/ |  c  z: F# g' `
                        }
0 Y7 I. ~7 k' E: p                        else//输出暂时还没有改变数组元素的值2 A: Y/ u: Y- q  |, @- t* I
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
3 y9 H( N* `3 w                    }
( O6 g" s5 y/ r                    else8 K; y) i, S7 V! I' p! s6 t& ]
                        i++;//数组元素为0,直接跳过,不计数。。。
5 e1 n4 O0 R  c* U                }
  _% ]8 I( K. T. s, D! f  b
9 }! U9 h/ \& u2 K4 f/ d$ j
: C$ m/ Z; C2 `, ^            }//结束while循环
/ w' }- }7 P0 i! A  @6 V            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
; |0 h! v; D) P. I( v6 S4 i           9 S$ ^+ B2 e2 P- R% N8 n1 z! z
                if (numw[i] != 0)
: y, {# H3 p' i$ m/ g0 i8 P: r( Y                    Console.WriteLine(numw[i]);2 `7 S; B. d6 _2 V
           
6 [/ ?( F' I( _# m% K) ?& q: @            Console.ReadLine();  N/ X, l+ F" \5 _3 q+ X+ ~) s
        }0 {0 w: w: o& z6 D
    }
% A( d5 Q/ p2 A& d# ~}0 l5 D# `# f3 i5 `; F/ 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-2-14 08:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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