鱼C论坛

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

猴子问题

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

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

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

x
大家好!  N# V% F  k& I$ F+ U
这几天我在忙着编一个问题,我用了一种方法编出来!
5 O/ ^4 ^' u6 A) s6 K3 f% a但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!+ @; l) y0 J1 M  V% w1 w: \- U
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 5 q1 Q( G+ U" M
" p2 Y6 Y9 f5 M0 ^% u
: r( l: z5 n5 c8 q0 c. f
                            题目  u# t2 \, a/ m
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
% K1 t* g, g: E" I9 {8 e+ ~第一种方法:利用循环链表. @/ n9 s# Q2 \1 F3 B5 `* A
#include<stdio.h>, X& z, b% Y  J# i+ D
#include<malloc.h>
& Q+ d! y& |1 d6 ]( Q2 b9 O! b#define M 8            //共有8只猴子
1 r5 F$ j; |) d( i' Z#define N 3            //数到3只时退出第三只# j: l; D4 P- B1 r1 i5 N7 t
typedef struct monkey7 h; c1 n8 |2 W# N: h! U4 U3 d
{int number;
, o" w) y" s1 O6 e- l7 Lint flag;, t" r! j- O: P9 S; J9 y% b' C
struct monkey* next;
4 _; N3 o. I& M& U) A* u% t9 B' K6 ^}MONKEY;
5 q; i6 {& i1 p/ y3 l. nmain()
6 Z' S6 a, T" X: W1 n& U{ MONKEY *head=NULL,*p,*s;
5 ?/ E# R, y% \0 R7 N6 D& ]  int i,sum=0,count=0;) J+ ]  P4 f; X+ D2 c9 c
  clrscr();              //清屏6 j, c3 S) O+ w1 x; P; I
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
. B! p! x7 n3 v3 o  p->number=1;p->flag=1;
/ E9 X; X# q- z% ~  p->next=head;" @/ U, r) q2 d3 Q0 s, h5 K
  head=p;
, S3 z3 X! e' b9 S  for(i=2;i<=M;i++)1 h; O) h- O$ ^+ p$ A8 {3 n
    { s=(MONKEY *)malloc(sizeof(MONKEY));
. O. Q/ ]9 p  F+ e     s->number=i;s->flag=1;
8 t: M9 j( s) v1 J6 ]3 X( c7 O) B9 m     s->next=head;
6 R, W2 N& O% F3 a) Y1 i     p->next=s;p=p->next;9 T& Y. f6 K: R& q! Z
    }
) @6 ]; |' p8 w) S" A    p=head;7 Q4 D$ l& N( J: i! X
   for(;;)
# h! E9 }: S9 Q! h4 ^8 C% u) G    {if(p->flag==1)2 F, q: E) p3 T: |
       count++;
# x$ L0 }3 [' |8 I. w: ^* T( h     if(count==N)7 W+ k% y5 t! B( R
        {p->flag=0;
- G; M! e; p# O3 G         count=0;# A, d- {( f# l$ C# [
         sum++;}
! Q" s  T0 [/ S: D, I5 n: U1 m     if(sum==M-1)
" S* W5 ^1 F' e: B& V9 O* a        break;) L* `2 Z9 \" T3 @. {7 n
     p=p->next;2 _* n4 Z# ^. H
    }, E9 G* m# S  W: }5 q
    p=
9 Q5 w4 t" B) ]: ], A, Q    head;: t/ j( B2 m, E0 E
    for(i=1;i<=M;i++)
$ t) E' w# S8 r) V+ r9 h/ c5 S0 E    { if(p->flag==1)
. K$ x2 l5 \# T5 [        printf("\t%d",p->number);
2 `1 l; _8 U5 g/ @" d5 z1 j      p=p->next;
5 u1 n+ [6 h" B; H6 W% v5 X3 t; l0 o    }) p3 Y: L- J* x

, m2 Q/ E0 D: v' |/ [% I6 n# {: e; [+ h( C6 x

0 e6 B0 a& K/ o# B+ }}

9 h& Y: ~9 G7 m' o第二种方法:数组# F0 [7 d9 s6 a
#include<stdio.h>
: V+ e; h7 ~+ ~3 q  ~#define M 8
2 F% m8 ?" L, `2 J! |& f9 ^0 ^& Wstruct monkey" D; C5 |+ E1 V8 S/ [% t8 m* z
{int number;+ S0 y8 _1 @- Z3 n- p) N
int nextp;0 r- G  r/ f' t2 l4 v+ r  b& E
}link[M+1];! Z& g! W9 u: H' R) ~$ L& d
7 M- \1 y' s4 M' m# u" D1 ~
void main()
3 @9 f: v5 R, K{int i,count,h;
" ~4 T7 R7 e8 b* Ifor(i=1;i<=M;i++)
) s1 ?* r% o% t! \8 u8 x+ w{  if(i==M)8 F1 f: P* n2 ]7 c% V* v
   link[i].nextp=1;4 P! b' y  `  U0 d
   else
