鱼C论坛

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

猴子问题

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

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

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

x
大家好!
0 N2 e9 F' s' C9 W& k* N: d这几天我在忙着编一个问题,我用了一种方法编出来!
# _2 K' |3 r0 Y  W8 n/ B( x但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!7 F/ T: ?/ ?: g! L: j" g: X7 n( ?
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 / h6 w# b( ^$ U- M; t6 K

0 ?  I# o' u1 J1 l# E2 W' R8 Q- `2 A  ]3 y& [  c- y2 T. ?
                            题目" D+ M. \9 V9 J" P+ n' V
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。7 d# {+ ?+ y# o' K1 S" U  L
第一种方法:利用循环链表
( L. c9 L9 e7 y; F#include<stdio.h>
( {$ ~- T& U$ n#include<malloc.h>
& p. X5 m1 S1 P#define M 8            //共有8只猴子* T, i4 q5 ^1 l  l3 H
#define N 3            //数到3只时退出第三只
1 ?0 l- e  i. R$ D* b1 u* m% Vtypedef struct monkey* J  {# _+ \1 P% Y
{int number;
$ V7 X3 v- y, W) h- k+ J+ Qint flag;7 _, I6 f% ^. J
struct monkey* next;/ q! O1 W  a" R1 u
}MONKEY;
+ b6 n, S  P3 U* B0 t9 o- Emain()
& E) z- u5 [5 S5 H{ MONKEY *head=NULL,*p,*s;+ G7 u5 B- O9 h( O# |
  int i,sum=0,count=0;  n8 K* W, R' Q+ U" Q
  clrscr();              //清屏* D8 H6 s1 b! n7 |
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存, o1 q6 R- o1 i$ I6 [7 r! a' o
  p->number=1;p->flag=1;
9 W% f" x5 S0 m$ D  p->next=head;: _: X5 P. m4 C' Z* v1 }
  head=p;; w1 p4 \& P8 W; }/ v9 c! A
  for(i=2;i<=M;i++)
& \' |, ?) `! J+ h! l    { s=(MONKEY *)malloc(sizeof(MONKEY));9 `0 H& S  ~2 Z9 a5 L+ t! s) _5 R
     s->number=i;s->flag=1;0 W7 N3 S* Z2 A9 Z2 O
     s->next=head;
! Z+ N" i% h, [  E; M( B0 E     p->next=s;p=p->next;, k" E8 C6 \2 |1 F0 j6 Z
    }9 y! E% C: b# ~( [: W! P9 F
    p=head;$ R" X7 {- Z0 `& W: t
   for(;;)" ]! n" \$ c" |) v+ _4 P$ v, k4 O
    {if(p->flag==1)
" z: Q6 K. \1 [       count++;
' |( m7 _" Y; H     if(count==N)
7 H4 |" Q% d" Q2 D        {p->flag=0;
* R; C* ]2 z5 {) I/ m# K2 ?         count=0;$ }; N& \! M: {* r. I  f
         sum++;}1 L- t' M! a* |0 P" Z' ]+ t9 H
     if(sum==M-1)
: Y5 K  ?' D$ V        break;3 A9 V( c7 x* X
     p=p->next;
8 D, X2 @  Q/ E+ S! e% ^3 k4 _    }
( B3 V* ?" L7 M    p=: N+ T$ u, d) p! F- n  R% [
    head;
8 x1 M( ^* i+ h! D    for(i=1;i<=M;i++)3 B- ^5 I& ?8 j' X, n
    { if(p->flag==1)2 Z( U* D% o. L
        printf("\t%d",p->number);
* t6 {9 n/ G* r1 P7 n      p=p->next;' z. t* z( Y% N
    }
& }: Q9 d( d' y1 f0 I; I
  E" g. h" a9 z% o" x: l7 [3 m& g, e" o

4 ^; ~# _; B7 |; g1 w" A+ H}
0 W" G* {5 h5 L' _/ r* W
第二种方法:数组
7 Q. z1 \  n0 n1 [#include<stdio.h>" @& ~8 Y, H  j0 R% h1 ^
#define M 8
5 R3 U3 q7 k9 Ostruct monkey
* t) s3 p, z2 K* \{int number;0 w  z1 P' @( J, i9 \' F+ q1 W+ b; i
int nextp;
/ ?" N  Z; a0 @/ b}link[M+1];
) |" B7 b) i9 z2 [: N4 y% {; U) z. r& G0 ~0 K9 N8 C0 d
void main()
% v3 ?: T5 X9 k7 F{int i,count,h;! x3 H7 r0 U  k  u& X
for(i=1;i<=M;i++)1 y9 Q% n6 y! F/ Q
{  if(i==M)
: u! k1 f: u/ f. d! b2 g   link[i].nextp=1;
, t- C. Y. J" {' q2 n- T- F   else4 h* [& }- U* C% S1 J' Y" ?: K
   link[i].nextp=i+1;
6 M2 e/ q) W5 s+ n- p* H  link[i].number=i;# q1 M7 \' B- r2 {: {0 R7 P
}* |4 ^6 U' j# ^$ F  k. c$ P  u, [4 J
printf("\n");
6 S. j# P: \2 fcount=0;
/ c0 A2 r0 ?1 h1 J- m1 S# [h=M;
0 W" r/ H, @( zprintf("依次退出的猴子: \n");: V9 ~, A! e& v1 H
while(count<M-1)
0 u4 d/ c3 T! u{i=0;/ q9 v: w+ a& }, t; R$ O
while(i!=3)( T+ Q% ?1 a7 y1 y3 z5 e
{ h=link[h].nextp;
- n6 f, c" ?" g1 [, @   if(link[h].number)5 @3 n! Z% W( b4 E, x
     i++;}, ]$ R8 r& e, W* U! z; j* N8 f

8 A7 k' r: f5 a/ S  Rprintf("%4d",link[h].number);1 @$ g* n: A5 z9 H& y
link[h].number=0;
5 N) ?/ x8 M7 d& Icount++;2 p7 p: `* [, J, x7 W  C- h
}
/ P2 |" x4 z6 i8 I8 E4 q1 @  }
/ Z' e+ C# f" b1 X0 x- B5 Q: uprintf("\n大王是:");
  ~; R2 M0 e0 F1 k0 ?  for(i=1;i<=M;i++)
& O/ h9 P4 S2 ]  k1 V, @3 m  if(link[i].number)
+ d" t( R" r: l' v, F6 d    printf("%3d\n",link[i].number);
: e3 a# `8 u. t/ H3 k
" F  a: C! Z0 y. W6 m% \
# a  Q8 U% r* [: x" Q" \3 `) q}

, P- {* t1 H* s9 x- o$ ]第三种是普通方法for循环
% B& e' t4 F" j5 D0 B) k: h
#include<stdio.h>
; i- K! x3 k5 {4 mvoid main()
( y0 c" d+ ~; M, x9 [  V{ int i,k,m,n,num[50],q,*p;* c) p- {$ r6 u  Q. Q6 B- p
    clrscr();  _& ^2 f) y% U; H3 `4 q  j5 d
   printf("input number of person: n=");
4 N4 E/ h6 _% M1 i    scanf("%d",&n);
: C4 T( e" w2 T7 w( \$ g# Jprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只+ ]0 Q% R5 e+ o% ]1 d
    scanf("%d",&q);8 |* ?& I: F2 f+ j! _
   p=num;6 p* p+ d" V; ~( Z0 A% g: l
  for(i=0;i<n;i++)% |5 \( Y0 F) A
    *(p+i)=i+1;/ e' i' E% f$ H' N" z  b
   i=0;% T! K0 b% h4 f3 s5 X
   k=0;
) N+ _! n/ F: h4 ~6 p& D2 _' r1 |   m=0;
/ p) d9 N2 Q% l, p2 [5 M0 I2 A  while(m<n-1)  U; g  H3 N0 N! ^: c( k
   {if(*(p+i)!=0) k++;4 N2 f* a0 n/ i. T
     if(k==q)
" L" s. I' l( ~: G) |      { *(p+i)=0;+ T6 q1 F) j# V3 ~. X5 H
        k=0;
$ z4 L$ B8 H7 c, U) V        m++;- [8 E3 `/ ?% _6 j6 N+ T
      }& ^8 d) E/ D! _/ m1 V
    i++;8 n# h) v2 S" y* ^+ A4 `
    if(i==n)i=0;: l  F) N. [; I2 q" ~/ _
   }( C, K; {- D: J4 K. D9 Q5 N/ d- v
  while(*p==0)p++;
$ G* j9 P* D& b( q    printf("The last one is NO:%d\n",*p);
) D% I8 ~6 ^1 N     getch();
$ ~) q& k, D' f! [  T$ ~
1 |/ O3 H& J( |, j8 P}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
5 c3 c  N, `8 W8 \, Unamespace 又费马达又费电0 L3 Z$ l) B5 i, t# z0 R
{
8 }9 C3 c+ K' z, w0 f- Y    class Program
: y3 D1 F4 S) U3 Z1 T  F! s, ]7 X1 i    {
1 S9 u$ r4 a+ U- c/ B" {        static void Main(string[] args)9 Z8 D) L) ]- P, l! P
        {
& h; F& y8 g! m6 Q, u            int m, n;4 H8 b+ x% N4 E
            Console.WriteLine("请输入数组长度");
# x) B3 f2 n, m4 D  l( V' p            m = int.Parse(Console.ReadLine());//m为数组的大小. A) P3 f. Z5 m* |
            Console.WriteLine("请输入要截取数字的大小");
5 a4 }$ h/ H) R( p9 @$ h            n = int.Parse(Console.ReadLine());
) q" }! B+ e: |; T& t, ~            int [] numw=new int
/ Q2 y; s4 }: P* S& j
0 \& F* Y4 q# V$ E&shy;&shy;&shy;;0 A4 Z3 q2 z) G7 g7 f. I$ ], z
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数2 l- [; t+ K6 |! F
            {' X  \; [& K2 ?3 M, y' v+ B# R& n
                numw[j - 1] = j;
8 }4 J! j; s% J% w4 B            }
  B: n7 t$ N' Q! ]            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
/ v0 M( l6 A! v; ]6 f, ~. W/ J+ t            while (d != m - 1)& j4 m) ~4 U& f" ~; \: ~2 U
            {6 B( c( t7 X1 p, C1 N- u9 \
                if (i == m && d != m - 1)$ j9 Y* p" X0 ]4 k) i
                {1 e' ^. E/ W8 g; u% B( C
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
* k- S: z+ F+ N; S                    continue;
5 r. T8 Y8 q- W* k9 e7 F( ~5 C                }' ]' I# d2 M5 L2 o  [
                else
6 I) J: f9 D# h8 g" Y  m9 t3 O                {/ p& Z2 _, I: s; o
                    if (numw[i] != 0)
$ m3 ?- Z) C  J# q4 @* p7 e                    {
+ E% `2 Y" R# E! F) @9 B                        i++;) p( Q. U5 k2 P8 g' z
                        k++;* Z, ]# {# i0 p4 W2 }/ L: o- v
                        if (k == n)5 d; `1 b2 x/ n& i
                        {. O5 o4 V4 s, _* S# t
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了, T" @! L- _/ |& O& v% u$ p! q
                            k = 0;
! u$ U: [( {7 ?8 b1 x1 N' l              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1; }  a+ m! U/ W: u8 u
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
' V, p- }- F" P/ ~: C  T                        }! |+ l4 e1 {* r1 y3 ]2 h
                        else//输出暂时还没有改变数组元素的值) {  Q2 b# K% \3 ]  N% n
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);4 }0 R. }. P7 T: O
                    }9 r5 w3 W8 `) M  B
                    else
' X/ F- M, w* p& }                        i++;//数组元素为0,直接跳过,不计数。。。! n* L6 x% L1 L# i& a
                }
# T; ?8 K7 G1 h9 p1 i0 u: x, E
+ I+ {( r  j# M; S7 E1 k8 I; L8 D7 V4 C7 L
            }//结束while循环
% M) H+ r& z+ n: g6 V            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦1 u+ |( T: ?& Z1 J9 k9 ?
           # N1 s$ _: O- K, J8 l2 g
                if (numw[i] != 0)
4 O2 s8 t$ H0 ~: J$ w& H  j                    Console.WriteLine(numw[i]);
% Z# ~2 Z' F/ f2 f& h: N0 e           " a3 |) o7 U. N
            Console.ReadLine();
1 r# U1 B# t" K" z% a' M9 {# ]9 M        }* @, }3 s" I' I# c
    }
  F: N$ w9 B/ [+ H. K9 t}
. P# k( R6 k$ z  p$ o
小甲鱼最新课程 -> 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-7-14 21:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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