鱼C论坛

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

猴子问题

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

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

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

x
大家好!' ?8 t( [4 _3 }
这几天我在忙着编一个问题,我用了一种方法编出来!1 H2 |$ ~$ U, v
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
- l. F: I* f1 R! N  V$ @! p5 r注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
+ G2 g7 D1 g5 U3 j+ i# R: {# ~
: o& e2 t$ y% z# L0 H( d
, b2 K- H7 N, o, F: x+ q
                            题目
$ m" a1 ]" n3 Y# v山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。0 V& F9 Z2 K, ~% ?
第一种方法:利用循环链表( o- b- V4 v' Z* h$ `
#include<stdio.h>7 e+ i4 u# f% i6 ]7 D
#include<malloc.h>+ W/ j  `% Q2 C1 T4 l. N5 K
#define M 8            //共有8只猴子
: T2 q9 }7 U# j#define N 3            //数到3只时退出第三只
6 `) L# n6 c# n  |typedef struct monkey
/ `: h" [- R$ \2 ^{int number;
+ R, Y" \9 E/ ]7 d! J6 L" Wint flag;" A0 M$ }% I4 i' e( P
struct monkey* next;
7 Y5 r2 A6 Q% n# A6 d+ }}MONKEY;5 ^$ S+ r6 f1 K2 b* S) l
main()
( q' T! K) p( v. \- ~& l{ MONKEY *head=NULL,*p,*s;  K) J2 E- K7 R# `2 c% E
  int i,sum=0,count=0;
1 x5 w( L% l! _  clrscr();              //清屏
; e( n. v* w" d/ G  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
% F- X* ]# u2 d" [* y5 M$ u  p->number=1;p->flag=1;0 i) J1 E& ~  j% U. l$ i& N
  p->next=head;
& h7 T7 x( j8 N8 m) Q3 L2 o  head=p;! O( K9 I2 X5 h* M3 Z
  for(i=2;i<=M;i++)
. _9 w6 R$ k" V; j0 G2 P    { s=(MONKEY *)malloc(sizeof(MONKEY));
: ]" }# i( D6 V. w     s->number=i;s->flag=1;
4 l5 a% l& @8 S. ]2 S! s     s->next=head;
" E$ p# [* s( n, K% B/ S2 h     p->next=s;p=p->next;  T) s2 \) y( ?( v
    }) ?& }, u3 o8 k1 ?  ]  l
    p=head;1 m$ N2 H) I7 p4 l- F, R
   for(;;)
