鱼C论坛

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

猴子问题

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

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

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

x
大家好!# T0 h! O9 W0 K! M0 P+ S4 F5 j  B, g
这几天我在忙着编一个问题,我用了一种方法编出来!
8 j- {* M4 e: w& r/ C但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!$ W3 U  v; M+ g0 `, h2 b! t
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 # q; @. |9 [! \, j5 {! f

. X1 X0 B; K2 f" a  A' m
* }" F. t/ a8 X1 w; r
                            题目
* m( T1 |' I% F' R: `" w山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
6 r5 y4 `% p$ p; e2 s: d第一种方法:利用循环链表/ i2 K+ R* d! g3 u" V" n
#include<stdio.h>
9 H7 x/ V8 @1 v1 J#include<malloc.h>! l% Z6 E% V  {! K! ^5 _6 X
#define M 8            //共有8只猴子% G5 E' c8 ?( L6 @" u
#define N 3            //数到3只时退出第三只
# y% C! Q1 f7 f( X: e- y# dtypedef struct monkey
+ Z2 e* I2 k( P% u# B0 n* V" U" ]{int number;: X, E, I  E2 x1 Y
int flag;; a+ ^( X6 G' y! I, f6 ^, P
struct monkey* next;7 f, y4 [2 \8 }. }
}MONKEY;6 h  D" F  U4 L5 V! G5 n" X' W
main()) \6 j4 \6 D/ @" x' P
{ MONKEY *head=NULL,*p,*s;
# d, F' f5 i" `- ]2 a* S% t  int i,sum=0,count=0;
2 A! J2 C* p0 U8 x% g  clrscr();              //清屏7 r+ Z; J$ z* Q. }( E8 c6 x) U
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
" Y" h) c+ h5 S, D: z# u* ^- h  p->number=1;p->flag=1;0 {% z' l2 R$ P1 z4 K; R. e$ F
  p->next=head;
4 ?# G. J! Y' X6 `  head=p;
) ?, s5 Q1 X/ T9 j- N  for(i=2;i<=M;i++)
& f! B+ n$ A" T    { s=(MONKEY *)malloc(sizeof(MONKEY));; O) d0 s% |# q9 y5 c
     s->number=i;s->flag=1;
. i) J4 l5 b( k; v  m     s->next=head;
' k% N% y% L6 d( t2 @. T     p->next=s;p=p->next;
3 ], _* \+ @. \1 m3 j" R# D" m! t    }
5 t5 ~- T! p5 F7 Q3 y1 _    p=head;( V2 C$ R  s1 j* b2 Q+ E, g) a: t
   for(;;)
2 K) _$ W  e4 N    {if(p->flag==1)# U: p4 P3 h+ j( i% o
       count++;& J4 ~, z! }7 s
     if(count==N)
: ^, V1 o) b# e2 p! `        {p->flag=0;
$ F1 x2 I$ F( j+ [5 ]$ Z9 a         count=0;
/ K) {4 A0 o# E         sum++;}
/ U; z& D7 N( j2 s, [: ~     if(sum==M-1)
0 j0 G* J. {0 P/ a        break;- s' V/ O- Y4 a) Z$ i% E* m( M
     p=p->next;
: S/ v9 i' D1 ?    }
: H/ r5 \5 O" ^" ^* m    p=+ J9 |4 ]7 k2 O/ t
    head;! t0 f: d8 R: G6 v9 C! t
    for(i=1;i<=M;i++)
* _& v7 o) f" R    { if(p->flag==1)
8 n" M- ?) l/ U9 `# w1 h        printf("\t%d",p->number);
: K6 p0 Q0 ?3 K+ m2 c      p=p->next;: _/ t' E; t" x3 }9 Q
    }) X* B2 G3 C: u/ g' R
