鱼C论坛

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

猴子问题

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

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

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

x
大家好!0 P# i: D9 I/ _* ?
这几天我在忙着编一个问题,我用了一种方法编出来!
0 B/ j6 b% Q: q, ]( O6 ?& t但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
( {9 y* a3 o' ~注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ) o, Q- _4 y; P/ v; c( F
# C" ]1 m9 G" _  G6 w6 ]! @  A
9 V$ e9 }8 A; P# U/ C2 x  U- i
                            题目
/ S  S6 [' E( e  F+ I2 h山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
1 O# K  H8 T+ w+ Z9 x第一种方法:利用循环链表0 Q: M& Q! s/ t
#include<stdio.h>
" F- b& G, a8 Z! r; F  x  @: ^: R#include<malloc.h>
  B2 d! |2 m4 y9 x6 W#define M 8            //共有8只猴子! F" W+ E" K. D. B& i3 P( o2 c
#define N 3            //数到3只时退出第三只7 K5 B* R1 z# Y* {
typedef struct monkey" h4 \0 ]: W8 x5 {& l6 ?! x
{int number;- @% ^5 ^1 p: i5 L
int flag;0 C8 G; ?, ?2 h. Q3 |- X
struct monkey* next;
0 s/ {3 z& w0 n3 ~5 k}MONKEY;; l! G  ?5 q! o/ V/ D( D3 E
main()7 S$ b. @! W2 P. S0 j8 j
{ MONKEY *head=NULL,*p,*s;
' k& t* H7 q) l' E: H* J4 Y  int i,sum=0,count=0;
. Z9 d1 R4 [9 {- d0 U$ h2 H: M  clrscr();              //清屏) s; t5 G4 s8 l1 d6 E
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存* W* W  u+ ^3 R! ]- P* z
  p->number=1;p->flag=1;3 Y2 V# \! ]2 M1 t- `+ P
  p->next=head;8 m5 F0 L8 G' k$ E9 F- X
  head=p;/ j  T' b/ _) @
  for(i=2;i<=M;i++)
. ]1 z  }: |) n    { s=(MONKEY *)malloc(sizeof(MONKEY));
, O4 J/ l$ |  N9 ^  z& L     s->number=i;s->flag=1;  F0 `* e5 _! S2 p* O
     s->next=head;! U- W1 R& s  x6 ]$ U* k- Q
     p->next=s;p=p->next;
2 ]0 v' U- e9 B  f7 a: L* ~    }
! f7 c# T4 b6 _" W& B8 e0 s    p=head;4 f5 t- R& t( @9 `$ \# w% I, X
   for(;;). A2 B$ g3 I- B5 j# R, }9 j% s
    {if(p->flag==1)
; R8 q: _. i/ R) w3 Q       count++;$ _8 F/ m4 Z9 `+ @! m" \
     if(count==N)
! d# D: O5 m& ?$ n& m        {p->flag=0;! \$ o. {0 A9 ^; c+ M! y) t9 z
         count=0;  w& K& C7 z3 S5 i' Y) r* q
         sum++;}
9 S' a4 g/ B; @- y+ d7 C     if(sum==M-1)  r- F1 U7 h$ p
        break;
; Y7 h* e8 w1 q* i, T% w* }     p=p->next;
. I2 m* b, x- [9 _$ P    }' i1 M) x3 @4 B
    p=6 s% p6 E: a* T: I0 h3 p  l
    head;
3 v  Q; h: v7 D3 U: w    for(i=1;i<=M;i++)
$ M  c6 Q4 q$ O    { if(p->flag==1)
% z# I; w! v& g. L        printf("\t%d",p->number);
& _  R5 k' L2 K0 W, f% R! w      p=p->next;+ t5 K7 j1 z# V$ U& g6 ^
    }
! A4 ?/ v' ]7 F! U0 Y, ~- m/ E9 Z+ B& u0 D
! h1 ]( w2 M* Q- n0 Z* K; L% B
+ |3 t/ d5 F; k8 ^. v2 R! M
}
$ u1 \- j( i+ @  a7 W; B
第二种方法:数组& V% z0 i$ N- J% V6 V3 j
#include<stdio.h>
9 ]0 v- J+ S* ?2 c; x( J, @#define M 8" z) {( ~* N: ?5 L2 _4 M
struct monkey
2 _7 B5 i, A- o! h, y. _{int number;* {8 O) c; g2 B: M0 h% S! f
int nextp;0 {" N( P# n2 T9 u
}link[M+1];
* I. I+ v8 }7 D+ U' y; E! a8 p
* A  V& N! P9 @1 ^* lvoid main()
. N3 [" ~! b# u! Y- M{int i,count,h;
& B% q! a' C9 x& i" F' K, L  Bfor(i=1;i<=M;i++); y$ i! m3 }# Y
{  if(i==M)
: I2 v" }4 x! Q& t   link[i].nextp=1;
9 Q6 k1 I2 T7 {" M8 d/ o9 n: T, K' F   else& x% X, g3 j+ Y% {4 Q" a: `9 w
   link[i].nextp=i+1;( c1 Y) L6 j6 w) }8 M4 u! x; t
  link[i].number=i;! v9 F, ]: i4 `7 ^% K" x2 D
}; \6 z: f6 a& U8 X, i
printf("\n");
2 C4 i, j( x# Y9 n8 gcount=0;' e& Y4 U- P2 H. e: n! l. e8 V
h=M;8 L' b8 H! F7 h
printf("依次退出的猴子: \n");
2 O+ B2 Z1 O% A% lwhile(count<M-1)
6 s0 o, e+ |2 M* o& Z! _{i=0;
' ?7 m" |8 c) qwhile(i!=3)* e. n. K1 @0 |9 F: z$ _: G
{ h=link[h].nextp;
" d1 M$ [0 j1 {: u   if(link[h].number)0 `) V' _( I) P# L, X7 @
     i++;}
