鱼C论坛

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

猴子问题

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

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

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

x
大家好!8 k: G0 [* g- u0 y1 e4 `; \- L5 c. G% U
这几天我在忙着编一个问题,我用了一种方法编出来!7 w3 T; _1 t; r" F. ~- x
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
$ {( w5 o. Y) D4 y1 m# U注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 3 H0 P/ S- _1 O7 O& I7 i# q$ o

. @; ^" v! F) _, b6 }! F' m1 p0 O  \% n$ }; S+ [; p$ z
                            题目5 c; s* D0 b$ z( U( y0 x
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。; m0 S/ B9 ?8 @
第一种方法:利用循环链表
0 g* o* o- N% Y: O- Z& s- a5 e; [#include<stdio.h>
3 z  g/ @2 D$ V" e#include<malloc.h>9 @, L$ E( O* J3 ^! l
#define M 8            //共有8只猴子
, h0 M, y/ b# }: c  Z: T6 x& {#define N 3            //数到3只时退出第三只( l- N, b/ ]$ ~, g  ~# k: s
typedef struct monkey
5 C9 z2 ]4 y) w$ A* n{int number;8 c: u: R: \8 [" P
int flag;  l  r4 P+ e& E# i7 Q0 [8 g
struct monkey* next;
, D3 j/ T# [/ Y/ V. }+ @- T}MONKEY;
, s) m- Z: A0 ^5 ^  w% i" ymain()$ q1 a" e  g# N) y9 T
{ MONKEY *head=NULL,*p,*s;! l2 {9 V) |! }
  int i,sum=0,count=0;$ v7 _# D* h4 S( O7 E0 M5 U; r! H. ]
  clrscr();              //清屏
1 w& F6 P( d* @! u  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存4 e& J. r- U3 t- Z
  p->number=1;p->flag=1;8 U( z8 ~" @9 Y6 Q, [5 ?" S& |
  p->next=head;- H4 p$ z+ K4 \5 K* I
  head=p;
" t8 k* k. d/ l5 F, G! s  for(i=2;i<=M;i++)
. g% |; n  }: _* ?2 [    { s=(MONKEY *)malloc(sizeof(MONKEY));3 \' p5 U, p/ m( V0 A5 l
     s->number=i;s->flag=1;1 ~  h/ G" X1 K5 w  V" M
     s->next=head;! |. L8 ^8 z1 x  S( w
     p->next=s;p=p->next;
2 \* i# f  ]% y7 y. F  `0 G    }
; w# P' z7 ^8 W- P) K% Q    p=head;( B! t- z0 ^9 @" J/ a0 a' J2 ^) [
   for(;;)0 S" A- q0 K& I! i- C; v
    {if(p->flag==1); h. r! K2 C- W; J6 V6 E
       count++;0 V/ O7 [$ h2 U+ u6 y4 C/ o8 `
     if(count==N). I2 s# E+ k; H
        {p->flag=0;8 V9 |5 O+ @3 I% S  o
         count=0;
6 k/ h8 I% @/ y% ?0 w; t         sum++;}
' e+ f' j4 Q5 o     if(sum==M-1)
; C. R. z, c$ a( m& f! h        break;
0 W; q- K( U& Z4 N* j     p=p->next;: P# U/ l1 G) M$ x; S: l) W
    }
+ [6 B3 k& @/ w" |- h( s2 v7 o5 |' }    p=- o' `7 \7 c" }% n5 d2 K  H
    head;
% s5 A; o* z5 v0 T5 U" P/ I( V    for(i=1;i<=M;i++)
+ X  n  ~2 ]5 K4 s; ], x    { if(p->flag==1)2 Q* J+ U0 i8 W5 n) R
        printf("\t%d",p->number);/ v" E& z  |  E3 V8 n3 S+ _% _& L
      p=p->next;; l. P3 N9 G! T" w+ x1 b; ~# n( ~
    }" u" _. g1 |; y  Z7 T

0 w1 x0 k' e4 I9 K+ h8 w( _! i- h4 P) I/ [# W

