鱼C论坛

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

猴子问题

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

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

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

x
大家好!
, Q* A) q/ k- r. i& f这几天我在忙着编一个问题,我用了一种方法编出来!. I/ s* m2 V* A! n
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
1 N0 i) N' t! v7 a2 O, e注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 , ^# S# W  l1 D! E& |; V$ K' t/ v* z
1 Z( \  f. R+ b/ b

  y8 T6 F* d% D' P
                            题目
; Z- H% l: `' J# t5 ~山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
3 K8 ]0 K) m* M: F  M第一种方法:利用循环链表8 `9 z. W& Z7 Z
#include<stdio.h>/ c7 n; b% c5 h! E, r3 W$ J% b
#include<malloc.h>" z5 y; u. O6 e2 s) k
#define M 8            //共有8只猴子
0 ]% Y, `2 x7 Z; c#define N 3            //数到3只时退出第三只( e6 h, T* O% e/ W' E. s/ ~
typedef struct monkey
' m* }) ?6 h6 V& w$ M- s{int number;( q% |8 J! J, d
int flag;9 ]; M# p% ~9 m2 Y! ~+ @
struct monkey* next;4 M  Q. j$ C7 j- n" v
}MONKEY;
+ ^+ G* @  v6 t1 L6 D3 z  Nmain()% ^! j# |; H' C: b" _
{ MONKEY *head=NULL,*p,*s;
5 v2 Z% ?, u$ c' g9 x, v1 Y$ ]  int i,sum=0,count=0;) \; L2 f9 h0 ~0 \- @
  clrscr();              //清屏' r/ @6 _. l: x5 b: n. q
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
! _. R' m3 a5 e: o" H9 l% B- S2 C. [  p->number=1;p->flag=1;3 D5 G0 U5 ~7 ~+ C
  p->next=head;
: F6 E% |0 f# r3 M  head=p;
6 m! _  c0 R; y3 |  t  k: Q  for(i=2;i<=M;i++)) i" Y. f- L& o! G2 a9 V5 v# N6 C
    { s=(MONKEY *)malloc(sizeof(MONKEY));% h% h) G  W- t1 M8 q: A6 z
     s->number=i;s->flag=1;
+ x! x: H6 h4 I4 n" n0 f; \     s->next=head;
: H( `  a0 h) [  \# N  s     p->next=s;p=p->next;
* T5 y- @' N7 c" {    }
# D. B& ]* R2 K) h. g. j2 {    p=head;
8 t# @6 c3 I: T. b   for(;;)# S2 v" z4 N/ @2 [7 p* o& {1 k
    {if(p->flag==1)
/ r' u& T9 T+ f# t5 b1 Q9 S       count++;
; {% Q9 s+ K% k. a8 t     if(count==N). z9 |, G# a$ r4 I
        {p->flag=0;; U0 n6 U' X" j. d# ]; P5 Y
         count=0;
$ ^0 M7 k6 N" M! f9 e) Z         sum++;}- Q0 N1 N1 S$ S  H
     if(sum==M-1)! ~: h& G. ]$ z6 w  D0 W0 m& U+ K
        break;
, l  o! n  ]4 G9 z1 G     p=p->next;; M7 R8 z+ w; ]/ y' `$ m- `
    }# a' [- a0 \) t4 K$ X6 l# s
    p=. b" S( q) ?9 a( w' Z+ {
    head;6 a! J: L7 q' f
    for(i=1;i<=M;i++)
