鱼C论坛

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

猴子问题

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

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

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

x
大家好!% J( \6 f, I& [# r
这几天我在忙着编一个问题,我用了一种方法编出来!& }( e0 {& B, Z9 N0 q( ^
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
9 N/ F8 ^9 m/ e: d( b. z注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 2 N& F7 p/ M: e& j
: V% }5 E9 E. Q* V; m
) K  a* l* n& t! i2 H
                            题目8 G/ U. ?4 J; R
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。- W) c. p: u! p/ M8 ]$ g
第一种方法:利用循环链表/ l; m+ A. |* }9 |
#include<stdio.h>' l' M0 d' f; |, w! p
#include<malloc.h>
, g* E1 C  l; `  C#define M 8            //共有8只猴子
' e# ~9 p; `% @% t. m7 l' k* Q#define N 3            //数到3只时退出第三只
( `$ D+ \& h; t# N$ Ktypedef struct monkey1 L  I! D& \' v; Y$ _
{int number;
* G. d  v$ Q/ A# d1 nint flag;4 N" V: I" L, Y) n( H4 r- X
struct monkey* next;
4 U3 g- R: c' i' g5 k}MONKEY;
3 [: G! k' b. E% Amain()
, x% {/ j7 U$ r, D2 ~{ MONKEY *head=NULL,*p,*s;
7 {% v( w7 F' X! ]* }# d  int i,sum=0,count=0;2 l7 j' d) \/ `: Q, w- ]
  clrscr();              //清屏. I7 r  `- R( r2 B
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存8 R* b/ T+ _: `8 f$ Z; Q) i: E8 c
  p->number=1;p->flag=1;
9 m; Y, ^$ K# ?6 ?& P* C  p->next=head;
6 O; k4 R) K; @0 Y# H0 P' Z  head=p;
! @. A9 F* X1 k3 C! X5 v8 g1 i  for(i=2;i<=M;i++)  c" {4 C1 N' |8 Z% `* e" t
    { s=(MONKEY *)malloc(sizeof(MONKEY));+ x0 S/ V( n0 b( z; H9 X' z) H
     s->number=i;s->flag=1;
9 d6 z. k2 m; O5 t6 z, f+ S  \     s->next=head;6 p4 w0 ^% B: b2 ~9 m0 l, x! ^
     p->next=s;p=p->next;; z& u( j( `' S3 K
    }7 n, t0 Z" r. ]
    p=head;
' P0 y1 d8 b4 @6 [) D! K   for(;;)0 W; Q8 }: `) o# r+ T  f' f
    {if(p->flag==1)
& d  ]9 z  t/ i9 U/ I3 K- O1 T5 j       count++;' ^0 E- v% _8 I7 j
     if(count==N)# B# \) _) i2 `. ?
        {p->flag=0;2 a+ q$ _8 Q$ N5 m0 O  y
         count=0;% w. Q5 R; I7 ?- x
         sum++;}
3 |! H0 \6 m7 V* z3 M1 ^     if(sum==M-1)3 ^- n! T, G: g7 x( ^; Q
        break;
* g! R" x, c, b7 S     p=p->next;. ?* c7 w# g6 X3 ?* W- t1 R. Z/ F
    }
' W( H: w% X$ x. U2 e0 H    p=
/ j: G+ r9 C% U    head;' C9 D6 |! \: f9 v
    for(i=1;i<=M;i++)
3 h# `% O# W+ f1 M) f% ~    { if(p->flag==1)
" j5 E0 T$ f- i9 y; u4 \, y* e        printf("\t%d",p->number);& \( g9 w6 ?+ A5 o
      p=p->next;
4 p% O2 w( t- h8 q7 d    }6 @5 \  R, u# `! p+ N% k2 B

) z' E1 `3 K+ f% @* f4 i, N, B2 d2 N

2 C$ W6 K9 h9 p" s$ e) r}
% Q  g# F9 q) Z* ~2 Q
第二种方法:数组
9 H+ F* O* y; Y" H8 Z% l#include<stdio.h>  _& K0 p5 p$ `3 y3 a, w
#define M 8
2 ^/ T$ a  v+ z7 C' B* `" _struct monkey
3 T% \6 d/ {) {$ b8 P  K4 l0 s{int number;& P$ u: q# k0 V1 a3 F: F- J9 a
int nextp;) M0 @; r! d3 m  n6 h
}link[M+1];
* J4 _+ h6 |. R1 z& s& `) H6 }9 q$ p9 n0 l
void main(): @: i" R2 ]# Z4 F! `2 m( N+ Z1 M
{int i,count,h;8 N. U8 Z: ]& o# ^; U. ?9 g
for(i=1;i<=M;i++)
" d/ `4 x. _, n' T{  if(i==M)
+ F& S7 j/ k- a! w/ S# S   link[i].nextp=1;* S& b6 t$ k! W7 X, ~' g' S5 {0 F
   else& B; X/ K& U( ]# Q0 W# {/ l1 X9 R
   link[i].nextp=i+1;
' j! `. |& j* g1 o: w5 Q: U  link[i].number=i;
( J. ^% C6 J5 L. W}& W* f% t4 ~" g4 ]
printf("\n");
2 g# c' q( n3 s/ j, t# Z( S  ucount=0;( B, z$ i# `) v- L' l
h=M;- r! K/ i9 Z# o
printf("依次退出的猴子: \n");9 M; y1 M( i# k7 j! T
while(count<M-1)3 n1 C9 L# I  X) k! s- s
{i=0;
6 ~* T3 m, A4 W, A( {# j7 H% \' i4 Fwhile(i!=3)
1 ?+ c( r' r# @: }- j{ h=link[h].nextp;7 g2 Y2 T  U8 [: n+ I) Y6 S
   if(link[h].number)
3 f1 J- d; Y0 o) g: T3 R7 P     i++;}
" m  Z2 k, _4 `  E9 s3 X/ }0 j' Z4 T' p, y7 f6 A
printf("%4d",link[h].number);
/ B$ ]4 D2 ~- {" t  Q$ r3 Ylink[h].number=0;
* @" R4 t, S- Rcount++;. ~) f( a6 f3 s  c3 ^$ I
}
9 U+ G9 ^& ?, A, }& s3 V$ ], i+ R7 R# ]: H4 L2 k; O
printf("\n大王是:");
; q. x4 }5 ~# I7 A- o: c  for(i=1;i<=M;i++)
$ A2 y6 \$ Y3 T5 M5 X& _  if(link[i].number)
) Z% \7 |: M. i; i* \7 d3 J) D; q2 _    printf("%3d\n",link[i].number);/ g7 u2 c# ]" o; t; D( ^/ O
/ ~( i& p2 ~) b: `; s$ N

. C6 v( i+ c9 a, t/ f( F}

  s4 C! i! Q8 R7 U) U第三种是普通方法for循环

9 E: b; H$ H, ~( c#include<stdio.h>+ t7 ~/ d2 e1 S* p, D& P" S
void main()
4 K5 I. ^1 k9 J: @. _$ [: V{ int i,k,m,n,num[50],q,*p;9 X* j: I( [  M) W7 F" i
    clrscr();& q$ N, z$ [- R! l
   printf("input number of person: n=");
; Z- g  s1 P, o/ R+ v    scanf("%d",&n);: C8 a8 F% r* y* ]6 w; w3 O
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
+ g6 ^2 x, O  K1 s9 O0 P# i; T3 x    scanf("%d",&q);
4 ^+ M8 v, v+ s' Q& B& B" y   p=num;: E% ?; g) K. i: e8 `2 g
  for(i=0;i<n;i++)
( P3 e) S" ]1 k. b; ~6 L7 [* O    *(p+i)=i+1;8 M9 y3 c$ Z8 X0 {
   i=0;. j5 d% P) d7 U8 }
   k=0;+ r" {1 F* ^; z
   m=0;
