鱼C论坛

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

猴子问题

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

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

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

x
大家好!
# ?1 N# X( S/ G) N9 D这几天我在忙着编一个问题,我用了一种方法编出来!- K2 n8 J' p2 ~
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
$ |% j, }7 [+ l7 _- V; Y注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 : B0 v; A8 J  @% P

5 |) e! h, T5 P3 y3 l
+ c! Q0 Y9 @- ]5 j/ e
                            题目
% Z1 k  X: ^5 v山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
% J& b4 i& o2 G& c, ~# \第一种方法:利用循环链表
% u, v0 S* B$ C) e0 E* V#include<stdio.h>* C9 L$ |( d7 l
#include<malloc.h>
& A5 e) [) G, B#define M 8            //共有8只猴子5 v; i" I( {/ H9 ?$ D
#define N 3            //数到3只时退出第三只3 c3 J5 k  L6 m! V
typedef struct monkey
/ O% r* F: Q3 k* d6 g3 ]{int number;1 ~/ {. ?2 L- K) r% j2 t
int flag;) D# ]& L9 z/ G2 y" X3 w
struct monkey* next;
# h4 N1 W! u$ ?; }: z6 Q* _; C0 e$ J  o/ M}MONKEY;
4 R! Y7 x' H+ b0 u* @main()
' o# L  G% h) F+ D! F) ?- Q{ MONKEY *head=NULL,*p,*s;3 {/ H7 C( V) c- X+ d7 r) d$ F9 w
  int i,sum=0,count=0;
% g4 Y0 U5 b/ U# j  clrscr();              //清屏
* _% Q* G; g4 p  c  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
/ |6 I" n$ F  a: P2 _  p->number=1;p->flag=1;+ u, S/ w9 Z' `2 P
  p->next=head;3 E& D0 |& F/ `0 @
  head=p;
! ]' V3 w4 s# g6 z+ H/ f  for(i=2;i<=M;i++)8 b- ]& X/ K- f5 A1 x
    { s=(MONKEY *)malloc(sizeof(MONKEY));
: N3 K& M3 g* C$ t     s->number=i;s->flag=1;! e0 q2 a/ A3 V1 o3 B! V! u4 k0 W
     s->next=head;
6 }, ~: I1 \" v5 J/ Z' q     p->next=s;p=p->next;
) i3 n. h; Q5 n    }
/ }: t* ~" o6 l! G) v    p=head;* g8 ?* ]4 R  p) ]
   for(;;): o. r) Z! F5 h8 v$ b; |% T
    {if(p->flag==1)! i1 C' U' \3 t7 X# J# D$ _
       count++;9 f6 ~0 @1 T! |# F
     if(count==N)  L" ~5 t' l+ I& h3 x8 Y
        {p->flag=0;& g: f3 d$ X; N
         count=0;
9 d1 f. G5 v! C1 C         sum++;}" {6 M( n3 k3 y. a
     if(sum==M-1)% s; I6 G0 L. D- K9 y, U
        break;
% z( z' h/ M+ [     p=p->next;
' ~1 l: S& `' ?; [! k. Z    }
* G. V2 e4 N' r) p    p=" q+ f7 T9 ~# D+ S
    head;
# L  [5 P3 d  a    for(i=1;i<=M;i++)
2 E% D5 a& u" M5 g) t2 Y    { if(p->flag==1)/ X3 E2 z  y9 x3 c0 ]: S0 r7 U: d5 E
        printf("\t%d",p->number);