5 {' S  R: k5 Z, Q( Z    { if(p->flag==1)7 s9 S% y3 t+ j8 z, X
        printf("\t%d",p->number);
- J; |  H7 |  [/ _      p=p->next;
, l( [- R( K1 B; I    }
+ \6 I# ?3 x9 }" @: j5 n6 T/ F$ u/ Y9 C* r
( P2 e+ `7 M! e- T9 c

9 ~9 ~: k1 @( S2 C3 a2 M6 a7 z}
- e8 ?, g. z% Q
第二种方法:数组
* Z0 j7 k: c2 b7 O9 R#include<stdio.h>
& r& _/ e1 n1 a2 x0 M#define M 88 S* u! I  L! ^6 K* g8 i
struct monkey4 f- W/ d$ L/ F6 W6 c  c
{int number;
( S1 {: |+ S/ a5 {& X9 ?" B6 ]- oint nextp;
5 B8 Y1 B- T( e6 J+ W}link[M+1];
% A  k5 P# B4 K5 P- G
/ `  G' o7 n. E  D. bvoid main()! J! [, E7 D$ K8 W% w% y
{int i,count,h;
% d/ r) I- o$ H& a0 O5 hfor(i=1;i<=M;i++)
2 W( j' r' L: ]{  if(i==M)% k# Y9 ]) f# {, Y  t8 G, j
   link[i].nextp=1;
8 E8 A: I  f6 L1 w9 I6 B' w. P   else
+ Q1 q0 k5 a, h8 o1 T* U* v   link[i].nextp=i+1;6 X0 W( ], ]2 o! [
  link[i].number=i;
# \* P: e: Q9 u9 D9 A4 I}7 p' {4 V! L9 Z- P* P" |
printf("\n");& n% T  U( T% p% s
count=0;7 |2 B& L3 ]( y' i  i! _/ W
h=M;4 g+ n3 O5 e, U
printf("依次退出的猴子: \n");$ g  [3 _, t7 r  Z
while(count<M-1)$ K( n. y( ]3 K+ b
{i=0;
, ]7 h. P- _7 R* v9 O2 O7 Bwhile(i!=3)' a; E2 W3 b& v& @% N1 R
{ h=link[h].nextp;  L6 n& P# k2 o
   if(link[h].number)
/ f- A- F+ @* B  L     i++;}
7 p* l0 e; c! z/ d, q0 e# X: A: {
1 X) H( M; q! Uprintf("%4d",link[h].number);
2 ]5 u" d) Q, Y& J4 [% ~link[h].number=0;
- R# k8 e$ G8 U  o% B9 U3 D0 j( Ncount++;+ p9 ^+ C8 t; h3 q9 T, x
}; @1 n( W. Y& X: D" f  V

% t% z* U, ^0 X' j  w. w9 n$ sprintf("\n大王是:");& [" H! g% N8 n4 ^
  for(i=1;i<=M;i++)
  E, @  u% g; i% A! b+ T  if(link[i].number)( M: u7 i. t1 q2 K" ?0 w) I
    printf("%3d\n",link[i].number);5 q' y  l2 r4 {* Q- O: V  T

! `  m9 H  U% W5 R! P( c& n' N( w8 H# g* X# z# w- O
}
: K9 i( y- P) x2 Y
第三种是普通方法for循环
, \5 D% d3 V1 h( G4 d0 ^! v
#include<stdio.h>8 f) x7 U* S5 f8 E- S! ~
void main()5 P. Q' H: u3 q8 W( Y
{ int i,k,m,n,num[50],q,*p;
$ L" T: s; X, G( {8 k+ L1 r/ D    clrscr();
' }3 P% G/ c. d) J1 h   printf("input number of person: n=");
3 a; s+ z7 [+ c    scanf("%d",&n);0 A* a9 d2 \6 S1 i0 b$ W' ~$ p5 ?2 a( F
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只+ S, B- J0 `6 b0 f' l7 u
    scanf("%d",&q);: L5 Z8 H- {' R
   p=num;
' u, ]2 R* P1 Z  for(i=0;i<n;i++)
' j; N' i* D& m    *(p+i)=i+1;
% K, B% M9 B" _2 n   i=0;' m1 v0 `3 ?% T( u
   k=0;
0 X0 i) D) U" \, _1 b5 [   m=0;
: T* }& Z; I' }- |  while(m<n-1)
# i" r$ V$ {. R' F   {if(*(p+i)!=0) k++;
' d2 Q3 f3 R  R8 U4 j     if(k==q)5 N( d! k: o6 b; i  M+ e
      { *(p+i)=0;
# k* E0 D  G- M) n( ?        k=0;
; A1 V0 r6 }1 }' ]* u: d. _        m++;
! n# w9 N6 h8 [# F3 b4 O2 Z3 |5 u3 e      }6 \! }5 Z, p. ]& c4 ?
    i++;2 b. r- e( @1 R  C! n. I  J" Y: x
    if(i==n)i=0;
8 s8 k: U( T  g" I) Q; |$ j$ L  E   }
1 L* `+ r& G9 i# ~2 x$ L* @  while(*p==0)p++;
! c5 Y9 `! I5 m7 ~" X$ C- c    printf("The last one is NO:%d\n",*p);
( j" c& j7 y- W" F0 _7 q9 K     getch();
" @2 b- R9 `7 c* n3 _' r1 E: f8 s+ t0 B4 U9 h0 p' Y: L% P2 Q  l: ]
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
4 G# b3 d& f1 F- P6 \6 G( `namespace 又费马达又费电
& ]7 V" X# m+ ~7 l{/ y9 L; D8 S: B2 W6 a. a/ b. n- S8 \
    class Program5 I- l" Y/ r2 Y- B9 C: g
    {
  @% B2 `0 x5 u  ?1 T, \# Z        static void Main(string[] args)
* ]% f0 }( s; N' y% M. p        {0 T3 G' ?$ W& u* {! D
            int m, n;
3 ^/ b2 Z1 |6 U% y            Console.WriteLine("请输入数组长度");
+ e/ N* e/ G$ E7 j" L; Q; X            m = int.Parse(Console.ReadLine());//m为数组的大小
+ Q8 Y3 ~/ |. ~& J& y            Console.WriteLine("请输入要截取数字的大小");% `( H9 x& ~% ]6 t
            n = int.Parse(Console.ReadLine());
. Z; `, C6 E' L9 R2 B) L7 H, L            int [] numw=new int
0 I+ A, W- g* a% V' Y' I  ]: f4 z
- h/ v- U5 Q, ~% T( h. C% j( J&shy;&shy;&shy;;
+ I- D4 ?8 v* ?7 V            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数( N+ ]* n0 U# d, w) O) Y! P- e
            {
7 W# i/ O$ S+ M6 ~* X1 q( E                numw[j - 1] = j;
* e6 a, _! ~0 a4 ^3 Y) G3 y            }' }: U# U7 l" s, o8 A: B: Y  p8 l
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
& r, K0 o3 y1 F7 l+ H            while (d != m - 1)1 J" E( |" p* F, [
            {
3 g( ~& M) I: I                if (i == m && d != m - 1)
0 ?0 U' k' Y  n- g! W) }                {) L5 q% g# V: h3 s1 m# x2 V
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
3 D" v5 C5 V& L' ]; A                    continue;
( E* ^% O2 q6 B& c$ ?                }
: E8 V6 {  _8 d9 X+ w2 Z                else
1 ~, P& t/ z* |% C' `                {
; `3 ?7 h/ O* J/ M9 b                    if (numw[i] != 0)
# L0 W: y$ }6 S8 l2 n9 J1 f2 z                    {
" k) |& }" D; _/ ^. q8 K2 h/ O                        i++;* c; n+ _$ K$ C
                        k++;' x. W( Z. M( H  l1 P/ w; d) h4 r
                        if (k == n)2 y- [! D  a- W4 ]  z
                        {# S8 u2 U8 r" ]& Z! x3 x
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
) Y- Y5 H1 ^  U( D                            k = 0;1 `% R! y, z" z- R
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
# O1 U% S" S$ J( @                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);& F* n# x/ m1 @: _. \! d
                        }7 b# i1 A; g; A& ]* k! q
                        else//输出暂时还没有改变数组元素的值
" U: k$ H6 C+ ]8 P8 Q& S                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
- f% l; S  b) L0 U3 `  n                    }
1 W' C3 b$ T8 V, |' G( w                    else- \0 u, Z9 D$ H
                        i++;//数组元素为0,直接跳过,不计数。。。
6 i+ B/ e( l9 c0 M" V. d                }
0 W& ~& @2 P- s3 | " G8 H  v6 L! e

8 x; Y" O! m3 w6 }            }//结束while循环$ _4 x* f" F- \5 X* ^1 B4 v; g3 {
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
% N# E) a' g6 y           . a, Z/ A0 m" j% r5 ^
                if (numw[i] != 0)
7 `  s! c$ V' y! r                    Console.WriteLine(numw[i]);
! m1 w2 e- `( g0 t# B' f8 U           * I! P( P. i6 U$ V0 Q
            Console.ReadLine();% `4 @$ \2 J2 T; K; M4 p
        }
/ R  d7 D# {, e3 _  H+ B( `2 m( ]    }) A$ A2 n' \# `+ T% W
}3 J$ K  I" q" U' o2 D6 Q
小甲鱼最新课程 -> 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-8-1 11:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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