鱼C论坛

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

猴子问题

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

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

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

x
大家好!
3 O' H7 Q- \6 v+ |6 R3 ?* O8 X: }; Z这几天我在忙着编一个问题,我用了一种方法编出来!$ n' F2 d; g' ^
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!- I: I" K. g# D% P6 @
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 3 L- {4 C. O' q8 l0 Q! t* y
8 \' V3 u( u: O& _* B- F8 }
! o( }9 G  g( }# `4 w& E) }
                            题目' B  t! G& I3 B8 s2 `
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
) u" w* X. r+ \1 T& z# @第一种方法:利用循环链表+ l9 W1 E3 K! J' x" R2 L* X0 j
#include<stdio.h>
, y: ?  _, b0 F. t' a5 o3 S: F#include<malloc.h>) e$ M( Q- D4 p: r
#define M 8            //共有8只猴子
5 a! J+ L" b8 G/ l#define N 3            //数到3只时退出第三只; ]; ?* Q  B/ i# ?1 U6 R
typedef struct monkey  B# M& I8 p9 b5 Q4 U# n
{int number;1 M8 G$ X; [1 v5 a6 Q3 q9 d( F
int flag;% N# {, e6 n4 j* \8 H
struct monkey* next;
; {  U# }2 C, ?2 B% E4 }! `. I}MONKEY;1 f# {4 d$ ?+ l1 o/ i: k
main()9 f4 P+ C6 e1 R, Q) G5 B
{ MONKEY *head=NULL,*p,*s;5 W! @' G# ?6 {# F& Q
  int i,sum=0,count=0;
8 k1 D5 N/ L: D) {4 b% \# I  clrscr();              //清屏$ t8 P8 r+ B/ K. w
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
1 k1 D  s7 N* z: k- [  p->number=1;p->flag=1;
; k4 Q2 Y( W+ p, {: w  p->next=head;
# ?- P5 Z7 R5 t; x+ M1 R) o  Q, B' X  head=p;
# ~* x! ~& s- {  for(i=2;i<=M;i++)- n2 c- ~3 _7 J  U6 T8 j, j+ _0 c
    { s=(MONKEY *)malloc(sizeof(MONKEY));; n9 y6 f9 s$ n6 o6 [, `5 E
     s->number=i;s->flag=1;
) J8 q5 K( h) N+ J     s->next=head;
7 G/ ], R, P: s: s7 W     p->next=s;p=p->next;  @! n1 c0 O/ }& L: i: ?* N, W5 ]
    }
& W4 c. \2 r, v+ p; [' ?' d% p    p=head;- S. d2 \( W% P1 X) d
   for(;;)
: ]: d" C" y6 {+ Q4 b    {if(p->flag==1)% m; l& N9 `0 Z
       count++;6 z2 l& N& Q6 f
     if(count==N)
+ h; m, M; r) @* c$ H) B        {p->flag=0;
5 S* M3 |* C$ q# ^- a         count=0;
* i; @( m' R. W: L# s; B         sum++;}
5 X7 Y) H3 I, I1 B; A: |, v     if(sum==M-1)1 C7 F; p8 [1 [7 E: \
        break;
0 [( c4 N% b3 h  `6 ]& h+ F, `) q1 S     p=p->next;' j8 v7 g5 @- z" ^, m
    }
$ L$ L* q( T# J$ j- G$ h    p=6 d$ H2 P* A* X, y' u
    head;
+ _  n' @( e# q7 \. @7 C    for(i=1;i<=M;i++)% O- s3 c7 V4 F& }1 \& p
    { if(p->flag==1)0 n% D" A; P6 [% c5 c& F0 a
        printf("\t%d",p->number);& n% [0 e9 p- Z8 C; ~
      p=p->next;
. f/ L  M+ Y- C+ k! e: M# R    }
3 v  [, `) a, H3 ^% s
# g# {, _- t4 N1 `( }$ E
& A' @) q+ w0 _% t, k4 `; }: r. p6 h0 q& M
}
; ?0 c" P0 s$ M# T1 }6 H. Q. B, Z6 s
第二种方法:数组
3 ]1 m! ?7 V% k- [% V- m#include<stdio.h>
, @: L2 ^; u+ b/ ?# z4 X/ h#define M 8
0 u& L( p  W- {- g5 c* g" z8 t9 _struct monkey
4 C2 d: z" ^$ L- m3 l{int number;; s  ^& Z' L' t* N" i
int nextp;
/ p& D& U4 ^* @# q* z1 B: }}link[M+1];+ v4 j4 |2 [+ J) d8 o1 i

% w: H2 |3 h- j' R$ F' A* mvoid main()
2 a/ ^! H8 M( F: g8 s* ~& y{int i,count,h;
) H; B$ c, T) k  D9 S* Nfor(i=1;i<=M;i++)/ p9 d2 ~. Z0 ^9 P$ e" [
{  if(i==M)
) Z5 K  {3 o8 ^, `; x/ q   link[i].nextp=1;9 [3 b- Z, @' @; l# I! t# {
   else
& r) S! _& Y  K- M$ s  Y+ \8 z   link[i].nextp=i+1;
7 l% L5 }3 d% ~% b  link[i].number=i;
1 m2 R6 C2 U3 a}! \7 g8 Y3 n* ]1 c/ L5 l1 f1 t# Z$ `
printf("\n");- N- {* P: T) p3 q; ?9 g7 L9 J5 ]
count=0;
/ c( p; w/ p. h' Z, [h=M;
& M4 e3 p0 }5 c, qprintf("依次退出的猴子: \n");
5 k1 l! w8 q5 Q/ {+ f) e. a8 Wwhile(count<M-1)
- Y9 b2 w2 ?$ Q) ]( I2 T3 O{i=0;
" u8 g: O" R' c! D" x/ qwhile(i!=3)0 [1 D/ V" b9 C" `( L
{ h=link[h].nextp;5 X( L, a* I& ?$ I* I! g
   if(link[h].number)2 X- W3 m0 W4 x  B' {4 g8 @
     i++;}
6 P6 F8 }; ^. c% J( x& J0 o4 z( }  ?  j- g. r2 X6 r+ [
printf("%4d",link[h].number);7 ~( h: P. \  O9 W4 r+ E, S2 B; Q; J
link[h].number=0;) F+ r) j7 c: p8 k, H9 D
count++;
+ k& Z3 V& m# l8 j8 m( w( N3 T}
% L3 s6 E1 e; h- W7 F( j' S
6 {/ K# ]' F* L/ z5 D- ]printf("\n大王是:");
; i$ q! P. P1 V2 x. i+ _  for(i=1;i<=M;i++)2 b4 J& Q* z' L* `
  if(link[i].number)! G: ~* @- A% V) `5 Y+ o% P
    printf("%3d\n",link[i].number);
& {, I( w7 e- D1 g5 K
9 q' z  i* `9 Q4 j! V, }% Q" Q9 x$ Q: {3 z
}

* V! h* }  a+ w  \第三种是普通方法for循环
; ?# I: q  R$ I  K/ t  m
#include<stdio.h>
) E* V. q) ]! k6 Rvoid main()
* _6 C' W$ f% S: x% B# u' I{ int i,k,m,n,num[50],q,*p;& y5 q; @! i) }, h' O8 _0 j8 y' {
    clrscr();: ?2 f* l+ U5 j
   printf("input number of person: n=");
* s$ M4 H; N8 z0 ^    scanf("%d",&n);0 a. G- ~6 c' C
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
) }# Q" Q8 a* i6 C/ i6 d( m    scanf("%d",&q);9 q) B. H! |; i7 C3 r& m
   p=num;
( Y3 S6 |5 s! ]% J! e9 l  for(i=0;i<n;i++)& H! a- k! P- J0 S6 m
    *(p+i)=i+1;5 Z1 [! L  J& c
   i=0;
- A; P2 v) }8 {' ?7 ]+ u8 L   k=0;
1 z5 S5 n9 @/ ]# u; E2 q   m=0;
) n1 E% o; W- B- O& i5 X  while(m<n-1)5 A" s& U8 g% V% l  h$ l; ]+ R% {
   {if(*(p+i)!=0) k++;
8 ^' a# H# W& n8 ^) X     if(k==q)5 Q( D( L" C1 n; v, {9 \2 }
      { *(p+i)=0;4 \, ~: ^8 v2 ]
        k=0;
5 d' Q# [8 w/ ~        m++;$ ]3 e, v2 e& k, F# N3 X
      }
9 r$ @1 Q; Z" N2 v    i++;- A: {' o1 Z: N. c
    if(i==n)i=0;; ?4 [# n5 K- u0 ?
   }( X' W& M; H9 M& a' x: z3 ~' S- s
  while(*p==0)p++;
) b. ?+ P: e6 S0 I% q    printf("The last one is NO:%d\n",*p);# l" v! M2 W- U
     getch();7 j, \* \+ A, N" m

, ?8 K# X) B5 n. a}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;- c# S" M" q- P; x: U; _
namespace 又费马达又费电
  l7 g4 ~( u5 Q{+ m: Y" ?6 V; U0 J5 [( F+ {
    class Program
1 i& c6 c7 v9 T& u/ d. p    {) s8 Z+ T4 A4 X% \8 ~
        static void Main(string[] args)  j, K" n6 b5 c7 [3 n
        {$ r! @$ n% Q! L2 a' T/ z+ h
            int m, n;2 ~+ m, z( [" {0 M6 E6 W: ]
            Console.WriteLine("请输入数组长度");
; \8 A; G! p5 B/ U            m = int.Parse(Console.ReadLine());//m为数组的大小3 O; D4 R: f  U+ [5 T* X; a" H
            Console.WriteLine("请输入要截取数字的大小");. m% e! R- O, w
            n = int.Parse(Console.ReadLine());: P+ X( ]% h; R+ Y* f
            int [] numw=new int, n% l1 S! g9 _

. D* ^6 H  h5 [8 h- F4 w. U) ?8 d&shy;&shy;&shy;;/ S1 [/ @1 N* e+ k% O& L% F4 S5 G
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数+ \$ {0 Q2 A: L# J3 j: O# ?
            {
2 M$ M* C$ T5 h9 W% |, m& {7 Q                numw[j - 1] = j;
- ?3 q0 f0 T+ _# R            }/ t% z8 t; s2 y- ~' i
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!- Y. Y4 y/ `+ U( g  X
            while (d != m - 1)
0 T+ C9 P1 B) `1 x7 M% D            {
6 n+ V7 R! F) P- a" J                if (i == m && d != m - 1); G! Z. P( J5 N
                {
9 |, X, Z2 z. Q2 [- h# Z2 `  z                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!! L3 I* p8 g8 S: G# M; B
                    continue;
5 L! ?* ]7 `7 q0 ~: M6 n, Q                }
/ Q" S; Z( x7 m7 B                else
4 f) l- d( l% y8 x9 M' z( T' r% T                {+ u: |' _( Z' ~5 x
                    if (numw[i] != 0)4 G' w+ x7 w! {, Z  ]& i. j2 n
                    {$ a, o9 k1 [, u( Y
                        i++;5 A0 _% Y( K4 c# R( W
                        k++;
5 J7 b/ s' w7 V; Z                        if (k == n)+ i: {* t. `! K8 p' L
                        {3 w+ n3 o1 T+ w# \/ N& ~5 W3 c
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
; e' _$ N+ M; q0 j: J# \                            k = 0;/ O. b. o  N' Y6 d
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
# U+ A. p- p5 }) b! c' F( v. V2 T                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
) R2 t4 \! `- c' K                        }
# o, }( C; O3 z0 f0 h: z1 W                        else//输出暂时还没有改变数组元素的值" B, S8 w/ M6 G$ U7 j! t( {
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
' @& x) q7 j/ V; k+ @7 G+ J: f                    }
: L) ]/ ~3 C3 x6 m% Z: S                    else* `1 Q* Q: a' y- ^! o
                        i++;//数组元素为0,直接跳过,不计数。。。. }% ?9 @- l/ O
                }
! {. i: f# ^9 }* e, O% k; J * S0 {0 E7 O3 i  P" Y% r

; x( Q$ C- l, p+ i5 `7 V            }//结束while循环
8 R9 s$ g2 {& H  T            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
3 f" a" [, I# I3 C           , ~  Z) L- Q5 Y, F6 A8 @
                if (numw[i] != 0)
# |/ ~  }. G. c9 Y% _3 R9 q) W9 Z                    Console.WriteLine(numw[i]);* }, \$ z$ C5 E; f( K$ B
           
9 ?: j3 b& z, f            Console.ReadLine();5 ~0 f4 B  g2 p1 o" V- P: R
        }. O( Q* `$ U$ q5 v
    }
. h) u' H$ O  d  k}
' O4 [. W, Q: t2 Z; H8 v  P# D
小甲鱼最新课程 -> 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-2-26 22:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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