鱼C论坛

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

猴子问题

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

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

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

x
大家好!0 \. i, Z8 X2 j' r3 S
这几天我在忙着编一个问题,我用了一种方法编出来!
1 r$ k% f) o5 F1 ^但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!$ p6 @' K6 x% U0 r2 g# O! N
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
, ]3 T0 Y4 G7 n0 u0 }9 B  G5 D- d8 ~: u3 {& c3 D
# c3 A7 G1 F* |3 l8 a: f& Q3 B
                            题目. C+ G$ v+ X/ l% b! f) g) u
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
4 w. u7 e5 y1 |, b第一种方法:利用循环链表+ b* C8 ^3 H5 v& [7 m
#include<stdio.h>
' Z  Z/ p, e8 i4 ^3 `! p+ j#include<malloc.h>
7 x3 B' F7 l1 X' Y' M+ a6 `0 ]#define M 8            //共有8只猴子8 Q. X4 X+ F. A9 M( H1 O) P
#define N 3            //数到3只时退出第三只
8 q, s$ j; Z! x* J2 @typedef struct monkey
. P8 f/ m1 x" o7 M1 V{int number;0 P: r) ]& u; z/ @# W
int flag;: |% C6 D7 k( ]
struct monkey* next;' ~0 ~- H) a; V8 g. g8 j5 M; W
}MONKEY;
( q  }  a/ x/ e, `) `main()
" W. {) \8 ~6 O, Q8 T{ MONKEY *head=NULL,*p,*s;
7 X! y' U8 C" u  int i,sum=0,count=0;1 W  U+ [1 O+ E4 o( E+ s! r
  clrscr();              //清屏* j- M  f0 {* n( O& l# c& R# I
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
( o# H7 I0 H- |$ B2 a  p->number=1;p->flag=1;# y) L0 n2 y9 p1 [% u7 H
  p->next=head;
9 W5 G  k& m$ g: O5 x  head=p;
/ P6 X) w4 _' m% y4 U8 N1 ]" j  for(i=2;i<=M;i++)
* `' s% O$ q& g% a7 t8 c    { s=(MONKEY *)malloc(sizeof(MONKEY));
+ ?+ @0 Q0 U* u3 Y9 j) K     s->number=i;s->flag=1;
9 T! Y3 P! }% N! q" ?! P5 [5 l     s->next=head;
, C5 a% N2 X/ J0 i& C) n) y& U     p->next=s;p=p->next;0 C: A( b; A& {
    }
; V8 B" z" @; y& C. K    p=head;/ h; t3 }: }6 P
   for(;;)
* |3 _- q7 [# A" R2 I4 C# _    {if(p->flag==1)
% L! z8 y( L  ^% G% t* _       count++;
5 f4 d* T" T1 j: H     if(count==N)
9 P5 S. q$ m" Q. |/ G        {p->flag=0;
2 t6 f4 S) F: M' n, ~) W3 ]  |         count=0;
, Q0 I4 B+ x4 y2 ^- }8 d* L: l, L         sum++;}
0 R4 [7 k0 Z! W6 Q     if(sum==M-1)
4 e4 n( Q' {+ `$ N' |        break;
2 U+ O7 D/ Q3 E6 G3 O     p=p->next;
3 g. v9 f$ j' X. K+ ^    }
* s9 w9 V( S: H9 e6 H9 J5 K    p=: I  y" G5 z2 I/ [
    head;7 r0 w4 x8 t* c
    for(i=1;i<=M;i++); v2 A- G8 K* j9 l1 Q: H( u2 c
    { if(p->flag==1)! P  t& l1 u. O# |) `/ V
        printf("\t%d",p->number);
. \) ^6 B  k+ z7 @7 V5 f      p=p->next;2 H/ _5 a" P$ v& m
    }4 g2 ]+ p" a/ G* W

  d+ e0 D' j. k( f) U+ W) {  D  Y, |1 P( v6 s5 H
( w- V. \+ I1 ~% p
}

