鱼C论坛

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

猴子问题

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

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

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

x
大家好!
+ o2 n6 ~3 t2 w  Y7 o这几天我在忙着编一个问题,我用了一种方法编出来!( k; _5 d$ P* l5 @' n! G, q
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
! B2 m# v9 K3 f" G1 p/ Y注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 " E" K3 Y6 ^; I! D. Z+ R
! e1 u6 }2 k0 m+ A: I) ]
; s9 D: o7 r: F0 [1 e
                            题目' l3 o0 ^3 E* A# z4 l$ v' e
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。, l$ d% L5 ], V; C, N1 {& ?8 K
第一种方法:利用循环链表* B3 W  a8 o1 j
#include<stdio.h>
6 x$ z$ ~' }9 }. t5 Y" o#include<malloc.h>
. D/ h! q  n, T; G; O( d#define M 8            //共有8只猴子
% i) U/ n3 l; E' s#define N 3            //数到3只时退出第三只2 ~: t* y' ?) V9 y1 R4 _+ g4 c
typedef struct monkey8 Q* g  z6 W- [) B/ f1 b: L# \2 H
{int number;
9 h- ]+ c; {( k; J% r5 kint flag;, @3 J  U3 Q, L2 M" G8 T$ p8 G
struct monkey* next;
  I8 f, U4 Y- V' a}MONKEY;
2 b" K- @1 O  m% amain()$ D1 G) i+ d! x# ?! U3 ]% Y$ p' ]
{ MONKEY *head=NULL,*p,*s;- c( G) ~5 P* v% z2 A! p
  int i,sum=0,count=0;0 N5 M9 V, d7 O2 }: [
  clrscr();              //清屏
. S; @- z+ R1 D' G" K  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
0 O0 [1 \: h+ N" X. R) W/ K& _  p->number=1;p->flag=1;5 u5 g+ f* U7 X
  p->next=head;  l0 s( Z, m* m5 @- C# g) c
  head=p;
+ ^' U' K1 U- ?7 b0 p8 H: K  for(i=2;i<=M;i++)
! z4 ~7 E4 e) `% L! v7 U$ d    { s=(MONKEY *)malloc(sizeof(MONKEY));
; X) i5 r1 h% n/ D5 c# K' h7 A7 }7 a" M/ }( C     s->number=i;s->flag=1;
4 w; h$ ]5 n6 `, w     s->next=head;( \, I8 M* w1 m
     p->next=s;p=p->next;
4 @4 h2 O. W/ W  V  x* z0 h    }! F- u5 \  j' }! e' h
    p=head;
0 f: ^6 t; ?" D   for(;;), i+ l' @8 Y, D0 z* o5 Y
    {if(p->flag==1)6 Y$ }+ x* M3 m; H( D+ g! B
       count++;7 f; ~6 i! V' I+ |
     if(count==N)  F* @5 C$ x1 r
        {p->flag=0;
* G" T- ^0 e( r; n: s, A         count=0;
3 i" A3 e; i+ V         sum++;}
  P7 N! y( S# @- C! H     if(sum==M-1); {$ a# ]* ~! K' f( r6 J
        break;
( U4 ?5 f" W! `0 f     p=p->next;
" v5 L" G. J3 F, Y) q1 W% p" W    }+ O9 O6 T( l7 }9 o. J# f( e
    p=
# r0 N) h; L' T7 x9 \, r" z    head;
9 \2 h& K4 u) `% G( a    for(i=1;i<=M;i++)
2 N# p  X6 B* V3 P/ U* j    { if(p->flag==1). E+ c3 y6 g$ B( x) X
        printf("\t%d",p->number);: Z9 ^7 |$ E% [; A0 Z6 m
      p=p->next;$ K4 f' a9 n7 W% Y  e4 G
    }) d; r2 p. K! O5 z9 g

1 j0 `; r: `1 l
  S: J! h6 M, p' G6 Z0 T8 d5 i" x1 b% }- }  c
}

* C1 G7 V3 s& ~. l! h( K第二种方法:数组
! d+ t" Q6 o7 U( `#include<stdio.h>$ \5 }/ S9 a6 l0 e9 U
#define M 8
7 l" H: g' O2 K8 Dstruct monkey
! V0 q4 j% ~0 ^{int number;
- ^8 p" A; N( X* B: I8 Wint nextp;
$ R* W& R$ O- O) j, {4 Y, |. V}link[M+1];
8 B7 s; k  a' Y/ y, i% g9 f0 q/ {4 _% f% ^8 k6 r/ K
void main()5 t$ f- [5 w2 m
{int i,count,h;, g5 Z$ w3 w# u
for(i=1;i<=M;i++)
* _3 s, |' w. C8 Y% }{  if(i==M)
# o# b3 p1 i0 q   link[i].nextp=1;- g2 j  b7 l3 @
   else9 t3 a4 C; g9 k
   link[i].nextp=i+1;3 J: P+ k' T/ N9 ^# J
  link[i].number=i;
! I: {2 h/ m# w$ U}+ s# R, l( D4 A  Y4 N/ {
printf("\n");3 v! F$ T7 n% I9 `( S* A
count=0;6 e9 E1 v  F  N2 M+ n/ G$ d
h=M;
2 k5 ^6 X, y4 v+ Pprintf("依次退出的猴子: \n");
& \; D6 y+ k: Q( awhile(count<M-1)! W" z+ d# i3 c: G" M6 K
{i=0;
; Z' r3 v) K8 w% u" ?: b- nwhile(i!=3)! ?7 d& Q' o6 s( s+ J2 G2 B- ?
{ h=link[h].nextp;7 W' S- ?! K1 q; y& _
   if(link[h].number)
& K8 R1 q" H2 I: Q4 G* o     i++;}
( K9 B7 M- A4 ^8 S* g# }, \" \: u4 ^$ g* x
printf("%4d",link[h].number);& |" \$ M' S3 U8 }+ H3 C
link[h].number=0;" @. J0 e  x2 M% T7 @! L! |
count++;
) E; i" l; I7 z5 N* f2 j, E  K( m" H}4 t& [0 v( R" E
+ ^# A) p0 }. x/ M, ^% K
printf("\n大王是:");! G- I8 m& |- e) c
  for(i=1;i<=M;i++)7 y% V( {- t, {2 R
  if(link[i].number)
2 K+ U0 ^. \  r9 ]0 j8 v, s3 `2 \- H    printf("%3d\n",link[i].number);
% W" i# k/ D) f5 S- L0 J; u: C! Y6 ?
& Z* g' w) }+ ^) Z6 Y! G; Q. x. v' K) S
}

+ n8 L+ Z; o) X% V第三种是普通方法for循环

7 t  R* V5 l) C1 Z#include<stdio.h>
! g# H! h% @; {void main()4 W# N! \0 k2 b
{ int i,k,m,n,num[50],q,*p;% Y! k6 t7 \* n) ^. F3 i
    clrscr();; d( u- D6 j/ T( {& D
   printf("input number of person: n=");  y8 [+ \6 B& N; B8 f
    scanf("%d",&n);% ^  C- h: |+ v8 g
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只; R5 t# \# m' f  w9 F
    scanf("%d",&q);# A* S& a2 u- {) G/ [- J2 e. C3 ?
   p=num;
! o* ]9 x: u' U% V  for(i=0;i<n;i++)
& E" d# `# x* t: k    *(p+i)=i+1;
- C& U+ q$ u. ~! u  Y6 K   i=0;  v7 Z+ }/ j8 j! p! Z+ b7 j7 [( R
   k=0;4 E7 w* C1 |( }& \' J+ x( ~
   m=0;
, D9 J2 y1 }  U  A3 ?  while(m<n-1)5 S8 Q6 e2 c" ^5 C
   {if(*(p+i)!=0) k++;
# J; B5 Z' N4 J+ w# L) e     if(k==q)
2 [& V0 T' L. O' N! B      { *(p+i)=0;
3 Y# n8 R: _" q/ w0 E. A) {' |# E        k=0;* H" N6 _( ^6 M: l
        m++;1 p7 \. s" Y# w' e
      }/ T1 ?1 Z' J; c2 p
    i++;: J' p6 X8 c. U- u
    if(i==n)i=0;
: H1 z; u6 o- b1 U   }/ j" J! _6 O7 j9 w. `! ?
  while(*p==0)p++;8 N. p: F) U9 i# D
    printf("The last one is NO:%d\n",*p);
* y! |6 }& r# N     getch();
0 ?5 T/ u7 H* U& Q
: S/ s9 t( E& w9 D}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
. L- f3 k8 {* y1 _' A% znamespace 又费马达又费电  _% _0 r2 K* h4 }
{
# ~/ e; F: `! J/ J. ~& ?    class Program
& s! Y5 o# G9 s1 \% {: Q5 u' b7 x# s. q    {
: N3 N. j2 Q2 ?4 N& ^4 |+ ~        static void Main(string[] args)
# ^3 W  }) K$ U8 G0 X        {% g7 \' P, f9 [! k
            int m, n;6 J. O2 U! V% J- T
            Console.WriteLine("请输入数组长度");( e* \# M! r: B+ b# i/ ?+ |
            m = int.Parse(Console.ReadLine());//m为数组的大小! `  {- _0 x9 w- v- h; r
            Console.WriteLine("请输入要截取数字的大小");7 q5 `7 p; W" G1 z* j' P! |
            n = int.Parse(Console.ReadLine());: w# g+ ?1 j" Q$ X
            int [] numw=new int! p: D6 B' x3 `: L' }
& U2 A& d; e% I- |5 S) t
&shy;&shy;&shy;;
6 I  s$ m: {. i            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数6 V, N* }; L* F1 H1 Y
            {
! n/ F# Y5 ~" Q. t                numw[j - 1] = j;4 k; O6 N: m. p+ x9 p6 V
            }8 X4 j0 m! i8 z
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!1 d* J) S: D' r, O' Y* }/ u, i- C
            while (d != m - 1)0 q) k( b% k9 A( I  v: F0 v4 s
            {
4 S) S# c# V+ ^                if (i == m && d != m - 1)8 \! P4 r8 N/ G# _6 p, n
                {4 D+ h8 ]9 T  `5 |8 [7 V
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
8 N8 L4 ^) J3 j6 D7 O- T( [                    continue;( d0 t4 l, V1 D* ]8 V
                }7 A  ?( f+ \' B! A* \! [+ U
                else
4 }: K2 [/ }. S4 Z8 e6 i5 [0 J- j                {# {8 `% c/ c) y+ M( J( T
                    if (numw[i] != 0)
- p% N5 |9 K" Q. I5 V$ C8 y% k* T                    {( r; k" ~9 P6 y5 N  f( U. }. E
                        i++;% n9 J! M+ }6 ~# v9 V
                        k++;
- X8 }, K# @6 Y" }7 @2 T& {/ c                        if (k == n)' k- o) }3 I1 T  z9 U; @) a
                        {
* f5 k+ n4 ^! ^: H3 L                            numw[i - 1] = 0;//把在n位置数组元素的值改变了% A$ i( p% d0 m2 G' ]
                            k = 0;7 u) R/ |" J% S; E# Z. g
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1. s' s- O1 z9 q8 c3 d: x
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);, `# Y" y) ]: q" L8 o
                        }
) f2 ^$ S9 [( b2 R% n                        else//输出暂时还没有改变数组元素的值! G/ @$ L$ A9 W, u
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);; U$ x4 r5 v- q% r2 D0 ^
                    }# U' Z+ u/ E7 h: X1 x
                    else' X7 U  c& O% v
                        i++;//数组元素为0,直接跳过,不计数。。。
4 A) R/ j! g9 j* r- {" V. h1 d, s                }
2 Z: ]3 V" B9 j1 X3 I/ C/ ?3 {- s
0 ]# A, t0 D5 C# }) A
( P' D2 x5 h' T2 E  g1 a, \' X            }//结束while循环
" Y1 a% @  B+ `" F- u) j            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦% _& W6 p7 o6 [; S- C, y
           
1 B# b) O6 P4 I( }$ `                if (numw[i] != 0)/ A; T7 R: ^4 G" o
                    Console.WriteLine(numw[i]);- C  h# j$ P4 M5 \
           ( {. ~0 c" E8 L# L1 z
            Console.ReadLine();9 _! T+ b- q- I. s% M+ z- B' P
        }
; J, z( @: S4 d/ E1 Q, \5 q" b    }# W$ w+ _7 d, A0 m& t
}
/ H# O. E; S: |( D+ e8 ^2 r: ^9 I+ J
小甲鱼最新课程 -> 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, 2025-5-21 21:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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