鱼C论坛

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

猴子问题

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

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

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

x
大家好!
: y: C, e) t# Z8 V这几天我在忙着编一个问题,我用了一种方法编出来!
" X: N6 e% w, K; x1 \; X* j* |但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
- o* f0 Z) ]1 {注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
( T8 s' T" q8 F  W8 x
' V8 D2 y4 s/ R$ \# i9 C! w9 i9 y5 M; I2 r7 {) A( g! M
                            题目
; Y! t+ b$ i% f  `2 G& X  G山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
" p+ p: g% y, P& F第一种方法:利用循环链表
4 [- W7 I3 Z! b. `  @. B2 p8 K/ z#include<stdio.h>
1 F$ |2 X: `6 @#include<malloc.h>
) A4 q, g  C' ]5 q5 G#define M 8            //共有8只猴子
) w- Q( w4 `1 r" u2 ~, [#define N 3            //数到3只时退出第三只
7 y# O# n5 x2 C4 htypedef struct monkey+ ]2 t4 [9 S! ~% r
{int number;5 t: a; f; _9 c& g" |& K; M
int flag;
* u& ]# k0 u- Q. ]) Ustruct monkey* next;% o9 Y" V+ l# E
}MONKEY;
9 e, k, w4 T$ n1 j* }( umain()5 a- B4 x/ L2 U7 I, h5 M/ }6 b
{ MONKEY *head=NULL,*p,*s;
& I! D% |) o4 f# ^2 L3 K  int i,sum=0,count=0;
" D+ J$ G/ a* T4 H. {8 z$ ~1 P  clrscr();              //清屏
* K3 _' T; S7 Y* p* \  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
- m, u, f% a! `* l5 z3 V  p->number=1;p->flag=1;
% O. s+ N, F; ]' _* h: O  p->next=head;
0 N- z) {- }1 b2 l  head=p;
0 ?( y' m. |! L- m" c  for(i=2;i<=M;i++)4 ~% g5 b* X! @& C) u0 j! O
    { s=(MONKEY *)malloc(sizeof(MONKEY));
& R$ R+ I; t% x; f& R* v1 O     s->number=i;s->flag=1;
+ r5 c9 X5 U% G     s->next=head;
* l3 i8 z: j  q& p4 Z) G     p->next=s;p=p->next;6 `# N, N' x. o
    }  F/ w1 n( Z8 p$ [2 l* |/ s
    p=head;
5 L9 C( {0 f, @8 A9 u   for(;;)7 d" R' L4 S7 u/ _8 R. O
    {if(p->flag==1)% B* j  T9 W- w  N& I; D+ W
       count++;
& U! E# k2 k) g7 }! W0 @     if(count==N). V# J* k1 [: H( e- {- k8 e
        {p->flag=0;) Z" }  u/ Y* h/ o  H  b, y9 h
         count=0;
2 a  T& m( ?" c& H% N) t         sum++;}
( z/ V: M9 }* c     if(sum==M-1)3 ^# q+ Q  w$ F0 J* U: v1 ?
        break;' F0 P- h' e" W- M% t1 R- e, l" c
     p=p->next;
7 x& b- h9 W4 l# E8 d    }
' i# @" d- n/ x4 @    p=4 Z5 J+ R% l# ^  M7 J
    head;
$ p- M& A1 O. y( h  @    for(i=1;i<=M;i++)0 M4 i4 S' Q& v( z+ E$ b
    { if(p->flag==1)
( P; z- m; U; S: w0 J( i        printf("\t%d",p->number);: U$ r( [5 F2 w1 u. `* r
      p=p->next;
1 A3 l* Q7 W/ ?, Q/ T    }
! W; b0 I7 W7 w& g: ?
* \# t0 ^* Z- v3 N: B7 Q
3 {- M; Q# i$ t& o  d$ h, a# G
' ^, X: s* B: j8 n}
4 b1 w1 q$ Z" U3 }# H
第二种方法:数组+ j4 A% l+ ~) {6 B3 F4 Z
#include<stdio.h>! l8 O8 e2 v4 P0 w2 O
#define M 8
. L, ^" h# |' e! rstruct monkey2 v: Y! F4 e" s* e
{int number;
4 k& t! ?" E8 m1 Sint nextp;: D& E" |+ z/ [" ~: G
}link[M+1];5 i8 s, P! Y0 Z

9 a9 E+ L3 @* m7 Hvoid main()
4 v2 J, `/ j9 c( s0 ]3 K; J{int i,count,h;% i! }1 ]7 ^$ `. d1 Q
for(i=1;i<=M;i++)3 P  D2 w$ Y& {9 S  b8 D
{  if(i==M)
: [) D1 {8 H2 n7 K; k   link[i].nextp=1;
4 Z  @: V7 ^1 X2 L   else0 |- z% H7 u, q. r3 `
   link[i].nextp=i+1;
9 m/ T+ ?: ^' }) a- x7 K% Z6 d% t  link[i].number=i;8 n" a( s" t" y6 b& k" B
}
; L5 X9 k& e: hprintf("\n");
! {# A4 ^9 Y: R, k8 W7 `. _count=0;
& X7 @5 G2 C# Y, Ph=M;
) M0 v$ {6 K. h7 k; ]7 Lprintf("依次退出的猴子: \n");
0 w: V  R) n' r1 E" V, Rwhile(count<M-1)
( n" q; Y" {. z6 b3 M{i=0;) P8 E" ~' T) q, R, N' N
while(i!=3)
+ N/ I5 ?/ X$ Y# t# H( S' l" H{ h=link[h].nextp;- u. q, ^5 K! n8 e' R
   if(link[h].number)% h- X4 u. \, N' |% _, p$ {/ ?
     i++;}
7 |: P! T: j# d0 X- m# D/ q) P
9 p$ l( g4 G4 f& G" L- F& I2 Yprintf("%4d",link[h].number);+ C" z! X. Y! V6 W. D; u2 ~4 c! g
link[h].number=0;
7 A$ Y# w0 e$ ^count++;
* R# c& J# D2 v! s}% ?9 w( L7 P* L* O, |; d5 ]* {

4 H" W( P1 ~5 ~2 ^  I& Z) X) sprintf("\n大王是:");3 |% z- v% X; Y) O0 M
  for(i=1;i<=M;i++)' d0 L# r2 \: @0 E" f5 p$ C- a
  if(link[i].number)
/ f7 l6 A8 }9 m! V; Z    printf("%3d\n",link[i].number);
7 Z" L4 Q5 _4 P- n- \/ ]6 v: o6 I& Z+ D6 S. `7 m( c: n; _/ r

5 y7 Y. }8 Y9 L, N2 ?}
' M2 C9 h9 A7 B8 F
第三种是普通方法for循环

: z. Y4 M' ^# t- _2 H5 z#include<stdio.h>4 o% ]9 j) q3 B
void main()
3 p# L* J' }. U$ r{ int i,k,m,n,num[50],q,*p;
  \* x0 K+ L, [5 H* Y8 ^* M  x5 P; z    clrscr();
# x% `# M+ ^; j" I3 U   printf("input number of person: n=");3 K& M; R) B) U' c5 B, H% U
    scanf("%d",&n);* P6 r  s3 k( c; e( D, }) {
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
' b2 E- b5 O0 L, }; t    scanf("%d",&q);2 Y- M* X# I9 C+ h
   p=num;, ~4 V- F+ a9 _' \
  for(i=0;i<n;i++): t( O/ n/ E: L7 E* K; W8 y2 T# @! P
    *(p+i)=i+1;
5 @6 n: B  z2 H* B   i=0;" o1 J, I" f" z& p6 h
   k=0;( @5 j( r1 q+ r  a
   m=0;
% L1 e+ u5 t, {! h" S6 f  while(m<n-1)6 \% B) t+ U1 X9 ~! H
   {if(*(p+i)!=0) k++;
/ ]7 ~* ]- p1 I: A" }1 W. q* r     if(k==q)
! {' a) G; N9 V$ l& L  c/ ]- Z      { *(p+i)=0;+ w( N" x, g7 F& i, R5 o% z
        k=0;
: R) K9 Z5 d/ m& Y  s  W        m++;' W8 |8 m6 ~; P+ B3 o
      }+ j, T( Z% `) m. u
    i++;+ }3 [4 X3 Q$ l" R
    if(i==n)i=0;+ A1 q  p6 D, H- R1 F
   }
& j, f# l8 }% q* F' j  while(*p==0)p++;
$ |# u# D" z3 K) E  x    printf("The last one is NO:%d\n",*p);
# ]# h# L8 x& D     getch();
4 d0 z" T; e- x" n5 W9 f3 M
/ B) {) ]  {6 u& w* P6 [; L5 Q3 l}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;9 `# O, S- I- e1 t
namespace 又费马达又费电
& d6 ^+ u1 R* L+ \; p, v5 Z{
) |2 f" [9 B$ O$ S- t6 q9 x. Y    class Program: U- B5 O5 H$ Q+ M. F8 T. H, S3 x
    {
* K9 X5 J2 l+ \. K! f. m; G' t        static void Main(string[] args)7 m  N# a% R. D# m
        {/ h# R9 |/ k+ }( w0 ?! z
            int m, n;
2 u/ e, h' }, s$ c: }& k% s            Console.WriteLine("请输入数组长度");
9 j1 B. n" j4 X' V; w3 o8 z: ]            m = int.Parse(Console.ReadLine());//m为数组的大小
* |' S5 w# X. x; C7 X            Console.WriteLine("请输入要截取数字的大小");
" I: _1 w; @* E, F            n = int.Parse(Console.ReadLine());
+ W7 C1 K1 C$ r# z! J            int [] numw=new int
- u. Z& ~% g2 B4 @
# s3 r: g* [2 c&shy;&shy;&shy;;
! \6 O( t$ I* _2 T2 c3 X5 P            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数* w4 e7 B+ K8 Z* f
            {
0 v$ u% M5 |& w0 o9 q5 f% x" _                numw[j - 1] = j;
% [9 {3 M8 G* t  K7 T6 {0 g. j            }) _/ V$ K  B% k( c0 W" o% |, R
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
+ v7 ~2 S, c/ U9 G) t            while (d != m - 1)
1 ?% Q0 n( K! X' h1 I9 Z            {
8 }8 L* X. @4 o+ U9 o  _4 O                if (i == m && d != m - 1)
3 g( b1 j6 B; j; w; O                {" ]4 ?8 a2 b8 ^! L9 ~2 u
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
$ b  c4 h, v/ n- ]& X/ f' G  C                    continue;, A( ~4 `# \6 t- ^, n
                }3 h5 a* G' t8 G; d
                else& y3 N' I' S% P  G5 R
                {( D( L7 B% s0 G: C1 Y& }4 a
                    if (numw[i] != 0)
2 {+ g- F. m' Z6 q1 P                    {
  ]3 e% l7 z9 }                        i++;
! v0 s, k( Z6 R* {; ~                        k++;* l% ~) a; H( R, d9 v
                        if (k == n)
5 Y2 z+ ^3 J$ F  u" `# P' F. O                        {
0 ~! {5 m- c, j& d, ?; V7 O                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
1 o, e1 f; M3 u9 Y% B                            k = 0;( J: [* p: b4 Z1 w5 M3 d
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1; @+ e$ u% Y: o
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
! Z% S! z* y* x                        }
# w1 g7 m, n9 G+ m6 V                        else//输出暂时还没有改变数组元素的值! E. a" J6 {% D% `
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; P* Y2 @' R5 q/ D& g. J+ \7 Q                    }
5 k0 A# t+ F( \2 W# K1 S& s                    else/ u7 O! N4 e2 X" i/ a
                        i++;//数组元素为0,直接跳过,不计数。。。( O1 w4 I, i4 J5 n4 Q) n" ^
                }- |9 j7 R4 t9 B5 j& n. d
# Q/ k$ w+ Y- C& {
1 a# Y& G! j0 N
            }//结束while循环& ]  Q0 b1 L+ {9 r$ S1 B
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦; e: |2 V" S& j% m
           
$ h' |/ O0 i, E) y+ `1 Q                if (numw[i] != 0)  d& [% X% v/ o2 |
                    Console.WriteLine(numw[i]);7 a% e( A" f; C
           ; P: p; [5 |+ P& R" \
            Console.ReadLine();" J1 U- x; H, ~3 x1 [% r
        }
# `% l4 ?, n/ @( w9 O) Q    }
. T. }- j# `, a}
7 L) z9 ]* B0 Y' Z4 Q: `) S7 N  g
小甲鱼最新课程 -> 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 22:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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