鱼C论坛

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

猴子问题

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

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

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

x
大家好!7 }& ]% \  d$ j& A) `. J9 |
这几天我在忙着编一个问题,我用了一种方法编出来!* O- g, ?! E6 m2 a
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!% e# D! x( B6 Z1 ~' w
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
* a( S1 c" J* \+ Z, z9 Z  C% T
- S9 A3 q5 b4 d  G6 r
                            题目) S* y  G9 i3 _  _, {9 V5 D
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。) o: J) t2 m2 L7 E; C, i
第一种方法:利用循环链表' }0 _. R* a4 w5 E+ A5 t3 `
#include<stdio.h>1 ~( N) Y! B. w2 y& u/ g0 Q
#include<malloc.h>& J5 M1 F. j) h7 j) r
#define M 8            //共有8只猴子. p* W* O' x% J& a- M
#define N 3            //数到3只时退出第三只: t3 w; O4 g* Y1 _7 s4 y! O  [% A
typedef struct monkey
9 l$ e( i( d; v; U{int number;" z7 W2 a6 f1 g  v+ \- h
int flag;
+ K2 I3 j) r1 t. X! L  n& }8 K! I. bstruct monkey* next;$ q- I1 x5 {4 f' S$ ~5 s8 ?
}MONKEY;
9 [. h$ e" l" t* emain()$ {6 F' j2 N: |. @3 Q9 {7 _/ h
{ MONKEY *head=NULL,*p,*s;1 O/ o/ B- x) \# v
  int i,sum=0,count=0;
& e4 I- p/ n: f, X* f  clrscr();              //清屏3 `& [* B0 {* u. {1 w
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
+ ?4 [* g9 D) `' z  p->number=1;p->flag=1;+ e. ~: H: _# k" T! d
  p->next=head;
) T" m& e/ _, q8 A7 f  head=p;
: O$ R( ~, V: T: x1 S) @1 W  for(i=2;i<=M;i++)
' q4 y3 O) @2 M5 d    { s=(MONKEY *)malloc(sizeof(MONKEY));9 j% g1 u% a5 V1 R
     s->number=i;s->flag=1;
8 P) G9 p$ c2 C9 I. r- l* M9 K     s->next=head;
/ H" h& W; t5 g2 M! r8 M: Z     p->next=s;p=p->next;; t' f; B4 w0 x% ^, F+ o$ k
    }
, \8 X0 Y. z9 \8 i% R    p=head;! r. Y% _1 t3 `9 Y: ~3 Y7 r
   for(;;)" b- h. p( X: H+ Y0 \9 X
    {if(p->flag==1)
, a& y# t$ n  O% w       count++;
% z3 ?+ L* ^% J- w/ C- n     if(count==N)
# e0 y3 T, J& A* \$ G& x; @        {p->flag=0;8 B4 I& d2 F; [4 g4 j" a& _
         count=0;* R" H$ ~9 G- M
         sum++;}/ L) }& G5 Z2 A/ ^5 U1 q; j
     if(sum==M-1)2 j: T3 e, ]- v) Y6 C
        break;/ x$ T9 l% `3 b3 ]4 F0 i; O- V
     p=p->next;
! Q7 P2 |9 c6 y: i, d. b5 `3 {    }
( [1 _5 L* o( j4 n9 b    p=3 C' e$ ?+ V5 h6 W9 ?7 G8 ~
    head;4 }0 ?3 S# }4 L( n: ^8 p. `
    for(i=1;i<=M;i++)
# @  `' ]. O' h( M- H9 ?    { if(p->flag==1)( J; C" ]3 y0 f' ]
        printf("\t%d",p->number);% p, v. l! G1 r8 v. y0 T! J
      p=p->next;. j9 }% y& ^2 P0 }: g
    }
" o" J8 e9 w4 G5 ?
- Z8 o5 Q# P$ @4 ]8 J& S+ a
8 L- f* U* t) W) S6 O" C5 i( [- M8 y7 B' ?$ M7 q8 Q
}

