鱼C论坛

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

猴子问题

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

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

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

x
大家好!) g# ~; L8 C9 u9 X! T0 o# S
这几天我在忙着编一个问题,我用了一种方法编出来!
2 G' y7 P' x$ v$ j5 B8 O( E但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!$ r0 O: k$ H8 T; H, j: M$ d
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 3 t( s$ G7 c# C
( e# f9 r) a. Y/ t: B

$ `! E# `& v" M% q& B$ }
                            题目
* L0 s: v  `) H/ i0 g9 V0 r9 q山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
- Y0 U3 _: ]  ~& g7 \) D1 c8 @第一种方法:利用循环链表" M* a0 {) S1 p- r7 g/ L. C! s
#include<stdio.h>
" Y8 X! ?" W) l0 w7 T- G#include<malloc.h>) L% C$ F' G$ b( C. a' }! p
#define M 8            //共有8只猴子
' S& b2 i1 O/ o8 z#define N 3            //数到3只时退出第三只
4 a7 U* F' P1 G' Xtypedef struct monkey
( l/ T) ]2 s% r, R8 }  R{int number;- [7 n5 }+ \  j' \# H+ E# i9 }
int flag;( v, R' ^7 y- V- q4 E/ g. ]
struct monkey* next;
7 H9 s$ X9 h9 ]. W}MONKEY;
& ]" K4 z/ v6 V5 D; O6 ^# ]main()& f* ^# s# Q  P. ]; N& K0 e6 v0 g
{ MONKEY *head=NULL,*p,*s;
# O3 D' J7 K' r" M, U  int i,sum=0,count=0;
7 M3 [$ L/ D4 w6 ]5 c0 w1 z9 ]  clrscr();              //清屏
0 w2 D$ P$ b; A  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
3 J6 F' `; G1 a, u! D/ t4 x  e  p->number=1;p->flag=1;6 B4 \; P* \) N% L' |5 Q6 e
  p->next=head;
1 _7 }, x9 K: c6 N4 _) Q# [$ f  head=p;
7 J& ~3 I8 T5 t4 Q/ u2 R0 v2 ~  for(i=2;i<=M;i++)
# A7 G7 [9 }- L$ K+ q1 t% }- t    { s=(MONKEY *)malloc(sizeof(MONKEY));
% z: W+ Q  B) c2 B1 n  e5 w1 h     s->number=i;s->flag=1;# f  Y( g/ p) X
     s->next=head;