% v# a* }. f! y+ h8 H, k6 w+ f- d2 d
printf("%4d",link[h].number);
2 J1 X2 s% Y; d7 A& J' Slink[h].number=0;7 F) a+ b" O( z) a
count++;
5 a+ _) k! J" Z2 f# ^3 q/ K}
* ]* @7 l7 a" r: G
$ O6 M3 V4 }; X* h( |9 Zprintf("\n大王是:");
1 X  s# z& i; b1 V# D4 d+ Z& v  for(i=1;i<=M;i++)9 s( t9 D1 u+ }; k! o) J. i& `
  if(link[i].number)
3 Y9 L: V- [4 c2 c+ e% g* P$ F0 h    printf("%3d\n",link[i].number);! m& s% z* g8 ?# _; J9 c8 J
7 l$ }. [& M. X5 g
/ |+ H6 s; ?$ M& e: u$ ~
}

7 u  q% \5 Y5 [- }: H! z第三种是普通方法for循环
. ^- y( P0 l& p. D: Z
#include<stdio.h>
3 P9 I0 @4 V" ovoid main()% F/ O  z$ s; W" }# h
{ int i,k,m,n,num[50],q,*p;
* N3 n0 L! E+ l: c! x    clrscr();
& f) L- L1 T% o; A) }   printf("input number of person: n=");- w: Z- i& x1 g, S0 i
    scanf("%d",&n);5 _/ B% M* R! L; R8 o2 p, s
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
6 I' r5 Q$ _- g$ D" v$ k& w    scanf("%d",&q);$ q. K" t4 {9 l0 |0 }2 `5 X
   p=num;- ]9 F$ ~" S, G
  for(i=0;i<n;i++)