. I8 ?0 |) h0 t7 F) ~! c}
0 {" F+ d# U' Y
第二种方法:数组+ V# Z2 l: m* R( }
#include<stdio.h>$ |) a, y- M+ l$ T: {- o; B
#define M 8
7 @: `% v; S: o9 d* zstruct monkey/ D+ h: s6 J) s) ^2 L; Z/ t5 W
{int number;
( I4 Z- t9 s5 E  g) N# u$ @! Q) Vint nextp;' \" I5 a( V7 L9 A; a
}link[M+1];
9 T: g9 X0 v- E( m# g
; k( |0 S- E  d  A7 C/ m9 z) Yvoid main()7 e! U. J: R3 \  Y5 x/ O$ q% m0 ^
{int i,count,h;6 s& g# B* b* d/ w
for(i=1;i<=M;i++)
: D) A3 A' J) \: G{  if(i==M)1 |) ?" s# b( h7 ~
   link[i].nextp=1;
( S* j* @- b* T   else
+ ]# o1 k1 ~/ R) W% M; \   link[i].nextp=i+1;# s- f, u4 W, ~
  link[i].number=i;
+ s6 E3 g- Z; E1 {}  F+ C$ [7 X' |- N; w) {/ K/ a/ g. g
printf("\n");
; v1 ]9 k1 O- Q' Z0 }" _count=0;
( @3 X' R# z& S  ]# Y& W# f& Jh=M;5 k5 z& h, R) |* m/ V8 D" B. J* H
printf("依次退出的猴子: \n");
4 z/ ~$ }$ T& {" Rwhile(count<M-1)
& }. b7 A3 F& K4 E: U{i=0;
& z" H; Y; G; v, N5 m2 swhile(i!=3)
. N* y3 M1 e6 A5 e) Y2 {6 M{ h=link[h].nextp;
9 O4 a1 N$ \9 C7 |  o! e   if(link[h].number)5 b/ X/ h$ t  t  n' \
     i++;}7 k0 a; C2 y9 d0 W3 d. H

1 z/ p; Q9 P* P! `' Jprintf("%4d",link[h].number);
/ z9 V( Y3 Z7 N: P' ^link[h].number=0;' M5 G3 |6 H, ^3 V7 Z
count++;
4 o+ x6 @0 T  k2 l6 {}
1 F" p/ _) e7 I- @+ Z0 k5 C0 W2 H$ D5 f2 X: F; e
printf("\n大王是:");
8 Q3 f, G/ X9 d! f2 U9 U  for(i=1;i<=M;i++)  O7 R" m, y8 ?5 U5 E) x/ R
  if(link[i].number)
7 J9 w# ^1 ]% q) q$ S    printf("%3d\n",link[i].number);6 t. c4 J0 {% Y3 l  B( r# ]

4 N3 E# [. q8 F# M2 w5 Z/ q" _
: N9 {! f, h- T. T3 C+ R$ p}
" e" ^5 c& n# r# m8 g
第三种是普通方法for循环
, o% ~6 q' U$ Y: g8 H5 \; E1 j& B& _
#include<stdio.h>" B. e" G# g! @/ [2 x
void main()6 L/ _/ }2 X5 g
{ int i,k,m,n,num[50],q,*p;7 f  D" n) t- A+ @/ k
    clrscr();* K# f& c! \* ]
   printf("input number of person: n=");
- S9 E0 k" {% D3 B( A# j5 K    scanf("%d",&n);4 x4 O2 ~# I: {, t! k6 Z! o* E9 O7 ^- H
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只6 Y1 f& g! T) f- u3 \
    scanf("%d",&q);9 L! ~9 d! M0 ?6 }8 H$ @, X' a
   p=num;
4 Y+ M4 `$ U9 `4 f1 I  for(i=0;i<n;i++)
) c) g3 b$ j. }# T/ z( }. U8 a    *(p+i)=i+1;
# `3 S) {$ U! f; k( _+ w! a" D   i=0;
/ K6 z% j0 v- ~7 Z( Q   k=0;
. z. J2 ~- i5 n* \/ `$ Y" r   m=0;
6 b+ s  X: Z' ~  while(m<n-1)
! S) E/ _, y! L4 o% |/ ?5 l5 J   {if(*(p+i)!=0) k++;
" Y0 b' j: X) ]' s) y& E1 H     if(k==q)/ C; H3 S) P! H' f. H2 C" m
      { *(p+i)=0;
$ c! O5 r- n' n3 `. m; V        k=0;
) Q" U# B/ ^9 q( f& A        m++;' w2 {# Y( Q: y2 u/ u* h7 ?) v
      }2 h( H! S, G" ]; H
    i++;: ?; }: y$ F, c5 n, m1 _+ P; @
    if(i==n)i=0;
4 Y* ?! K9 n/ c9 E# k   }* m/ x/ T3 C# e, a0 z
  while(*p==0)p++;