8 U1 l# u4 v2 w: @9 t& {6 Q; D0 ?% d% a! \第二种方法:数组
) o1 x/ ?% n/ V8 [: ]#include<stdio.h>, z, T* X1 F! \  U) Y
#define M 8
7 n# U% v5 ?& i! o7 {7 zstruct monkey7 i$ _: Z5 e7 q2 i
{int number;2 a! t3 ?* s; i' R
int nextp;
+ E3 E7 y- M- ?) _7 d  F9 |$ `}link[M+1];) R7 m" x6 f3 K5 R$ m1 d- s
3 q6 b! m  }, P3 l7 E- `: S
void main()- w% I2 y6 ^. p! j
{int i,count,h;2 n- A/ U6 e6 [, i( D
for(i=1;i<=M;i++)5 E1 U! M5 F- B  A" v$ E
{  if(i==M)
0 |% X, s6 X- o' n' A   link[i].nextp=1;: y: R& v9 e$ r, R  Q
   else
: e! p5 j7 W3 v, _   link[i].nextp=i+1;0 L- {3 f* ^! I# ]4 ?
  link[i].number=i;
- }. S+ d; @% B7 q- Q, z}
+ U" T% [+ |% q. Nprintf("\n");
/ I$ g9 e9 a: F2 O  e  y% }count=0;) A0 c* Y# E$ l$ c7 u  Y& [* d+ Q, o
h=M;9 M4 n4 P. l, W9 ]7 K: i5 Z
printf("依次退出的猴子: \n");2 F7 |% [0 n( O( H0 s
while(count<M-1)5 h7 T. S& y" B& [! C
{i=0;) O) u9 ^3 ~. n7 n4 i# ~
while(i!=3)4 K" ?" {$ i% u1 E
{ h=link[h].nextp;
2 N! B6 g5 z  D3 `2 z4 N) X   if(link[h].number)& I7 i3 n5 x! Z/ Z, \
     i++;}  Y$ s- d' I6 G3 c$ M

  S3 Z0 F5 S- C: \0 o9 wprintf("%4d",link[h].number);
0 d( m) P% Q, X1 Q* Ylink[h].number=0;  K/ H% U) J0 K; c
count++;4 [- i) l9 s8 _- v0 O" Z
}3 a2 t! g0 F' _( x1 ~' ^
( R2 X' O9 N! a6 ^1 l
printf("\n大王是:");" H/ p% {# t- X9 M" p3 q5 G" \; e
  for(i=1;i<=M;i++)
5 _3 w9 X- H8 |" }8 b9 k" ^$ K" h+ V  if(link[i].number)
/ A' D; Y3 g6 g/ f5 z1 m    printf("%3d\n",link[i].number);
0 v( R( Z' N- X6 v) E  b9 X0 I. ~4 x1 \/ v/ _
( F0 ~( f' {$ X+ q9 @) l/ H* }$ f
}
2 V8 g! e. {- |# M- Z* L
第三种是普通方法for循环
" E6 I. c7 f# H/ o1 H; z
#include<stdio.h>
' F/ q8 n! E% h! ]void main()
8 a2 f: @& K, k) Q# {- x7 ?{ int i,k,m,n,num[50],q,*p;: d9 ]4 u( Z& T
    clrscr();3 I$ l+ `$ Z/ ^* R0 G6 N( ]
   printf("input number of person: n=");
! y! ~3 P' [3 v, f" V  n3 A$ w    scanf("%d",&n);
6 z. X2 D1 m. G+ Fprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
" e8 Q4 K7 u# x" Q/ \    scanf("%d",&q);2 L( g6 ]  i# P6 H. I5 k
   p=num;7 z- e9 {) L) j) H4 b
  for(i=0;i<n;i++)
1 ~  m" U$ Y# x( L' I    *(p+i)=i+1;
2 L5 }/ T( l2 x) G: g4 }* l   i=0;
0 ^4 a0 i- Z1 z/ J% k- [- y# Q   k=0;2 i7 F5 E  a& E; E
   m=0;8 T0 Q8 t; N/ H3 m; P
  while(m<n-1)
6 O2 K: q5 C# w; [$ _1 m7 }8 X   {if(*(p+i)!=0) k++;
* F/ D1 Y, W' b( b     if(k==q)+ ]* B7 r6 M9 w3 O( U: s: C2 P
      { *(p+i)=0;
* U: A: V  q  y' o9 x) O        k=0;
5 M: Y( q- ~* @        m++;! e3 C% a' s1 K+ P& d
      }' ^( y) V1 D* C& T% j8 {& M
    i++;
$ j  u$ P; X% G# d    if(i==n)i=0;
  G! I' b( ^* S) M  p8 V   }
9 p# F7 O1 q# i  while(*p==0)p++;$ K# B5 M6 P, I$ Y% H4 v9 I
    printf("The last one is NO:%d\n",*p);
# [$ s4 b5 _3 t1 V4 B1 |     getch();
2 ~( Q) g3 o; l/ w" ~) T1 W" F) e8 |- b! D& D
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;. N9 U7 I6 ]% a9 `; H% _0 x
namespace 又费马达又费电$ n% z, l- z' `
{
( M/ Y/ t% V1 ?    class Program; j' Q9 L8 s3 _/ }
    {  V+ f8 E6 f: y4 y6 V4 D) s8 f
        static void Main(string[] args): v5 R' J4 P' q3 C6 H* J  p
        {" i( G+ ~) s: M+ U6 H$ p% w/ }% B
            int m, n;
7 p1 b. S% S% P$ v# H& Z0 A3 Y            Console.WriteLine("请输入数组长度");. ?% p, q7 L4 E# Z; U& S' R, h
            m = int.Parse(Console.ReadLine());//m为数组的大小
- X  K4 `% A2 F: ^$ E            Console.WriteLine("请输入要截取数字的大小");- @! l; P, f" L7 b6 Q
            n = int.Parse(Console.ReadLine());( a, }% a' l9 N% }* o
            int [] numw=new int
& t3 l6 p' {( g! w* E1 C! G% Y
+ |# }; G& g7 a8 b0 N&shy;&shy;&shy;;
3 m: g) j' X  D* W1 ~4 f            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数/ {! K! K' s/ z: Y8 r  w/ _0 t
            {. ^8 e5 N  _( c' J, L% Y
                numw[j - 1] = j;+ C4 l5 x+ x1 j- H, o
            }
. T. q9 o. Z* |; h7 f            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!0 G5 m  Z) U: `* i
            while (d != m - 1)
6 `6 p" o. @" ]5 A3 \            {
' o% _. `. x1 z1 I2 ?                if (i == m && d != m - 1)
% [% Q9 Y5 _3 V* d% v, b                {
* q: J7 k/ M7 c( W                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
  \7 Q7 D0 ^# O3 u# @; M( F, ?- H. C                    continue;
/ @, j' h+ g& W' |3 j* A                }- J& y) s- J# D1 C3 H
                else  o. Q- r* }! A  U- ]
                {4 h( Z/ C! k; P# R
                    if (numw[i] != 0)+ N) k( X- k5 s. b; K" D, [
                    {
+ B1 e6 d5 R3 @' ~; k                        i++;
6 t1 _" P5 P5 A                        k++;3 ]3 a0 C( `% a7 f$ j; v& t
                        if (k == n)
; \4 q# `& [! U8 C                        {
7 F$ x7 R7 v% [' y' X                            numw[i - 1] = 0;//把在n位置数组元素的值改变了0 m5 c2 v/ w# Y8 r- R- f# z' B7 Z
                            k = 0;
. _6 i" \3 Y* L: r! F              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1+ B8 D# [3 P; h
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
+ T" g- l6 K+ X1 V. M  v* F                        }
) s% i/ d3 C- W                        else//输出暂时还没有改变数组元素的值
+ x% b- m, ?, n                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);/ P4 m" u% B1 r* I/ C9 u4 H
                    }
! y' {1 i) l) f                    else
3 G: d! Y- t/ ]( Z                        i++;//数组元素为0,直接跳过,不计数。。。  l2 }; [' g! {, t7 l$ `
                }
+ M; Q  J$ e, C. S$ e. w) | + ?: c$ v% Q3 x) x6 C

4 }( W( \0 @* t3 Y            }//结束while循环/ E( \: x4 }/ R  b: S: t0 |
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦' {% i; |% g: _8 Q4 g& \/ M
           
$ L+ M! V( q$ n* T# f0 n2 J                if (numw[i] != 0)
3 e' {6 `" Z/ }4 x) M6 z                    Console.WriteLine(numw[i]);
' j( D# B4 Z+ q           + E5 u; ]( F8 |9 x5 G. I: Y
            Console.ReadLine();
# L  E( B/ n9 h7 e# s/ a) l        }$ O2 X' Q  {: f  Q% `% p
    }
  T6 L# E/ t  q}+ @8 x8 n% o# c0 E; B
小甲鱼最新课程 -> 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-6-13 16:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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