鱼C论坛

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

猴子问题

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

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

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

x
大家好!9 c. X6 a% A0 j
这几天我在忙着编一个问题,我用了一种方法编出来!
9 ~4 D9 y, R4 G. n2 ~; J- f但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!; l  |1 {! M$ L
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
% m( v# L5 V0 W4 j3 X) P- d
" c. e4 q8 E( Y
. O7 c" @; {" \3 F7 M0 P
                            题目
3 C+ k2 L$ K: |& M' z/ y) ]山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
1 w3 j3 o" D7 L% Z3 o第一种方法:利用循环链表
6 b! q* s, {3 r+ ~' p#include<stdio.h>
( b1 v3 |) P" b! _, P/ v/ D2 g8 O#include<malloc.h>
; o+ ~9 N/ R  j$ ^#define M 8            //共有8只猴子
& N9 w, K* O; j#define N 3            //数到3只时退出第三只4 ]  g6 T1 b7 t: M% n9 K: ^8 i
typedef struct monkey( P6 h4 q8 J( _& J4 U% e' _5 u
{int number;6 l, u3 f# C, z# u) w0 |, W
int flag;) b5 h* p  n) A7 u- E
struct monkey* next;" B9 [9 G/ B$ R& L) i7 W8 u2 V
}MONKEY;2 x( H4 j0 m) n4 \
main()
2 O( c; t8 N& u; d0 ^{ MONKEY *head=NULL,*p,*s;
. k3 S4 Y, b: {1 {- Q" }$ ~  int i,sum=0,count=0;
# d) l5 k: J% J% k3 X7 l  clrscr();              //清屏0 S7 `8 V% d9 f/ n. S* [4 J  O; U
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存, |; g0 k2 J7 e5 @1 i/ E' e" E( t
  p->number=1;p->flag=1;( f( l$ N/ O8 g, u+ i- }1 F
  p->next=head;0 Q0 ~2 ^1 I( Y  Y( W* C
  head=p;5 \" I' Y2 a/ O" J' u* C8 b
  for(i=2;i<=M;i++)
/ L. I$ [: L) b9 C* O7 v    { s=(MONKEY *)malloc(sizeof(MONKEY));
" |" `+ ]" `3 r9 J     s->number=i;s->flag=1;
* w' `, W3 C2 s( o9 e$ \2 ~$ I     s->next=head;% O0 e3 T- W5 c
     p->next=s;p=p->next;
/ u; h/ J. [& {% ~  d* R+ L' E    }
5 a3 l1 U  |) r    p=head;) Q4 }  d3 A, q
   for(;;), `% l0 ~# N# t( f3 o. @
    {if(p->flag==1)
  q& }" B5 v4 n# \$ L* W1 l       count++;' N0 f5 |$ C/ e0 W5 }
     if(count==N)
5 r9 L8 y9 A$ X2 c1 t        {p->flag=0;
$ g/ z- W7 {  O2 R% e! N7 `) O         count=0;
& ?. E% Q1 b; }$ a1 S         sum++;}
6 l1 z) J, z% _     if(sum==M-1)7 ^0 D0 E. Q  w& I- s8 `
        break;
8 `/ r, C' Y% i$ {% |: K2 P% ^5 c     p=p->next;( {7 ~' e6 N# g/ @3 d% R
    }" D- {# B! y1 T+ a# E' H
    p=# z7 i) f2 X: e6 }
    head;
% H+ H# j( Q2 W( f* L7 x; ^  e    for(i=1;i<=M;i++)2 k  m8 k$ b- V0 Z6 g
    { if(p->flag==1)
0 z; {# W. E- ?1 M, K        printf("\t%d",p->number);
1 F1 p% K. d; l9 }" m. H6 L) r: G      p=p->next;+ b% Z0 }6 x/ y  P- b' L6 Q& e  i
    }1 k% \5 F6 U' x- [. O5 _! y

% ]9 H* ~5 g* z% m2 k$ f+ v; d  V2 p* s5 B+ W

/ d2 E! I- g) T}
3 r$ }# ~3 C9 H4 p
第二种方法:数组( v, A5 v( u9 T, I' J5 x
#include<stdio.h>
7 e# W6 a7 A; }3 X; \" N2 ~#define M 8
2 o! E) _0 v; L' Istruct monkey+ h, i& [2 `3 T
{int number;
. m# G; h+ C" N$ U) P" ~int nextp;
, i. Q  S% m% F0 h$ l}link[M+1];; I. q5 r* f: u7 p
# Y5 u+ w  L- Q
void main()
% _; \% f2 D5 B0 O{int i,count,h;" {* d$ h3 }* G3 y  p1 T7 A9 _/ b
for(i=1;i<=M;i++)  G5 U: D3 R3 h
{  if(i==M)
/ P/ A9 b6 q7 y( q1 t+ {! K) N! W   link[i].nextp=1;3 a( C  x4 X3 Y& [4 e: X" D6 ^
   else- w# J1 _4 b3 c* T* h
   link[i].nextp=i+1;
" {9 Q9 b  M5 x* k1 i) C  link[i].number=i;7 e- g0 k+ ]- r7 U
}
% f; h. j, Y) K( a2 V( Xprintf("\n");5 n- z( E1 i7 ~& w
count=0;
4 e* d6 z4 o$ z! O; C* Eh=M;; @" i+ K% o' X/ }8 x$ ~
printf("依次退出的猴子: \n");
9 m' J& _+ p, k* }3 nwhile(count<M-1)
9 l6 T$ h8 Z, G2 h: a6 `) C( x* q{i=0;! M: L: U4 o$ g% H$ p; m
while(i!=3)1 e  e: s9 H5 a0 ~' R' N$ N/ V
{ h=link[h].nextp;3 m. Z+ p8 Y# z" ^
   if(link[h].number)
7 _# _5 h  C8 m5 E8 O, J1 ^     i++;}
8 B& D8 d' E" y; ~* K6 N( ^2 ^' o9 |4 x6 ?( {9 M; d6 `# }7 }" m
printf("%4d",link[h].number);
: k, N% W4 A7 S, blink[h].number=0;
+ w# C/ u' E3 I  |+ J1 p; z7 Zcount++;
( V4 y) N( |* p$ s4 w" S+ D}
5 O$ [& x+ ?3 z
' ?% X1 U" k/ ^! L2 wprintf("\n大王是:");) U' J" R' w- m  z
  for(i=1;i<=M;i++). Z& [& k0 _' s* A" C
  if(link[i].number)9 `- {0 R4 U. X
    printf("%3d\n",link[i].number);8 Y" p6 y# \  b' M

" P! A. W* {* W' ?( X& C5 F5 j2 P+ \  Z' E1 Q' V
}

2 a; B+ _, v3 N8 {1 d第三种是普通方法for循环

/ A/ ~, z* J1 u% K9 @/ [#include<stdio.h>: `/ S3 s0 e8 [4 m
void main(), ~- z0 ^! q5 z
{ int i,k,m,n,num[50],q,*p;
8 z" @2 V9 e: K5 g    clrscr();  Y! n2 j/ j% d9 H6 g/ D
   printf("input number of person: n=");
. ~8 O' X# w& z    scanf("%d",&n);
2 w* ~) r$ I8 e1 i( u% Z' C) vprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
5 e9 T2 X) F" ?& _+ H    scanf("%d",&q);( Q) ]: ?& \. _) F" `/ k5 x0 `% Z2 y
   p=num;4 ]7 n, S, w- f! g( n; e# R' i
  for(i=0;i<n;i++)
5 A, l5 I  z2 ?* m6 e    *(p+i)=i+1;* e  D' O" E+ K+ o1 C1 \  k
   i=0;
: S7 [2 g) r5 V& C" X1 X1 l3 n   k=0;
( z$ z$ v+ c* |' m   m=0;8 d9 b# f% {1 S! J
  while(m<n-1)
, m0 V3 ]( [" F7 g. y1 D   {if(*(p+i)!=0) k++;: U8 `/ h5 d0 D0 b$ P. C( C
     if(k==q)/ a6 L; G- x* z. s& f! S
      { *(p+i)=0;- W% E- I+ v8 b& @' o' i! S
        k=0;/ U0 W9 e: i  {" H* A9 k* S
        m++;
# h" p. q5 k" @      }
  K2 [: k0 J4 h. K' S    i++;; f/ ]4 v1 @. Y
    if(i==n)i=0;
. h$ H; x2 W  E- C; @7 J* F   }+ S* V$ ]/ i8 y7 u- p# \
  while(*p==0)p++;0 G- V1 N; G  h) Q5 P
    printf("The last one is NO:%d\n",*p);8 r4 I) q& n+ N7 {
     getch();
: r6 V# ^+ _8 R: [% T0 b3 l5 e# J% }
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;0 N! w  j% {: o5 |
namespace 又费马达又费电
/ O) G! [! F+ S7 K9 S{1 I' {/ o: `2 X  U( |
    class Program
0 K; g8 L1 T2 y& z    {
) b' G- W7 U( d7 s8 ~/ f. q9 s        static void Main(string[] args)4 [) C& @  t: c; }  N
        {7 S. q. [  g+ Y; Q, e
            int m, n;
# j( U$ x2 p* {  n9 [" F) Y( k* m            Console.WriteLine("请输入数组长度");  h- w$ V# @' p2 O
            m = int.Parse(Console.ReadLine());//m为数组的大小4 D" O" l, z0 b: p' w
            Console.WriteLine("请输入要截取数字的大小");6 @2 ]+ x9 T. X- Y( [. ^
            n = int.Parse(Console.ReadLine());$ @5 A7 H3 t1 J" D# ?. F  y
            int [] numw=new int3 F0 t1 V+ H6 @: G, v

; X7 a/ o4 D& y9 [4 N5 j5 F&shy;&shy;&shy;;: H# \# ]5 f3 o- `+ M$ [  O
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数. t, l0 H, P/ w$ Q  u  E
            {
: r( L  e7 u& f% F; d# O                numw[j - 1] = j;
" k3 R5 W* A  @# g6 D            }! h2 J; q. ^! I6 S5 E4 e! h3 S! \$ ]
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
9 h2 G$ C9 d9 Z0 l3 O6 f2 a. {            while (d != m - 1)2 r+ A! s5 e& D+ V* u$ i
            {
* ~8 @) Y: l# U& r1 `; Z                if (i == m && d != m - 1)) `9 A+ M9 n; n  W! Z' s5 }
                {
5 f# r( m& M  }! R8 j* v" J. G                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!5 U  Y$ W0 y6 q& J0 w5 O
                    continue;: l  g: g. g( D2 v
                }
. i" C2 S5 ?1 Q; M2 v. Y$ X                else
# n6 @. M1 l% h* y+ T  H" Z                {1 M7 l' q6 V2 V$ k8 E
                    if (numw[i] != 0)4 }  ^* E+ d. ~% u
                    {( a4 S! Y& T3 C/ B5 u- C: g9 N3 ?, k2 c
                        i++;
4 {& S3 m/ s- G; K6 _                        k++;9 p' {( \# K8 v# {4 ^/ A
                        if (k == n)
9 z1 b2 k0 d& T( M' d, r2 K6 w* J                        {& k' U/ o  S7 N; k
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
7 U$ v; f; _+ [7 N2 T; ^                            k = 0;: J5 s3 U3 A! J( I' E+ I/ R2 S9 d' u9 ?
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
- g! i' H" g1 k+ }' \: R9 t                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
$ h+ R7 d- c3 {' ^. U8 ~' k                        }
# I! E6 D# E. m4 ]) a                        else//输出暂时还没有改变数组元素的值
% i; g- A5 ^6 e8 k                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
* Y7 s" e/ B# n8 {% ?  T                    }
: g9 o( p3 N6 D! B6 X                    else9 M* w: `; i$ h. z; v+ q& v7 ^  R
                        i++;//数组元素为0,直接跳过,不计数。。。
, v% d% Q/ Y& ^! B2 f                }4 C/ \5 E8 g+ D7 g4 B
; E& K$ ], w2 i8 m$ r7 Y7 W

, J+ ?5 [5 `2 {6 _: R" D            }//结束while循环
  Q4 s. Q: i& L& X! G            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
8 H) ~' H( L! ]           & d4 \, {) a/ k% L" C9 @/ g
                if (numw[i] != 0)- i9 N6 `2 U6 }8 Z( a) w; ^
                    Console.WriteLine(numw[i]);
  @$ j% L! x' }: W7 q           ; _  a5 z6 Y" G9 f0 k& j
            Console.ReadLine();' _; \: g/ K4 d: ^
        }' C- C: b0 G) O) `# e
    }) |& c2 I/ R0 p: P! `  k5 L
}7 f6 E: ~6 R, _( |' W
小甲鱼最新课程 -> 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-4 19:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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