' a! {/ u% ^$ c! Z, m. B5 r- j  while(m<n-1)
7 T3 n1 d8 D8 r+ w: r2 L. b+ o! ^   {if(*(p+i)!=0) k++;: v  l) m; _  Z0 Z# ]! z
     if(k==q)- @- b$ W$ Z; k& ?5 w
      { *(p+i)=0;  ?7 W" _6 h; h
        k=0;, B- \! l! c: X
        m++;
+ S" e- i- s3 [      }
* y" c6 w& p; a    i++;
- c# c8 H0 v$ P; ?7 \    if(i==n)i=0;
7 O! Z- B( q0 S, y1 t8 M   }; {7 P2 J3 v: H6 S) U
  while(*p==0)p++;/ y# F! N* ]4 b- ^& G4 ?
    printf("The last one is NO:%d\n",*p);
$ \/ p$ t& b: h9 U& w7 ^6 p     getch();
8 F( O) S+ v$ o- j  h: i
" y& X0 n+ R2 u1 ~0 e9 D5 A5 \; M}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
) \, s% k6 v; \9 [; snamespace 又费马达又费电- k2 X: E" |' R) U
{) N6 D1 i; K2 J. V
    class Program
8 ~; d; k; f7 q2 p7 ~) O0 q    {! R8 e+ G% Y: V' v# B, _
        static void Main(string[] args)5 v  v) r8 b+ t( x
        {
9 E& m. c4 w; d. t            int m, n;% f' G6 A- M% H
            Console.WriteLine("请输入数组长度");
9 B. t* K, n6 U" H4 O* \! m            m = int.Parse(Console.ReadLine());//m为数组的大小
( H# C% a# G6 d( M/ d. y& {            Console.WriteLine("请输入要截取数字的大小");
$ V( z7 v# P4 C; Z, b9 A            n = int.Parse(Console.ReadLine());5 i9 E7 r" {1 o  }0 b5 A
            int [] numw=new int  t1 W$ W; w& x/ N1 b

  _4 n- `, c9 W# I&shy;&shy;&shy;;
! a% n/ x( T( R9 n# W% I            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数; z7 c' b1 K9 r) {4 c( A1 M
            {  y/ x8 I4 U2 N
                numw[j - 1] = j;$ R; }9 u6 P1 }
            }
& r% p( a# B6 M9 ^' c, S, R            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!2 d. G; z2 n& x& ]' m: N5 T5 X
            while (d != m - 1)/ E0 F" }. u& |. l, N3 U
            {
, P5 I2 [5 b" s; z: a8 e+ b/ _) U                if (i == m && d != m - 1)2 j8 E8 u0 B! \7 @7 h) K) Y
                {
: c) ~: m2 o; Q3 E                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
; f7 t. z7 R, _- p8 w                    continue;
3 W# j* ]4 _, J& T4 T2 e* i. x                }0 A# F! W) P" W- D' w
                else
' C! A$ B7 a, S9 F5 x  p& `                {
  v+ r) r& w4 K6 ^: X                    if (numw[i] != 0)
0 m$ S5 ]2 Y9 m  x4 f; j  l7 Q+ u                    {- a7 w0 H% p; U8 }  y$ F
                        i++;* I/ r8 e  H- }1 |# v
                        k++;
6 q4 w3 j/ U4 q1 N3 k                        if (k == n)# o1 b* p: p6 A! ^
                        {
2 O# z6 O+ W& ^- }( n                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
" o$ ?* a- \5 p1 j                            k = 0;( ^7 l/ ?4 c% u* P* p2 _
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1: c$ ^$ _; O6 Y% K1 ?# K
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
, b$ D1 O" |4 {" G                        }
" A% K) O, h2 b9 S0 R. v                        else//输出暂时还没有改变数组元素的值) ?" }% K0 L3 |6 J
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);/ m  m( |& I: p0 T% o$ c4 y; f) Z
                    }: _0 o! {/ Q5 O" k$ C# H1 T
                    else
7 S5 s4 \3 m7 e                        i++;//数组元素为0,直接跳过,不计数。。。; s+ k% _* [+ d/ w
                }" z" t" u7 A% z# H+ k1 c' C1 z
2 ]! z( D! D2 b  J) P& c1 L( D- D

# r' t3 |/ u! N2 _            }//结束while循环
/ N  a( X$ N! Z; n' {" X' F6 D            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
' @: }$ l0 P  U3 V           ; {& M6 L0 N0 t* U4 O2 ?1 U
                if (numw[i] != 0)
8 u$ e+ K( P! K4 |8 n                    Console.WriteLine(numw[i]);
0 I( b1 ^5 H, j; S2 i           5 j  C6 H7 t$ D1 J8 y/ b! H
            Console.ReadLine();7 I2 L: q' c* B( D8 A
        }
1 g: a1 M: m8 w/ u8 A8 U; m9 ~" W    }4 D4 a9 A' _& w* g0 P9 y1 }5 e5 I
}4 C: B, ]8 i( _. o2 e
小甲鱼最新课程 -> 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, 2025-10-20 04:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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