" ~& b/ q; i/ ~, x8 y2 X8 S    printf("The last one is NO:%d\n",*p);
- g, m' G! E$ Z% k# N/ i' Q     getch();
# s( ]3 ~" ]2 V
+ n8 Q* Q! L6 r0 C0 ?1 `}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;) L" r% n2 v  A0 Y% ?
namespace 又费马达又费电4 J7 W5 O# S' s( F
{
; R8 }. D5 v) v( _, R% M" i( l    class Program
4 z6 E6 ]0 ?, ]! K    {0 ~5 `. J) o/ @6 g5 G% o$ p
        static void Main(string[] args)! U4 }, i; t" s
        {
$ i9 y, @" ?- U6 L9 N            int m, n;1 y& b8 Z2 s6 C  c% I9 T
            Console.WriteLine("请输入数组长度");2 \0 c4 q' q4 Z; ^1 W) U
            m = int.Parse(Console.ReadLine());//m为数组的大小
2 G9 T  f  b, D. |0 }$ O1 d            Console.WriteLine("请输入要截取数字的大小");
6 r" U8 A7 N9 u: z" V            n = int.Parse(Console.ReadLine());
2 x& x+ B4 h7 G5 t* T& ^            int [] numw=new int; J& i3 S9 V6 Z7 l1 c9 L- d
- h- W; |0 u8 C0 K
&shy;&shy;&shy;;
' j# {1 K. u* i; _3 `( f+ Q- ]            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数1 X" l6 q( {4 \( i* E9 p4 {- \
            {
" T% q1 b# w; }" g9 a* G                numw[j - 1] = j;2 |  W& r  b7 E. r* K8 r
            }, @9 v# [0 i; Y% C2 L
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
# V! t! l; [6 z  d            while (d != m - 1)
4 C# @- Q" @, `) x4 W            {
5 X: w, v5 x7 {* _" x( {* P                if (i == m && d != m - 1)# {1 Y. {6 Z0 M/ K
                {0 m- V9 Q) @4 s$ O5 t, i6 ^" v
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!" p! o, C3 D* t! u; a
                    continue;" k' b8 N, _* z6 Z* O, @
                }
! b2 P- P( `3 x- J0 T# |                else
9 c, Q# A& n: O! x" M. ?! L- w                {; U, S0 c4 W8 R9 W2 p
                    if (numw[i] != 0)) \- S$ |" t7 C) f' L
                    {
; m4 ]) W; E4 a1 i8 e; t" g" @' I                        i++;6 a" `) G/ y. c% X2 k- G+ }! N
                        k++;4 N; ?7 g, _$ g* [" i- _$ m
                        if (k == n)+ E+ V1 G' H6 P6 G
                        {
% j! J" a! |  U# Z2 t                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
6 B3 s- F/ V) T/ Z3 j                            k = 0;
* ^# w' J9 V2 v6 q5 U" g              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
4 B2 J* h% M( N9 y3 X2 K' s                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
, r; G; F# A6 Z* H- e& U                        }# a+ o/ N8 E0 D4 G6 t4 H
                        else//输出暂时还没有改变数组元素的值
, ~- D- b$ x- m/ _4 h# f! P                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
6 f7 q$ |: `0 S2 y4 {/ Q                    }' N5 b: j2 E2 o& M* U
                    else
  o3 _9 u% X& |6 _6 r* Q& b4 h2 e0 R                        i++;//数组元素为0,直接跳过,不计数。。。( ^6 t* b# u  y4 z1 P3 d0 \9 U5 K
                }6 D( b: H; l9 V( z3 H/ c

8 _1 A2 h! J7 Z, k% A/ E( k* y" ]
            }//结束while循环7 T) m' d5 F3 U  T1 y" h9 h1 {
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
; [+ O: O# U. H+ J( Z# D: w" ~           ! p) y6 E: J" B; r' ~5 E
                if (numw[i] != 0)
: E- n9 J" p' _                    Console.WriteLine(numw[i]);7 n0 e4 w5 i0 V4 G
           
; N! v$ O! K% w. F$ s5 @            Console.ReadLine();8 w) ?6 ?0 V# [
        }* `! I5 M* ~( `; ?5 V1 h$ s
    }
. t) }1 D3 U4 B) v0 v) ~. s}
2 P; s: q$ i7 p/ m
小甲鱼最新课程 -> 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-7-7 13:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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