+ j$ \, S' y+ r. f" D0 I) j   link[i].nextp=i+1;( X2 A, f. s; C! `5 v! H
  link[i].number=i;$ _4 g4 g6 N& B7 l  p; h" w4 P
}
* \# o8 }! E2 `3 E, Rprintf("\n");
/ D9 G3 W8 S8 P, e1 U6 Ycount=0;
4 H8 ~) d# y6 [$ |+ Kh=M;
2 h3 R' }! p0 aprintf("依次退出的猴子: \n");4 W" e4 [2 C. ~" V0 L% u
while(count<M-1)
6 g" ?: t( d+ _) \" v$ p{i=0;5 z7 _9 @" q3 {9 x, l: `, J
while(i!=3)- j, g  l3 _; E5 U; i- j( z* E" B* U
{ h=link[h].nextp;2 h$ f* s" \+ C% _6 V9 H/ H7 q% ]( G
   if(link[h].number)
1 P  U1 R7 h/ S     i++;}
0 v' C3 v$ i' s( s0 R9 |2 ]% K: L$ U
7 j  Z' S/ e7 ^* e' |1 [printf("%4d",link[h].number);
( o  I+ ?1 l1 E6 Mlink[h].number=0;
3 w  e% j: _! `' m6 X- Rcount++;4 @% s3 U& a! f( T# o1 ]: p
}4 q9 j  |& B: V0 j; z6 h
. j! l5 P* D( I, w9 C
printf("\n大王是:");+ d- l# S2 ~0 X
  for(i=1;i<=M;i++)( d: Z# M$ l/ B. Z. H4 |# X
  if(link[i].number)9 y3 k" g! Z; H" r0 V5 t
    printf("%3d\n",link[i].number);3 W8 C8 ^9 l- d' _& {' f' E
. [. [6 N' k; u6 E

: s% j' I8 g/ x}
3 w; N; t" P; {4 V1 Q& b/ D
第三种是普通方法for循环
6 J2 Z! b! \* o; e8 C% g. P' h
#include<stdio.h>* A, X* B+ Z# u- ^
void main()
  {5 B; [5 U# v2 t# i0 U{ int i,k,m,n,num[50],q,*p;: y& Z9 U  P% M' L0 j+ t: _; N
    clrscr();  n2 y* x; V  F9 ?/ x
   printf("input number of person: n=");; l9 L$ |1 N- M, i
    scanf("%d",&n);
! p0 t. N- V- d3 r+ `( d3 o! Gprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只' G4 D; [/ G) P4 t3 f
    scanf("%d",&q);
( v9 P, s- P( O, @2 w   p=num;; V2 `8 H& p: ^" v5 w; V
  for(i=0;i<n;i++)
  E: o0 k; r' ^  _( M& Z9 x    *(p+i)=i+1;
5 b- o& o" R: P& O$ o$ A7 s" d   i=0;* Q. ^+ g, z, v6 X8 M
   k=0;  j- @, Y% `  x
   m=0;" K+ ?, l. t9 _0 A6 W- K! w
  while(m<n-1)
, @" {; S8 }) @5 U) u& V   {if(*(p+i)!=0) k++;
! o8 {" y3 V% g7 G# F7 Q     if(k==q)" M/ @; u! u6 c- K3 z& n+ O
      { *(p+i)=0;
0 ]; T' Y6 S; _) k4 w& I' B1 P% C/ H3 A        k=0;
$ B2 i- {- d$ f" v9 L        m++;
7 j# s3 r2 [% B" h# J      }
- ~& m( X& J" S- q    i++;
! d% i5 e' I1 i) j' z    if(i==n)i=0;
0 M1 Y3 S8 s. `: B$ G5 W( V* [   }, B6 P; v( o1 u. [3 T1 k
  while(*p==0)p++;
7 g0 U# Q) w4 ?- H7 X    printf("The last one is NO:%d\n",*p);, H4 k6 E* T, e+ y
     getch();
+ D/ a& @# i* R9 q* t. u7 i1 ~$ V) }5 ?* f0 F+ Z
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;+ `7 P1 y) R8 c2 g' `! e. b6 B
namespace 又费马达又费电
" s* o. m% }, z  O{1 h, \  L& N8 @1 i1 \* k5 @! j7 }
    class Program
; o( V: V- h( ]5 Y% ^- m5 G3 }    {
- E0 n' ^( G) v2 H4 r0 J6 t$ K. {        static void Main(string[] args); ?, m, ?: p8 ?- }
        {
/ a+ p- L' K/ S" d1 `/ `3 d5 l            int m, n;
' n" q; N4 N. O* k0 \2 m4 c6 y            Console.WriteLine("请输入数组长度");' a, K# F0 Q% B
            m = int.Parse(Console.ReadLine());//m为数组的大小
+ f8 F! X, t% ~- o+ x# G$ a            Console.WriteLine("请输入要截取数字的大小");% K% H: q" l" Y5 `9 a* v5 h# m5 y
            n = int.Parse(Console.ReadLine());
8 K" K  Y( o% S$ F' v+ B# l            int [] numw=new int
3 K/ t6 Y! Y, @' d+ R: c; m& _+ z8 F: M
&shy;&shy;&shy;;( i# J2 f, |( N
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数' {5 T3 S7 U" }- ]& F1 o
            {3 w6 j+ }& D% W
                numw[j - 1] = j;% G) U$ [/ w% w" b; a. g- U9 I1 I
            }
& P+ i  T9 i$ k) G& N5 O! ?; [) q            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
, K, T, k; I/ B8 Q- D6 F1 K            while (d != m - 1)7 h% b; M( @! o9 U8 s
            {3 }# R+ k' g8 a
                if (i == m && d != m - 1)$ g8 c+ l( b/ `% I) n1 L
                {9 {7 m/ b. Y- I! q* X
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
. s7 I0 Y" H; i% I# A$ }# ~" a  x                    continue;
% n- b' l! c" {% E1 g8 d                }% J& W* F2 e" `
                else
$ b& ?$ r  c( t" X                {
! E: ~: g7 K/ S) |# t; p, w. G                    if (numw[i] != 0), ^& h/ R! v/ c8 M8 M, R
                    {$ M3 u3 N0 M! ^: E* T
                        i++;
6 J4 L* ]- v! p. M                        k++;" w! i0 G9 S9 k3 Y9 l( f6 Z/ L' K
                        if (k == n)
( j  P9 D0 M" Z" _                        {
3 C4 j' H9 |, Q6 S3 V: @+ V                            numw[i - 1] = 0;//把在n位置数组元素的值改变了7 [% P  r) S8 c* _
                            k = 0;
6 V$ l& \) s' \( B$ w              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
5 P) @; X8 {, H' h: m8 p; l$ i                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);7 y) k) Y1 X4 ^2 \$ f
                        }% Q% W5 R5 r( ?; e$ S, [
                        else//输出暂时还没有改变数组元素的值
/ F! k9 q' O6 p/ F" F" F7 K. a1 K                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);& Y. M% m9 g6 p& R$ n) F3 T- w
                    }
+ @$ n3 h& a5 p: s/ R                    else
, \$ y. _9 G  }8 B$ ]+ f                        i++;//数组元素为0,直接跳过,不计数。。。/ S( I  a) n4 E: T6 p1 C+ i
                }
) K  \2 S/ M+ Q
8 v: ~6 f5 V6 p+ y) n; a5 o# Y4 `6 O; D0 b) A. {
            }//结束while循环; i$ e/ O% e: z
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦  N* H& Y, d0 c) X. v2 h) @" i+ w% S4 [
           6 S  ^6 z: q4 B; s
                if (numw[i] != 0)
( I3 B, J- ?. B1 ]; o' \                    Console.WriteLine(numw[i]);( j0 k/ k+ ^2 \; z/ M5 n, e
           & G; q$ |! A1 [" L# s& E( E
            Console.ReadLine();
9 c( h! A6 w( G1 I        }
2 p, }9 }" ?& J( m3 Q    }
/ w& Q+ ~) V; U$ `, P! S5 D8 X- }}: n9 r7 o' ~5 k- K
小甲鱼最新课程 -> 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-4-8 01:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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