: a' f0 ?* C  Z8 g; q: A. a! X第二种方法:数组
' G+ U5 F2 p# o3 j8 O. a' x4 n* J0 i#include<stdio.h>
4 f, i" s% x5 h; b4 H#define M 8; f( _4 ]% w8 O/ g1 H" a& v
struct monkey
, h8 [! A- A1 Q9 X. {{int number;
& K/ }# Z& I8 \! yint nextp;
. A7 i% U- H6 L3 n9 n$ _}link[M+1];1 w: k/ P" @3 U$ T$ z! E

$ W5 x  D. u7 V: o2 Mvoid main()& \" b7 F7 I. G1 t) y4 ]
{int i,count,h;7 P% r8 S& Y  C! z( b+ F/ K4 i5 ]; c
for(i=1;i<=M;i++)
' u* @/ J4 P/ m8 R$ D+ h$ ?. Z; g{  if(i==M)
) }& W6 N1 B1 Y   link[i].nextp=1;
5 d1 h: P1 N; u6 F   else
& v* N7 v0 k) H- r   link[i].nextp=i+1;
$ H% M0 S( i% D  link[i].number=i;4 _) C  n. V. m& Y4 i
}8 R1 w. ]) M8 R6 p( t/ g  k
printf("\n");
. P* h! v" \% I# j+ b9 B+ l9 |1 Xcount=0;3 B5 Y- f6 R( j8 Q% z. [
h=M;
. M* o8 w/ u/ P" _3 \printf("依次退出的猴子: \n");. c; T! g7 @4 Q$ |3 l
while(count<M-1)- f5 U. t, a' i/ J
{i=0;
1 `4 A6 y, g! R8 Ewhile(i!=3)  A& d  p' k1 e3 A; k
{ h=link[h].nextp;
# Q: A! @/ q! g- x. ^" A   if(link[h].number)
) v8 Z6 ^( U$ R; B5 ]; t3 ?7 r2 J9 ^3 h' g     i++;}
+ ?1 r. A! j8 w9 c
- c& u( b3 Y0 ~- A; U) s5 Lprintf("%4d",link[h].number);8 T3 n" }3 I/ {- i
link[h].number=0;8 [+ M  ~7 v  L
count++;
. }; M2 ]- ?. h9 a* n3 W- |7 G+ R5 ]}- [$ r3 d' W% D7 H* D* F
* g1 s2 y% @- z9 {0 q
printf("\n大王是:");) C5 D7 n; W; A5 p
  for(i=1;i<=M;i++)
# S$ _' L( w& h3 c# {/ Z" u2 A  if(link[i].number)  c8 z8 T5 k/ Q' }' A' A
    printf("%3d\n",link[i].number);
' m% K. p; t$ ^% K6 ?; k1 M* b
: U- L# t) _( M- R) f4 V; u  W) g8 z% c% `, L
}

- e9 N3 o! {1 r$ \( C第三种是普通方法for循环
7 @: d6 T: z! B  D
#include<stdio.h>
; O. m$ C/ @2 bvoid main()
7 C. u0 h1 r" L) }3 \" G{ int i,k,m,n,num[50],q,*p;
+ Q1 ?. B& |0 z" h    clrscr();
! o& j) Z9 w( T$ g  ~   printf("input number of person: n=");- n7 ^; |7 W; h5 V
    scanf("%d",&n);5 }8 d: ?0 E" d9 c: h$ q
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只$ J# @6 x/ k% V; g0 z0 J
    scanf("%d",&q);  E) O. S, N( @( t6 H" T. C
   p=num;  ?# s2 T, b) [0 R: a$ K" y
  for(i=0;i<n;i++)  C0 a$ X$ U' O1 f
    *(p+i)=i+1;
: Q& ]. b( h+ k7 [) r   i=0;
* n6 o/ M# G3 \! M9 q   k=0;$ m! g% F7 x# Q* P7 l" w  m( X0 a
   m=0;
! b/ T( l$ R' H9 _  b1 p3 l! d  while(m<n-1)
. `  c, h! J: ?. z( t4 L   {if(*(p+i)!=0) k++;
1 o2 U3 [7 m4 F     if(k==q)& s$ S3 e' A' ~
      { *(p+i)=0;+ y6 c8 B* Y: X4 |! `% I
        k=0;# T8 z8 Y9 u& I
        m++;- p1 j$ C+ H/ D' ]6 W1 D0 p
      }
. B' V+ R6 f! Z9 A6 E    i++;" b  Y5 r. b+ S- E9 Q) r
    if(i==n)i=0;# f* G& u8 X& }& ]6 p; d3 ]# n6 I) Z
   }
: {% P+ G; C  x9 l) G4 n  while(*p==0)p++;
8 W' I3 x0 \' d6 z9 ^4 `$ j2 P    printf("The last one is NO:%d\n",*p);
$ v( P/ r9 e, n1 b     getch();
- z, s3 o& [$ I; q3 {) o
* `6 ]( Z$ V4 m% D3 s9 [}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;3 f8 K/ [" W$ E1 E
namespace 又费马达又费电/ G- C2 o7 O' R
{: z/ j. w, M( f3 }( D9 S2 n  R* |% a
    class Program+ ]6 }  t4 q5 G, L" |) t
    {8 C% O5 |  }8 Q6 o' f* k9 I
        static void Main(string[] args)
* k1 w2 O7 i9 f$ W        {
7 b6 |# Y$ ~# ~$ E( d4 J% J+ T            int m, n;
7 N2 M& X4 T5 u' U- f+ T            Console.WriteLine("请输入数组长度");  r; J0 \) A9 N2 J
            m = int.Parse(Console.ReadLine());//m为数组的大小+ B) m3 D* L0 `6 b  \  m" M1 C: Y
            Console.WriteLine("请输入要截取数字的大小");
% c9 R1 S0 u3 w5 H2 U- ]( F            n = int.Parse(Console.ReadLine());
& m8 q' |8 g; N9 K            int [] numw=new int
4 R7 n' L$ X  r' G# J  k1 E) S0 z9 R3 U, X  Z) u. B) B4 g7 B" U
&shy;&shy;&shy;;! q! r! ]3 r: c7 U2 F" c* [
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数* ]3 `# `/ h6 a5 m; M
            {
: w$ B. r) Z) C: ~9 h# o& I. V$ E                numw[j - 1] = j;
' S: i! r: e8 C            }
7 s% }. l5 ?" [8 A& r5 ~& _8 s) G            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
# Y- \* Q# i  N* _: O$ w# ~            while (d != m - 1)" _7 D7 G& C2 ^! ?
            {) p9 t- z1 j. U: e
                if (i == m && d != m - 1)