/ y$ q, H& K1 Q( E# ?

9 Q- u& Q) n6 h3 A- h( R) F! w) d. M. [6 U  ?
}
# Q1 ^" s% p4 [+ O$ H4 E% h( b
第二种方法:数组8 D8 G: C$ v) s2 l- |; ?
#include<stdio.h>
: G0 q5 T) c& K#define M 8
+ ?, S# S4 h* ^3 k! fstruct monkey3 e( |. a! C* F4 w9 ?( @
{int number;
7 b. t  F, y% Y' w2 zint nextp;
! @! U; e" M: A" j2 X% t}link[M+1];( @; E; @  v# {8 h7 E2 S5 y
  ?3 E6 m. r8 S4 B
void main()) m0 e- B$ H7 i1 t
{int i,count,h;
7 d7 |0 T. y7 R% ]6 d( X# D; Tfor(i=1;i<=M;i++)7 y6 M# ~- F- l  |* L" q& @3 }6 p: k% h
{  if(i==M)) o7 b) \1 i7 H7 z
   link[i].nextp=1;. ^; B' Q" @. R2 X: t' b
   else, h- C5 h7 v! |, G0 U$ }2 P% I
   link[i].nextp=i+1;3 n( k/ K: k+ W1 n
  link[i].number=i;
( j; Z% i, c1 s}
+ }  Z5 Q/ E# c; a# K2 mprintf("\n");" `' f) W, Y$ r8 L
count=0;
% Q  p( I: z2 t/ I& \h=M;4 z8 ~7 Z! t; o# X  _/ c
printf("依次退出的猴子: \n");
& V- l+ }8 @7 r3 c7 G( k$ J& lwhile(count<M-1)1 E4 o  a8 s0 _
{i=0;! i, e9 e  W7 e! m, D4 o
while(i!=3). U" f) r2 J& p6 o, a# u$ }) |
{ h=link[h].nextp;: t, \7 x. G! |+ O
   if(link[h].number)
5 X' i8 D1 T: Y; X2 D: m- z: {     i++;}" F! \5 l" P2 p% v* z/ L

0 {0 P8 W4 f6 V0 `printf("%4d",link[h].number);# {9 }+ ^5 g3 y9 ?* l1 l; L( N: {
link[h].number=0;0 P, _  \5 `# F4 P
count++;
" S% n( d7 g: C0 O. [6 x" s* h}
+ s+ C7 z, _! `1 Q
" R& M  O& [" B6 t0 h/ h) Zprintf("\n大王是:");3 Y. D: _! x4 B& E$ A5 `5 v
  for(i=1;i<=M;i++)' l9 y, D) D. m' b5 e* S0 C7 H
  if(link[i].number)/ e) x4 F8 }1 j  U8 `6 A* v1 Z; H4 o
    printf("%3d\n",link[i].number);
& e2 m8 [# Q8 o4 T6 E: ]- G' Y6 n$ _6 d5 d3 D# d

) I: N7 z+ n; T, _; o! N}

( ^+ F( w0 }2 q/ m第三种是普通方法for循环

- d: @6 x! B" {1 [9 [#include<stdio.h>* K5 \8 W0 m( Q5 Q/ D" V
void main()
0 r% `; ~0 B+ `  f# D{ int i,k,m,n,num[50],q,*p;
' e6 }( y2 Z: ]    clrscr();
9 a8 c+ w" n( K   printf("input number of person: n=");1 H9 M+ _4 w1 F( H( m
    scanf("%d",&n);
" l3 a! I: G3 r- t$ \printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只. K+ }) Z/ b6 x# a
    scanf("%d",&q);
5 V9 S$ q$ S; A+ T9 H8 {   p=num;: W1 o& x$ m/ M
  for(i=0;i<n;i++)
' ]' Z- y; t/ |+ S) A* z: M7 N  n    *(p+i)=i+1;
) @! d) m. r7 H3 C- c   i=0;+ P: N5 X4 ]- F2 F1 @! [
   k=0;2 t! a8 w$ s0 N3 \1 H* j
   m=0;% t! \$ p' U4 P5 @1 U- c/ x
  while(m<n-1)' @8 o0 Y: |' c0 g& I" m5 D
   {if(*(p+i)!=0) k++;
- W/ p7 e1 H  `2 ~4 q) W     if(k==q)
# ]: g% }3 w2 `" H2 F      { *(p+i)=0;
. e0 U( Q" ~, D' X1 v7 S9 H1 J        k=0;5 i+ `+ |7 I6 o
        m++;
3 b( m( p/ r( R7 o3 d      }4 Q: V6 s( }+ i
    i++;+ z# ^8 |' {6 p( f9 e
    if(i==n)i=0;
" `( O% A) k% b- P' ]5 x/ ^   }: c/ Y' l) t4 h! G' Q. W
  while(*p==0)p++;6 q& Q0 M$ j6 L5 m5 U
    printf("The last one is NO:%d\n",*p);& c3 ?0 C) ]1 b3 S4 V; H
     getch();
) E0 w# Z1 @$ H! Q6 q' [; ]' K2 g( i$ u+ a$ D4 M
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
& `7 z) Y. E. x$ F0 K% _namespace 又费马达又费电
! r) r, ?4 W) ^{
  J$ j& [6 G9 t- V6 L/ E; i    class Program$ B3 O* M% _" J& R3 e% }
    {
) q8 Q( U5 X$ V8 I/ x6 @  r        static void Main(string[] args)9 P* m, v. B/ V9 J
        {- x! j4 H0 J. o! H
            int m, n;
( i. I- N+ K8 L$ a1 z$ D3 `            Console.WriteLine("请输入数组长度");! `% ^, ]- a# d; d
            m = int.Parse(Console.ReadLine());//m为数组的大小
+ j* c5 ~8 |$ b7 v) z! h+ O$ S            Console.WriteLine("请输入要截取数字的大小");* s: p# C0 Y( h& U" w
            n = int.Parse(Console.ReadLine());
: g% e9 P! t/ x1 H; [' Y: z, f            int [] numw=new int
. e. G, G. R( J% G( {6 M8 G# y$ m8 n; K$ y6 j4 I; {2 Z' h  l& j
&shy;&shy;&shy;;
5 N) @- h4 B2 H/ n! k% D; i+ p! s            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
) {0 K. I: e' E, h8 K( C* r3 Z6 @            {2 u) A+ b& r/ ~! ~& S
                numw[j - 1] = j;
1 g- i/ K5 W+ s" y, `6 m/ Y            }  r! s  o4 R0 p
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!. }( T* L0 x$ R9 ]" y  N1 Z) N
            while (d != m - 1)3 l1 D' H. C1 t& N6 f; ]: F
            {7 m- O: D9 Q8 P
                if (i == m && d != m - 1)
1 `/ e* d+ M+ o5 F3 O                {3 J- i* `+ J8 Z4 q! ?# C& x0 M
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!! e" X8 F( d4 k2 I3 S$ A" _
                    continue;* o  t; P4 X; ]) M
                }( K$ H. G' s& Z% K
                else4 Q& f( k& x$ D. W1 K
                {" v& {' v! k0 e6 Q# r3 l$ p9 P# Z7 t
                    if (numw[i] != 0)
- l& y/ B1 T6 g/ N! ?                    {$ w: _( b8 Z6 ]  b4 |
                        i++;# L1 U0 w, C0 e) B- x2 J
                        k++;
6 \' J1 l# e* a! O" }% U/ u                        if (k == n)
! i  i( G5 N9 l                        {+ ?- A$ y* l" w; O2 s) `
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
' U  r: B+ m/ c; w0 J                            k = 0;+ w* c/ Z( ^) t+ t6 T
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1: ^" x# t, c, _6 K0 T# G! [
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
! A" b! V2 {" Z                        }
, M/ R- H4 S6 j6 Q1 N3 f                        else//输出暂时还没有改变数组元素的值$ F0 e- ]8 y/ M/ g- q' G4 ^" l, f
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);7 J4 s+ K9 ]4 k. q
                    }
/ ^+ u1 M  d4 c% i                    else
& G: `2 {+ T/ `3 Z* x% z                        i++;//数组元素为0,直接跳过,不计数。。。0 K! }  s. l0 j+ z3 S* w
                }
' m  n9 [: `+ w7 |/ ` # j9 S4 w8 |( V$ u) N9 q

" _& R# E3 K6 `1 U1 @5 b            }//结束while循环* @5 K) U' w( Z
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦5 |7 N/ ?/ H+ j+ Q" q7 v
           
/ j$ D2 ]! Y& n                if (numw[i] != 0)  ^. N" N6 X' Z, {5 @
                    Console.WriteLine(numw[i]);$ N2 b6 b. C$ [9 S, ]& \
           
8 w7 X6 k6 W: r3 L8 g4 U            Console.ReadLine();, o5 k) X& X! W% u5 ~6 m9 I
        }
! V4 E8 Z: A5 n+ L* h! l2 o' }* |    }
$ Q; f3 d/ z' s1 ]! V}4 t( g% {9 S- z
小甲鱼最新课程 -> 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-1-10 06:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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