. H0 r9 V( F! {      p=p->next;
7 T9 q3 Y3 i$ x    }
' P! q  }# I2 i: E' f
/ N( L  Z: x: @$ X' J. ]  b& k
  p" i% r3 P- e0 d% Q( ]7 q# d$ c; J5 I" ~
}
+ A' B9 i; c2 `; z2 o- O5 D
第二种方法:数组+ L' s% R3 N2 @7 l# y
#include<stdio.h>
: w6 k! h/ `& \#define M 83 l# ?0 W, x4 c: u0 v/ _
struct monkey
% h3 B, ], e8 t{int number;$ S) {8 t4 n/ \( I" l
int nextp;
. Y6 R) v  [7 W# l& }% X6 D; p}link[M+1];
% t9 o8 ^) J! G( S: B7 h0 e- a) r" {/ u1 r- ]" F, x7 Q
void main()- r: M, G3 R$ n1 x6 P% l" t+ A" N
{int i,count,h;
8 r2 @( s; G- \8 u- i3 ]for(i=1;i<=M;i++)6 B8 |& b" A" U9 k" z6 \( o. F
{  if(i==M)3 G) j% d) F! i
   link[i].nextp=1;
# ~3 D/ N( [' `. X: Y   else
" Y& A, Q. h* W   link[i].nextp=i+1;
8 t* l. A/ ~& z/ W1 W3 D* s  link[i].number=i;
* r6 n4 I. V3 B# U. k: K1 F* i6 b}
* C: ]6 i6 `- O) Qprintf("\n");- W$ L0 a) C, ~1 S
count=0;# j4 w( p* I. {
h=M;
6 K% q6 C# q& x( |% }printf("依次退出的猴子: \n");5 d, `# o# m) {. m# V
while(count<M-1)
, b  Z9 f; T! j{i=0;4 P0 }2 h% f# L0 y2 m
while(i!=3)
% c6 f- l9 R8 W; z5 `/ ?% P{ h=link[h].nextp;
/ Q3 ~- h3 o  G   if(link[h].number)
* ]# G! W( O5 ~* _# B% Z     i++;}* j+ B% E3 ]$ }* d! ~$ x, z
8 t% G* K& |9 w: n% l
printf("%4d",link[h].number);& q& |; @0 t( l+ @% ?: g
link[h].number=0;
# |7 b% a6 o6 k1 F& x2 }8 k9 X3 xcount++;- |+ J) E7 b+ S/ Y! Z
}/ M4 H" g9 s% }6 w; m
+ m- O' X5 O! \& O
printf("\n大王是:");  G& [2 \- i) C9 J/ g
  for(i=1;i<=M;i++)& r0 m8 S+ \1 T% I8 R
  if(link[i].number)
, G1 |9 F0 L% F6 `) p    printf("%3d\n",link[i].number);
# I6 \6 ]' e) n2 m6 k; z
5 `5 p" @: Z# I  }) V/ V% E
6 k9 h, W* g+ E: G4 i; O}
5 D6 N+ T( n# w: ?0 K: H
第三种是普通方法for循环
- B: P1 x$ m# J8 t8 V* w
#include<stdio.h>% `1 {8 W0 ^, ^( L1 g5 C. d
void main()- _, r* N' A5 s9 T- c8 y
{ int i,k,m,n,num[50],q,*p;
4 T/ @1 g* |& R- B0 ^  E# r' q% j    clrscr();
- @1 K7 ?% G% G( S; R) T   printf("input number of person: n=");
, Q3 c, y* ~7 G    scanf("%d",&n);( Q& ?) Y5 g% T# m9 i1 ~& t
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只! S. F7 X: R" U+ P. C" |: Y. \0 Z
    scanf("%d",&q);& q8 s! Y& p( J1 l' [
   p=num;
/ N1 ~, @3 ~7 H7 I& V  for(i=0;i<n;i++)7 @  r% b% o& B* N
    *(p+i)=i+1;
* \; r6 y/ Y# Z   i=0;
" N' ~7 K4 I6 D, a% J( }7 n! V0 [   k=0;8 S  m6 h8 p- s, K0 H* U' I* ]8 D) |5 ?
   m=0;
+ w9 R8 B8 z: P: I  while(m<n-1)+ m9 D+ W: [  R1 f
   {if(*(p+i)!=0) k++;
- I5 v4 U; q% a5 I/ w     if(k==q)
- m# q7 t1 N) e# Y$ l  ?; {      { *(p+i)=0;. c/ P- t0 P5 E* D9 L
        k=0;
, s7 N- n  \7 `* ^  ?$ G7 I1 w        m++;
2 y- U) g" y) b" l3 f- p9 S. _1 M      }/ m0 O% G, e$ U. ?
    i++;8 J/ L" L" W" ]5 h6 W* U
    if(i==n)i=0;
, ?9 M9 M* t3 I) m   }
( w' r  x/ @5 q  _  while(*p==0)p++;( k# {4 `- u+ F( N
    printf("The last one is NO:%d\n",*p);
! ?9 n7 X% Q  |% P  B( e& v5 O     getch();
' j/ |- g* V3 H$ }6 U$ A. }  S* m. W# Y. H. j2 P  @) _
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
4 z1 u% Q+ w3 H* S, r, Cnamespace 又费马达又费电, T4 L. S- d/ w! Y
{0 R. C/ E4 `/ b8 {- ^
    class Program
; Q2 S2 k3 ?5 g* ~* B3 E2 h    {9 T/ }; Y4 x7 E" ~8 ^; f  Z, M
        static void Main(string[] args)
1 ~. I( n* p4 n: w4 Y1 w  ]        {
2 J# D# b0 D8 Q& t% @            int m, n;
3 V6 }( a; y$ F: }; s6 O2 X4 C            Console.WriteLine("请输入数组长度");
; v" b0 |, K9 N; [- N( k0 S            m = int.Parse(Console.ReadLine());//m为数组的大小
/ v9 {, E! X) t' i9 a            Console.WriteLine("请输入要截取数字的大小");* r8 [" t& W3 x* a" V# Z; _
            n = int.Parse(Console.ReadLine());1 I& ^+ P; H& k5 T
            int [] numw=new int
9 n. a' G! o) M" X
% B$ h1 y0 n& k9 L&shy;&shy;&shy;;. R/ O7 R5 i' [6 T4 p8 h, j
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数+ f' E2 V% l% Y8 V$ O
            {$ d" I* n6 U$ s
                numw[j - 1] = j;
& a  D: n* N* i3 H' N# g( A. \8 Z            }
) Q9 j) s5 V# B/ ~, Q7 E            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
  X9 W) ?7 a- c  i1 H3 O3 n            while (d != m - 1)
8 O9 p8 K& U# k0 g; O            {5 N6 r7 c. s9 @3 J' c5 }9 W
                if (i == m && d != m - 1)4 H0 R0 i' N8 G. a* W5 y% ]
                {/ v& {& ~( P$ ]# Y: z1 V
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!1 F* z0 d- O; `+ A6 v6 t: `
                    continue;/ W% X  _* g6 F% U
                }
3 F! |& t0 t! Z                else1 i4 Z1 n5 V; c$ b
                {
6 W) K7 v( o9 F. m! ]5 {                    if (numw[i] != 0)$ N: S6 \3 _& i; u2 P
                    {
% a2 v: J( p# o2 R3 _                        i++;: g6 g+ P4 ?" o( C9 ^1 d6 [( c! i
                        k++;
( C" Y9 Q: K1 a* i; c                        if (k == n)
9 _  {8 Y- r6 o: ?4 k                        {& J6 Q% h  b1 L8 Q! e
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了' v5 p1 t% a" t# i* L% A5 C% y3 |0 x- H- p
                            k = 0;
' n& ^4 V4 Y# E3 f              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
5 \$ y1 S" ~$ S2 Q; Y                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
. k" ~' U7 w9 ]8 U4 {8 R                        }
0 M; z( C- W" G8 K$ ?# W9 Z                        else//输出暂时还没有改变数组元素的值, [/ ^' E+ s( M
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
) i6 ]0 A2 u) |) s$ |% ~0 @7 k4 ?0 I                    }- {+ x1 w3 t( U+ \: ?
                    else( J2 x( }' N. }1 B% l
                        i++;//数组元素为0,直接跳过,不计数。。。
3 A) W7 I; Y# p, D) c( J                }9 f9 G0 s- a4 i
  J; b0 _0 z" i. w8 g- j0 l4 N. n# R

  M; J! y$ L$ o/ t# o            }//结束while循环
8 m4 F" O6 F3 |' U5 J1 r" H3 e            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
( F$ n- w: L1 a, z3 d. j           % x$ O2 ?2 q6 k1 u
                if (numw[i] != 0): I+ p+ [: F9 z& t) @
                    Console.WriteLine(numw[i]);
8 D* r5 B' x0 m: R: |4 [8 ^           " p- J7 @! T5 k* |0 p1 R, q+ r$ l9 k4 g
            Console.ReadLine();. [+ L; I. g: ]8 F, [
        }
' G0 d( O: K- s    }
- w# I$ P8 c1 ]; t}
8 F# I" M  d8 x' Y& _! V
小甲鱼最新课程 -> 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-5-25 07:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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