! j9 p( o2 ]# a2 N    {if(p->flag==1)
/ `. ]* Q5 h- w" K# u, \       count++;* E3 Y0 t% _: x- g' f# D
     if(count==N)2 S( Z7 A$ n, c, p0 M
        {p->flag=0;
& N4 n0 ]$ Y9 Q" E/ x$ z         count=0;! y! h: G9 h* y5 k  c
         sum++;}4 |/ ^9 Z& i# Y- L+ w2 ^8 p! }% Q/ c$ ]
     if(sum==M-1): j6 z) A2 h' ^0 w: K; h" M
        break;; M, q. A+ z* q/ u
     p=p->next;
) c  B9 F, t3 |    }
  O6 f3 a7 b2 b5 _) [6 s! h) m+ r- J8 P    p=+ |1 }6 g7 D% E
    head;
; w- J$ b. {" u' ]4 v5 s    for(i=1;i<=M;i++)3 O; w: f5 |4 L3 O( R# u0 R' Z
    { if(p->flag==1)4 o" T  K/ {5 s+ r+ r
        printf("\t%d",p->number);0 L: d, t* i; ?3 q
      p=p->next;/ ?! }2 e$ b4 G  v
    }& t  D5 M8 G# b+ ^
3 r' m" r# ?) U6 O

* _, D& g% D, \6 @2 s. V6 @, g$ Q5 \3 X( l% ?1 b; @
}

/ B) F" b. v* x第二种方法:数组
6 ^5 G, X$ A/ A3 H#include<stdio.h>
. H  a* z9 `- J, Q/ H4 ?* _# J#define M 8' P. _5 u" g1 p$ B0 k& Y
struct monkey5 a' ?4 O3 M& R9 O; f
{int number;" Z8 Z% N6 M( k4 S$ D
int nextp;
; h4 M4 w3 t6 n! J}link[M+1];3 |7 T  j0 M! l! W' A( D, s
) v4 z) u, d9 i: f5 b$ T  W
void main(). |" B3 _3 d/ c! \4 o6 s
{int i,count,h;
9 `) a- h5 Z* z- [" Mfor(i=1;i<=M;i++)8 o2 F9 m9 p* L& B) s  m9 t; n
{  if(i==M)
! ?* T) |. ]6 P: }9 Y# s, J   link[i].nextp=1;
- ]! U( S3 ^% {$ Q   else
% b: `3 [3 a, U9 H% I' q* i  q   link[i].nextp=i+1;2 `6 P5 \& J$ U3 w0 j" S3 G
  link[i].number=i;+ g9 i: \7 J% i- d6 z. l
}
( m9 b: q# v& vprintf("\n");. ~+ e1 f6 W* s4 C+ Y9 ?# R
count=0;
; k/ s1 i2 o/ Bh=M;
% @1 ?  @  l2 K) b  V; tprintf("依次退出的猴子: \n");
( ?. H- C9 w2 y( c' N& _+ |while(count<M-1)  w0 V1 Q8 ~6 ^) M$ A- b( `
{i=0;9 S& B4 k% L" p
while(i!=3)
, C+ c' y: m. u{ h=link[h].nextp;
5 n  x( _. s. {6 M) b   if(link[h].number)
. X3 U1 z2 i( l3 G3 `* Y     i++;}
2 ]/ y/ u: X$ Z6 ^5 r1 E+ R) ?: M) }) ]$ a' j  e& j
printf("%4d",link[h].number);- k4 G9 m- U; U+ f
link[h].number=0;$ y, W4 [' Z& J: E8 s  W
count++;* r. l6 q. x5 R4 x$ d; m
}
4 X3 N# e% B% F# A
) q8 r0 P6 B$ c- M3 |printf("\n大王是:");1 f& _  {9 W$ k& A
  for(i=1;i<=M;i++)
; y/ \, E6 ?8 ]: R5 }  if(link[i].number)0 r- F- W* w. Y- m" N
    printf("%3d\n",link[i].number);+ ?$ r! }) d2 o4 }0 j! s

/ f$ A  x- C" u5 L+ D! o9 K3 L" f2 E: X8 _$ L, V) C: _9 [
}

! ?* j# i7 G! W第三种是普通方法for循环
) i% L3 R2 Y: f! `" v
#include<stdio.h>7 z2 Q1 [- M6 _, L
void main()* l8 f1 C  b* V! h" v
{ int i,k,m,n,num[50],q,*p;& T7 b) e( {5 c8 N% A* c
    clrscr();
1 i: t! u- k- _3 L( B   printf("input number of person: n=");$ [& `! K3 c7 m& g# M6 ]* }6 X
    scanf("%d",&n);
) S. l) l! s% S# Kprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只# x& e6 O" J1 f$ ]4 v
    scanf("%d",&q);; G8 }; j# ^& k$ m# C! t
   p=num;6 I0 X, \$ ]4 L& J7 {
  for(i=0;i<n;i++)* E; a) G4 C8 z) F% O
    *(p+i)=i+1;
  x' p( h1 ^. `/ ~0 D0 d   i=0;6 o+ {9 P" l  o& z
   k=0;- ^. ~4 v# }) A# [% I7 L) R, o1 c
   m=0;$ n" a6 i2 b" L' a, b
  while(m<n-1)
& V0 ^1 h+ r) X+ f4 }/ n   {if(*(p+i)!=0) k++;
# ~+ y1 r0 z$ T     if(k==q)
# z3 ]% f8 J2 U9 Y7 {0 I3 l6 ~7 x. Q& ~      { *(p+i)=0;0 \4 L+ ?& G& W+ v2 P0 p! X7 |6 \. {1 z
        k=0;
& B* y" T: p, ~+ p        m++;+ q) V% n" p$ K" {( t& t( V2 s
      }4 o. t: X/ j) G4 ^! U8 Q
    i++;
; f# [( N# f( \9 Y8 s6 [    if(i==n)i=0;
- {$ @; g6 ~# d& k   }- z' c/ E- F$ Q: F" U5 y
  while(*p==0)p++;% W( N4 q; v) P: r% A* d4 c5 S
    printf("The last one is NO:%d\n",*p);0 ]; k4 a0 _! }9 T% }
     getch();4 x3 L) N. ]% `+ {' d

% @& j7 \6 _  @% \}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;3 i8 l9 ]! U' D
namespace 又费马达又费电. C& {( ^5 }4 @/ X* f5 Q6 `% b
{
1 I" _; F7 p9 @2 H8 `    class Program! P# ]* k& h( q& i
    {/ E9 g  n6 {! Z
        static void Main(string[] args)
. W+ z" y5 r( b( Z0 r- l- R        {
/ x( Q3 W# I8 q2 o: ~, b            int m, n;# a( |7 e1 u7 J4 a8 @, \
            Console.WriteLine("请输入数组长度");
" ]4 F/ [; f7 r% u& m            m = int.Parse(Console.ReadLine());//m为数组的大小
# [0 [' n; e$ U4 {2 l            Console.WriteLine("请输入要截取数字的大小");; E& ~7 H4 P2 X! @3 S" x
            n = int.Parse(Console.ReadLine());5 X1 |, B' \) A: Z* W7 H( n* [
            int [] numw=new int
" k. Q0 J* w3 O; {" }5 v8 B, E1 }; Z/ L' `& z
&shy;&shy;&shy;;. @+ Z$ ^* g/ `* W& m$ a2 _
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
) l6 _# V7 n6 E/ W! m9 ?6 h$ m3 ?            {* i, X7 A6 {$ [1 C! M; N( C& _" m
                numw[j - 1] = j;  Y5 e, d/ H5 g$ S8 [
            }
" L; u( s1 T; u2 _1 G& q            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
: }2 U4 i# |. j2 i! g            while (d != m - 1)
5 A7 j/ `& O( O. ~            {
9 O: c1 M$ H7 R+ ?- M  V- g2 n                if (i == m && d != m - 1)* x& c$ u6 u3 U5 g, C) @# [
                {, C0 P( R  G6 f4 t8 ~5 _! L
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!7 r0 A; H2 a4 V  q3 I) K, K+ C7 ^
                    continue;) E9 V6 W" |7 t
                }2 S, C  \) e. z  q
                else' w  H6 H# h1 S  X$ u, Z
                {
# t2 M/ a, G5 \: A  s                    if (numw[i] != 0)
  v. Q4 u$ O6 E; z  o5 j3 }, D+ a                    {4 J( V' x. I  C* B$ D8 n8 T! R
                        i++;
' E  _; }2 C& f9 ]: C                        k++;; ^' K+ }- c9 Z
                        if (k == n)
  A: w* v# j/ ^                        {
' r1 `, a7 e* s" R                            numw[i - 1] = 0;//把在n位置数组元素的值改变了: l$ u( D& C* a' K- z5 t; F7 S% D
                            k = 0;
" G# E5 E' W6 e' I              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小10 P) a( {4 @' p& N" ~8 _
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; ~6 f8 W9 r0 k* k                        }
# r& a7 G! E/ L" F0 Z$ y; l, Q                        else//输出暂时还没有改变数组元素的值
4 B& K! V0 ~6 U) J7 O& g                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
* H6 F/ T: T- A/ s0 w                    }
; T" j0 o: c. y0 N$ n2 [+ |                    else: Z0 Z+ g9 e0 R. W3 k- S
                        i++;//数组元素为0,直接跳过,不计数。。。. t, x& k7 L$ z9 o8 Z
                }
% C, R1 G; N& [  U/ `6 ~
# e# {/ a! U! A" b8 Z' U6 ?1 N) b& r) i& e5 E+ V. {) N6 D, L3 D
            }//结束while循环
0 V4 P7 r5 Q$ d            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦* W+ P1 W# O+ |3 p" U+ Y' w3 g
           
! Z0 l$ f* B: s" d3 U; g1 l) G- K                if (numw[i] != 0)+ I1 i+ m/ h8 e  L  g+ }
                    Console.WriteLine(numw[i]);
" w, E" P* _* F, T           
8 [& |$ w  {9 b2 ]) q8 M; G" Z            Console.ReadLine();
; X1 o) u! S' _7 n: p        }' o# t+ t$ O8 B8 G+ T( O
    }
9 y* w! z6 E9 P4 K* }}
. N$ \/ 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-3-30 08:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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