2 n* I0 U! {9 d7 d5 t6 N    *(p+i)=i+1;
5 P6 u+ V8 A& x" `  x6 t  S! }" r   i=0;
5 y- c5 H( _6 _4 h: V' c   k=0;+ i& a4 |' q: ]- d- f6 k7 i" ^
   m=0;
& v) |5 R3 U! }5 u( @0 P  while(m<n-1)
6 i4 @- f3 K% C7 Q   {if(*(p+i)!=0) k++;
" d! }% T  h/ M" ^% R3 S# w3 w     if(k==q)
3 _* R( _$ }  x! B      { *(p+i)=0;/ J: k5 Q7 q; M
        k=0;
" W; g! U, }/ x4 e: C7 D        m++;
2 T- T5 Y) M, a# ~7 s, L      }# L/ T3 G" r; S
    i++;
. Q& f! O$ h5 r& w. N# B+ }, I    if(i==n)i=0;0 @7 L2 ]1 a% p" J  b3 z
   }! e0 a0 L9 K8 K3 P8 Z( B" d
  while(*p==0)p++;
: z& ~4 t9 p$ P( Y    printf("The last one is NO:%d\n",*p);
# G1 d; c( i# d9 I" T     getch();9 h. k" R' s9 Q, l% N. J
) d" s6 C/ W0 F. S9 g; M; D( v
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
. y0 G1 k, m" ^  Hnamespace 又费马达又费电
5 i. w  f6 N" k2 n# r! Z* h{8 s) [$ m  f9 x' }3 d( s' `
    class Program
( W' R/ V' w( J. _9 c) G! k3 }    {
4 K8 `% C7 l; g        static void Main(string[] args)% Q9 t2 {* m& p- E0 h5 K7 E3 `
        {7 h: s$ ^8 d2 v% L; a/ q: @1 r
            int m, n;1 H" r9 t( d. {' i" ]/ F
            Console.WriteLine("请输入数组长度");
) I8 ^" f& e1 B$ n% Z            m = int.Parse(Console.ReadLine());//m为数组的大小
, R4 e, G7 E& B8 \9 y            Console.WriteLine("请输入要截取数字的大小");
$ G0 W7 S" ?5 v6 u5 d  j2 n( f            n = int.Parse(Console.ReadLine());
, v* G& t& J5 Q& o  S            int [] numw=new int( o2 @1 b; a$ [5 {; B
3 E: Y0 g* i$ a* }: [3 L
&shy;&shy;&shy;;/ Y) b! v9 B/ L: c& h/ h, F8 D
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
# L  b: j1 B& \/ G  l' Y( E            {
7 J+ Z9 d" W2 A) I9 C                numw[j - 1] = j;
( d( O& o: R8 p# @5 \            }
& k8 v1 A# k& r" P' h8 M            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!/ K8 I: L1 e1 |
            while (d != m - 1)
1 l# G" t$ V% b- q, c, \            {
' W: Y9 J% x/ k/ y                if (i == m && d != m - 1). ~( D2 k; U2 a2 O3 ^4 @& O& h
                {, r- a$ H* `1 B8 t; g
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
  o/ J0 A, I9 f% r3 b                    continue;
" i% ?. O1 f9 ?1 Q% [: ?                }
5 [$ g$ k$ k! n0 z7 E; A6 X                else# Z; }% N  B- B
                {
6 M1 z" Q8 u+ u/ T                    if (numw[i] != 0)2 G# Z. \; c' ]3 S3 L1 W
                    {, C! V: O3 }; [1 u
                        i++;
: L: Q  ?% F3 B# t0 D                        k++;) r  f3 M- k/ m, y3 f* i* s
                        if (k == n)
) J1 i! Y' I% |% ]5 R! W. Q                        {7 _* X/ D1 }( Y
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
1 n2 F! f- h# e5 ?3 W                            k = 0;
3 \) Q0 p% z/ s4 J7 z6 m$ G9 R              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1  x4 a& B$ ~$ b7 ~6 v
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);+ r% W. u: `, M+ D' ~6 O
                        }
7 y3 f6 V# \0 T% j- v- B" T                        else//输出暂时还没有改变数组元素的值5 l; Q1 a. Y+ O2 c( L
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; a9 ~5 B* ?( Z4 \4 v0 j                    }- {; A7 j& T5 m0 S: r
                    else+ V8 x! p9 t0 y, A6 A# f
                        i++;//数组元素为0,直接跳过,不计数。。。
, `6 f, e3 K$ ?+ O& D                }% V' K+ V) T8 z( T$ m! F8 f
/ G4 S! I. [* e0 N9 {

3 L5 A0 C1 J* W2 N            }//结束while循环/ \5 s: a* V7 s9 V/ H0 B( O
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦" U; U. z; b+ `: y
           - m- E& b/ Y0 U) A: t4 R8 x
                if (numw[i] != 0)
4 R% ?# D- m. N1 P6 Q; D6 N                    Console.WriteLine(numw[i]);
) U# O( T1 J" }, ^  _- X/ J           
  x) w7 v" G7 L            Console.ReadLine();0 N; C. l# |! c3 E8 o
        }
$ b! q% c* y2 ~3 s! H    }
& E5 Q! x+ {, a; K4 c8 {5 ?) s}
. Z; F2 E& L8 F4 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, 2025-11-11 11:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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