+ O0 E. Y% ^4 X  O1 f     p->next=s;p=p->next;
7 J! Q- G4 I! i4 r    }8 V( j: i: k# o; X
    p=head;) B% v5 e* s3 }1 V3 @. u
   for(;;)) Y, R2 x: ^# R0 L/ H# \, m
    {if(p->flag==1)0 @8 b1 N- i3 V$ h6 d$ Y* `
       count++;! Z9 R! e% V, y8 }0 Q6 A  ]9 p! M$ {
     if(count==N)9 J) d: k. Q3 h& s% X5 o1 Y' n& E
        {p->flag=0;
& R1 ^4 }5 D! D2 j4 K+ F, L         count=0;
7 O  P6 p% H  Q- h) h6 l         sum++;}6 _# `0 B. ~, b: s- d2 K
     if(sum==M-1)
& ~, g9 P, `( t/ h8 u! q4 r1 Z        break;
8 U9 h; r$ D4 D) ^- q3 G5 x" R     p=p->next;
1 v- B" s6 X+ j% r4 M3 T$ c    }0 I- ?! U: i8 y
    p=
6 J) N8 u/ C0 C) ^! Z3 Y$ i    head;9 |, U# X$ N9 S( t& }+ ~
    for(i=1;i<=M;i++)* K9 T) b% H# E6 ~, h4 b+ K
    { if(p->flag==1)# G3 Q8 C: x; _$ u" r
        printf("\t%d",p->number);
4 t9 g  I' }/ _6 m& ?% R      p=p->next;( }- q( [" a$ F) w( Y8 q8 t3 r
    }* `& D. O9 v7 o

- K- k4 M, d/ H# A! U1 G, `0 b$ i% }) r4 I

# o8 V5 Y7 K7 J3 j7 Y4 }# n}
# I" t8 [. B8 U5 x9 `6 [' x9 K
第二种方法:数组& C8 e( D* `$ v; m' W2 z$ R
#include<stdio.h>
3 u. G9 i; Y7 ~6 i0 h#define M 8: L& Z0 K9 @5 w0 [! j4 {
struct monkey6 u, s" r0 w/ N' b2 i- y' X# [
{int number;
( C! |5 d  y' V$ ~# f' Hint nextp;
3 u7 @4 e5 d5 R  ?4 S0 U5 q}link[M+1];& @# B; y0 ]5 n* p8 }7 [

- C8 y( [+ Q) e9 ~$ d7 ]  ovoid main()
6 C- Q0 l4 s0 ^; b. \. k, y4 q{int i,count,h;$ B* N0 G" S+ h1 {" s( X# ~' G
for(i=1;i<=M;i++)
) [8 J, N3 l3 `5 K- o. L# G% m/ \{  if(i==M)
/ F% n9 V) _. E" B. d2 O' H$ |* c6 x   link[i].nextp=1;
  J1 N" p% h: P6 L   else
7 l# K0 ^% J; s- K3 C; m, V- K$ W   link[i].nextp=i+1;# o0 f+ j8 f) V" ^3 Y% D: y: L
  link[i].number=i;
+ T- w7 K- U8 l  Y2 j! h+ A}" r# U; e+ j% j8 x# e
printf("\n");* h  T: }* h9 w9 K
count=0;8 u% ?* n$ Y( C4 Y
h=M;
3 q4 r/ S/ ^* ^( L3 W) P4 M; j4 tprintf("依次退出的猴子: \n");
- n$ o+ B4 U# s2 Wwhile(count<M-1)+ i5 s0 F9 h7 m+ p' H' x8 I1 r
{i=0;
2 T! N( {  f; e2 f- ~2 C' Owhile(i!=3)
7 H9 c4 I4 R: z% D{ h=link[h].nextp;
$ D+ @. D! M9 d* |% f   if(link[h].number)
0 ~$ b5 P- T- ^/ L8 O! y3 ?     i++;}! O3 s2 y4 ~! |& f0 h

4 Z- z( a, F- ]7 lprintf("%4d",link[h].number);
$ z: T. r9 E& w0 T- _1 S0 olink[h].number=0;( B6 X+ X7 Z. P
count++;
1 t9 d' g6 K) g" D5 J}
9 D6 U6 \3 S- L( }2 ]7 S2 o: a9 u5 @) E! P/ e* O
printf("\n大王是:");7 v2 @5 e: N1 l1 v/ \
  for(i=1;i<=M;i++)
- d+ W5 y0 W3 d! @# L8 E  if(link[i].number)
* R7 e' b$ [2 H% Q* f. H# i0 c    printf("%3d\n",link[i].number);; ]8 e5 f$ P+ `
2 c9 V$ |8 q6 |0 s

, r  G; }, e' J" v$ e$ V3 ~}

6 O- n7 u- h/ }) Q; Y第三种是普通方法for循环
1 n/ ]2 }, j" [
#include<stdio.h>! x1 y9 z, c. \( r8 u" f
void main()8 y% C( ~/ y: c  Y3 D6 [
{ int i,k,m,n,num[50],q,*p;0 f+ ^7 c" J5 v4 d
    clrscr();
* e6 c0 L/ T, d- T  e3 K   printf("input number of person: n=");7 w9 Z8 e* h" t0 k" {
    scanf("%d",&n);8 X" m; t  \: z1 E. a- V! H
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
3 \7 R0 O% ?, V& `, m2 c7 z    scanf("%d",&q);  Q$ \- Q2 m4 O  ~( x1 ]
   p=num;
6 L1 {! O8 I2 N: i$ s  for(i=0;i<n;i++)" v7 T  u8 L& L
    *(p+i)=i+1;
8 S, I/ {. S7 @5 C0 v: ^) k   i=0;0 t, M% L$ A) j& I
   k=0;
' l# H6 R/ H9 K$ i2 |% E/ L   m=0;7 I, H& c; v) N2 K+ O
  while(m<n-1): G, w7 f! {( [( \  ?* C8 I6 {  P
   {if(*(p+i)!=0) k++;* Y8 p$ t) V/ ~# j7 U
     if(k==q)
4 q; N7 X: K7 I% e" }2 x9 ^6 {      { *(p+i)=0;
' m9 H( N9 A' R2 m7 m* Q! H        k=0;- H9 |0 i, o: i( ~! t: f7 q
        m++;
3 \$ W9 q" q2 }( g      }2 n5 J! S! {( j- g  Z$ {+ }
    i++;' T; G% {8 h' Q7 U, f/ Y; e
    if(i==n)i=0;
5 m. T. v$ ^; `# L3 ?5 `7 O4 v/ s, ^9 Q   }; m3 g3 b: c& B, J4 {& \# W
  while(*p==0)p++;) p% f* f  R4 o1 G7 m& h
    printf("The last one is NO:%d\n",*p);, l: h' [9 d2 k% M# U$ X
     getch();# J" r! Q' S6 n- n( J$ d5 p" t! q; m
; j) H( i3 ?, i
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
5 N4 k% c0 k: s  u  Gnamespace 又费马达又费电- i, B" _" M' x3 ^
{% [$ i2 Q. G- v' i& c9 a9 {
    class Program
0 w6 ~& ]; Q( H% Z! [( F    {
* @2 \) r& ?9 ^# u7 ]9 R' {        static void Main(string[] args)8 ]; C& E/ r  p$ Y5 k! v
        {" o! a9 E$ z0 G! j8 I3 S
            int m, n;( Q3 U7 v) x. x( f  D- f
            Console.WriteLine("请输入数组长度");
6 Y  r8 @; f7 r            m = int.Parse(Console.ReadLine());//m为数组的大小
/ {# g9 a' N. ~3 j6 n( f, O8 d9 _            Console.WriteLine("请输入要截取数字的大小");
- k# O! @2 U  D            n = int.Parse(Console.ReadLine());
# S5 ?. e8 ?0 k% H+ ~6 ^            int [] numw=new int
0 V0 q/ B- w: W; Y9 J2 D( @0 ~
% j  y2 }, k7 s, f8 c&shy;&shy;&shy;;
& I. J' F: ^3 R; k            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数7 [7 l7 n0 J! m4 i( V: t" ~
            {( F& s/ \; V$ Y& S4 O& l& W/ l
                numw[j - 1] = j;9 r& Q# O; h! r0 h  I" }: ~
            }4 |# e4 z2 J' K
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!: D; G9 W' x" f2 r2 b) D
            while (d != m - 1)0 Q1 l8 Y4 Z' U& ^
            {
: F& h6 @5 Y! X0 ]; \& N                if (i == m && d != m - 1)4 }$ P- `, ?/ Y' w& y
                {
- F+ ~& S, {6 C2 n( y* D5 M4 U                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!) e/ D9 O. Y; i* C6 |: H* Z/ E' d
                    continue;
, h3 _* p2 O! \/ D6 }# u2 `4 s! [                }
: T- W' s7 [' J& m3 m5 B                else: {* ?% {& T; v# \
                {2 K  V8 L5 ?( K, k6 z
                    if (numw[i] != 0)
  ?4 T7 n0 Y: s9 C  W7 h                    {' d" W% ~* `) Y: y
                        i++;, U, W5 t; u- z5 {7 j( i3 ^6 h
                        k++;& R0 N" i- L6 m1 L
                        if (k == n)
( J7 e+ ?8 o- L2 Q                        {
. B' C8 p; Y% e. n) }8 v6 I4 u                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
2 h, p: A: W! p2 B3 h' r                            k = 0;0 A' Q1 n4 c! k; X9 c# }
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
& @2 J2 R3 ^: p/ p+ `                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
' Z8 f' G* |. e                        }
+ h" s0 q3 C& N4 y6 Z8 ^                        else//输出暂时还没有改变数组元素的值
2 [8 y( W' ?0 u' v) P3 l. p- f                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
( h( \& G2 J7 [                    }
0 {0 h- B1 ^0 D7 M- I+ p* O! V! L                    else
( [" r7 M5 ~; Y# ~( Y9 Z% p3 h- j                        i++;//数组元素为0,直接跳过,不计数。。。
. V6 p% {2 `8 m) e2 g( {                }
/ `- W1 `# C8 M
4 a) n4 J. t" h* ^6 e1 f, r+ J
            }//结束while循环
4 b8 [% q$ }7 ?; S, G; H* @& O+ e, `            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦3 z" b, Z& p* k* `% E# [& t5 J
           
6 s6 m' X7 h7 Z+ `: p; K- F' v                if (numw[i] != 0)& N$ m% a+ @" Q7 e- l0 S
                    Console.WriteLine(numw[i]);
  y, P( _! c" S3 t           
2 j, L; {( A9 g! X% z% C7 U            Console.ReadLine();. R; k4 o3 y3 I% i" N
        }7 m7 O/ ]8 N% t$ f. r& n+ v+ B
    }
. I, K. U$ f1 j: n( g' v}
' w; u+ O$ ]- ^0 Q3 D4 e0 u' U
小甲鱼最新课程 -> 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-1-5 09:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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