+ {) z+ x5 k" A  s% m7 C                {
( ]  V5 V0 p: G+ T# J+ W                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!7 e' j1 g- i/ m" [, Y- e9 r7 i
                    continue;
0 \! F4 ^! I, M; Z) C                }
3 }/ {. m* U" P& q! u                else
! v+ v, H) Z* @                {1 n. ]1 N! ?3 e& L
                    if (numw[i] != 0)
! ^4 E2 r- q% N                    {
6 @: B* ?) `; u, {2 G$ k                        i++;
' f$ U! I4 V# J: e                        k++;
2 L* w$ k9 a, Q                        if (k == n)
8 p& P1 h+ Z3 [7 ?) k' l                        {- g. ~+ y5 Z! X8 q! k; y
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了0 t! ]/ q/ L; |
                            k = 0;% A" a& _+ A. ^& `7 W
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
, a3 Z4 A+ R  Z! r3 L                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
  p( w4 I$ [3 K( j1 b. b                        }7 K% a% A4 {8 ~; a: ~7 a/ N% x% S
                        else//输出暂时还没有改变数组元素的值( }; D* R  k- C: O( C4 @
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);/ q3 J( g3 U9 ^" |# B, y
                    }4 Q7 V, F+ w3 |- L  |' @
                    else0 q) s, \3 \' O) L$ d  |% j" `
                        i++;//数组元素为0,直接跳过,不计数。。。
- L! _+ @, z; o                }
7 W- g# D  }: j8 T7 _3 Z6 {
& M' y5 T3 ?& i; W$ I" K5 t; w5 t4 y5 l9 v, Z0 _: z: \
            }//结束while循环
0 R" }, p! k$ P$ ~6 x$ f4 z" l2 l            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦8 I) I; r2 O) Z" B8 x% I
           ( T& q" j0 n7 N4 I8 ?
                if (numw[i] != 0)
' m$ a$ J3 f/ e4 R                    Console.WriteLine(numw[i]);
/ G. o; M7 z  I/ {( T$ n1 V           
- f- t* T  c5 n8 `% C+ `3 N            Console.ReadLine();
  k4 ^( w$ ^3 t0 q        }2 F; g# j; v/ |0 d
    }/ z: u- K) W1 M# f) ]
}0 ^7 [4 P& h# S# k5 f
小甲鱼最新课程 -> 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-9 05:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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