鱼C论坛

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

猴子问题

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

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

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

x
大家好!) c. _% u% l; j& Z) N" W# ^
这几天我在忙着编一个问题,我用了一种方法编出来!( Z& r4 \$ d# q- Z1 [. [
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
9 u! r$ g7 H& v: B2 ]% F$ |注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
- L$ M7 Q) F' [; z
9 E( h+ B2 s! [" N# }4 U8 _/ Z$ G/ h
                            题目- {3 F3 v. B4 D# n2 @* b3 h
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
& L+ C' J4 e+ Z( O- L, i1 h/ e第一种方法:利用循环链表
: R; X5 H3 ?+ ?#include<stdio.h>
2 W8 \5 P+ a0 T7 p& y9 \#include<malloc.h>! \/ F( t9 Y. ^; _8 @8 j, V* A- H
#define M 8            //共有8只猴子
' p1 T& v. ~' m: u6 ]#define N 3            //数到3只时退出第三只0 w$ G4 R! C  t' I0 p! @
typedef struct monkey
  B9 s$ S/ n) _+ g{int number;% |. c4 t' ^2 r1 I$ u0 d; y
int flag;
3 P% R. ^! W9 o; {1 o2 {struct monkey* next;4 [* [" M) w' D9 Z6 D! o& y9 n
}MONKEY;3 u2 F/ a2 O7 w9 g2 a
main()
' C( v  E/ R6 Z0 f{ MONKEY *head=NULL,*p,*s;8 D8 ?2 r% u5 n- a; x
  int i,sum=0,count=0;" b2 ~# i/ T$ B9 M: ~: J
  clrscr();              //清屏
1 L: A# h; h, Q& E2 ]  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存! Q0 ^; r0 f! |7 q
  p->number=1;p->flag=1;. |# f$ s% _" j: u
  p->next=head;
; ]% l3 \5 U3 o2 y7 q2 `8 A  head=p;
( c9 u5 t+ C& Z# _5 P9 a  for(i=2;i<=M;i++)
+ h; E+ K5 v6 ^1 v    { s=(MONKEY *)malloc(sizeof(MONKEY));0 n) i- I' I9 V' a8 y
     s->number=i;s->flag=1;
( d$ r. O9 {- n     s->next=head;( C7 {' h9 p/ t: o+ {) f& o8 w9 l3 J
     p->next=s;p=p->next;! W5 E) k! b* O; R
    }6 ^% Y5 R# U* _) {1 q% w
    p=head;
! ^+ g% ^6 R: I/ J( H" z$ ~6 A: W   for(;;)
" L( S6 H" p% y    {if(p->flag==1)' e& c' X! y: w3 m% x% Q
       count++;, H( r( \) X8 C6 t5 {" r" \
     if(count==N)
# g1 F, L; ^/ p; P        {p->flag=0;" Q2 g* I& D" c- D5 N/ ?6 O
         count=0;3 q4 Y3 f- G2 C9 ^$ H
         sum++;}
( B6 s8 @6 k0 t+ i- x9 K# F% s0 |) |     if(sum==M-1)0 a3 r/ Y2 a' F
        break;
: J+ y& x2 H/ S) Z2 c4 w     p=p->next;8 |3 f% r, r2 z' [1 K# f
    }! T" V$ E  D0 \" M& |
    p=2 f3 v: M4 o9 w6 Z' P
    head;
0 S* h6 q$ w8 T% t9 Y! }    for(i=1;i<=M;i++)
/ C9 g6 l3 s; t8 R! [    { if(p->flag==1)  [! p( Q. s4 Q5 Y* F% K9 J
        printf("\t%d",p->number);
/ w# f( k8 {% u5 K) _      p=p->next;" w2 r! _7 T. T  }3 f, N
    }1 h4 y6 r* Q6 ?  e; B
" _  m) Q; [, c, }% I2 M- f

: E8 ]/ d4 M) \+ i7 S! F  S; q$ O; W; W& G4 S: _
}
3 }' C9 X6 m+ V( S
第二种方法:数组
2 K$ ]: c; S6 ?) V2 W/ [#include<stdio.h>
  m! O9 Z+ w, O) w$ I" y1 Y#define M 8& i2 U  {' e- a5 L1 V. u0 b
struct monkey
" e9 S8 X1 `& k( |$ q% q7 Q{int number;7 U$ @* n" i' v3 r
int nextp;  ]0 _& E" @, I/ k
}link[M+1];, A' C- m' J- l2 v0 n. J
% B7 E  x9 N# p- k. J9 g: p
void main()$ @1 k3 N; d' j5 `. R; x
{int i,count,h;
3 m, Y" @* p) H2 g, }! Ofor(i=1;i<=M;i++)
: Z3 G+ V$ r& C3 x5 _. z{  if(i==M)( a2 M" @2 p' H' g0 p7 V
   link[i].nextp=1;
* ?, B7 K7 i4 p- ]. w" L   else
" ]( h* O  [* }$ n. B3 r  o   link[i].nextp=i+1;0 i& ~& n! J# K" z/ s) z0 _- @$ F
  link[i].number=i;
- k8 m1 n/ o6 O9 q! J' R6 b}
. a  A* O; V. uprintf("\n");6 G% |* r3 c7 T
count=0;
7 T+ r: i  z: P1 S- [- Xh=M;6 U8 G. o7 h& `, `- ?
printf("依次退出的猴子: \n");
  m2 K# L5 R* M* Nwhile(count<M-1)
) O, K$ M/ m! P9 y{i=0;! e$ I& p$ G' H7 Z1 a( f! |; n
while(i!=3)2 n8 D" D" j7 x5 J( w6 x
{ h=link[h].nextp;1 K0 c8 W4 n6 _1 M2 S- n& a2 U, P
   if(link[h].number)
  K* Q) t2 ]6 T     i++;}/ _1 O' m  x  O( k2 Y5 c$ T
* ?2 `8 Q& P4 p4 n3 s1 x7 ~
printf("%4d",link[h].number);
+ \! N" Z* ]+ Z0 M1 G  }link[h].number=0;
0 B1 a; Q" \2 A& j1 Fcount++;7 N4 ^. P  L  ?/ H; i5 [  J
}$ x8 h2 v- p9 M- G

* ]0 l# M3 r) q2 zprintf("\n大王是:");7 k; ^$ J2 I7 u
  for(i=1;i<=M;i++)- J! a( B9 C7 V
  if(link[i].number)
8 }$ {8 ^& j1 @! C6 s    printf("%3d\n",link[i].number);: K7 m1 q: B1 @1 [% W2 V2 F

6 o3 X: I5 Q2 M# p+ b( R1 e
; \9 O( j5 C! ], c: o2 [}
. O5 E2 R7 t+ X) b/ W6 f' C
第三种是普通方法for循环

3 A" T$ Q; g2 \! {, {2 h# S0 c4 a#include<stdio.h>
( e$ T- X& e- S, Z9 K# ~8 I1 Rvoid main()
, Z3 l( |- ]! x! D/ w" p& z4 g{ int i,k,m,n,num[50],q,*p;
8 s- u3 Z. o+ T8 @% i' n& X    clrscr();6 B  q: _2 U" U" \5 _
   printf("input number of person: n=");( a% ]) c3 P2 a9 n1 r9 E
    scanf("%d",&n);
& q/ w* `# L& H2 xprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
+ D2 `8 E( r/ y# V* g1 s    scanf("%d",&q);
/ H3 Y4 F) A+ f$ ]! _" H# ]   p=num;
8 X6 [7 x: B1 M1 `  for(i=0;i<n;i++)% _/ \( o  [* t8 G* G7 B
    *(p+i)=i+1;  N7 r# F# J# q3 l$ q2 R" I" h
   i=0;( A  k3 Y' Z$ k+ {1 A3 [3 G
   k=0;
6 G" u5 ]3 D$ O1 k8 ?! U   m=0;
% F- Y: x. W% W  z' [  while(m<n-1)6 Y( O" M; z) W# |4 C) l, @2 h
   {if(*(p+i)!=0) k++;
6 R. r0 L9 ~, k' G1 F7 f+ u     if(k==q)
1 H& E6 P; v( w: V& e2 _      { *(p+i)=0;
# |0 u1 x2 W" f5 Z. A5 S% E        k=0;: K7 P% A! C) d$ r4 |# e5 {. C
        m++;
  g( Z1 f/ ^3 a9 F% _+ ^2 i      }
. d% F! M+ ]% h( C3 \0 s    i++;
5 H$ n. n0 D6 ^, J    if(i==n)i=0;
7 \# G4 Q9 v1 Y2 ]% C) T   }, I5 }- b1 r. D5 X# [: O
  while(*p==0)p++;
# t/ f& r, ^6 E$ F# F2 g, y    printf("The last one is NO:%d\n",*p);; E' }) d1 Z" g9 ]
     getch();& t- y$ T! l; I; s: ]& ^* z

( J' i# E3 m6 E/ S6 p}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
; l# n# J& a: k+ ]namespace 又费马达又费电
9 B& S0 n+ P$ ^7 |. N6 X{- Q- r/ y( c' r0 ~- ^0 b6 k
    class Program) |$ Y3 Y0 X. J6 a5 J+ j
    {3 E6 n8 a2 U) ~9 s1 n, w3 h4 @2 s; D
        static void Main(string[] args)5 {+ ?) E: J; s9 w
        {
" M5 l; p, ~' d3 a9 s7 c7 D/ B            int m, n;
8 e0 L: |9 ^1 b) ~            Console.WriteLine("请输入数组长度");
8 _! N4 a6 S# N8 |8 M, Q            m = int.Parse(Console.ReadLine());//m为数组的大小: n6 |) z) o3 y6 f& q/ @! s; F
            Console.WriteLine("请输入要截取数字的大小");
( Z. Z, n# d6 `0 u, {# S$ \            n = int.Parse(Console.ReadLine());6 t! R* j6 h" l; \
            int [] numw=new int6 }5 B0 R, p5 i9 ^  }

) g$ A$ |' M1 U0 W9 |&shy;&shy;&shy;;( I& B3 e8 i* t0 T/ Z* ?0 G3 E
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
- o' e/ E4 D) s+ m' }! U            {) r" L& z! N& I( O" M6 I
                numw[j - 1] = j;
4 d% `6 m+ B: r; p6 l            }/ k3 l! S' [& h9 K5 d4 L5 x& h! [
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
9 y+ T- n  k% W7 A! [            while (d != m - 1)/ N6 G* k+ W" t1 l7 |4 N/ o
            {
! d* d; r8 Q! i2 F% G% k' l2 ]3 r7 o                if (i == m && d != m - 1)6 M1 G2 {: R7 V( w& e) e% M! P: U' q4 V
                {) [" ^2 i) \. O/ I5 _1 D
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!; M  K9 _" o4 \# _$ B  w* y
                    continue;  q% L6 v1 w, o' {
                }3 Z4 R( S: t3 M$ x
                else
/ k+ ]- K- V3 z' P; s+ }* u, x                {" g1 G/ W$ |" m  U$ t( j
                    if (numw[i] != 0)6 x" _* l, `# X( Y- M0 ^& `
                    {
+ |8 i" o/ {' q4 h6 h                        i++;
. d  I5 j( ~7 m  W                        k++;  h- [; o. Z/ m
                        if (k == n)
8 ?3 b. N4 G% c                        {% y% D8 c3 k' F( f% H
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
- {% K$ G7 i1 A+ [                            k = 0;) Z" o; U  D# _1 C' V5 n
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小19 A, _, X7 D0 u
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
, A( i7 I! {% `: S; q2 `4 B1 q2 |, {                        }" M6 _! T# k# G) n( U2 g
                        else//输出暂时还没有改变数组元素的值- Y0 u$ |2 j+ Z7 A
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
& s( k" c6 t, g8 K: |8 l) q                    }5 A# w4 y7 g6 U, E- y# {
                    else; A2 @8 e/ T- C2 @; C$ c* g
                        i++;//数组元素为0,直接跳过,不计数。。。
. X3 C! v  @9 k/ D+ _  R; }( s- O# M                }
( P+ V9 s6 g! i1 O. E* K1 o
. i+ k; S1 y9 P; V
# _6 e4 w/ B3 \            }//结束while循环& r5 Y5 E$ \& W2 q% ]6 s! B% A2 w
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦+ Q% j& N- z  h" U# s7 [! s
           
2 y( w. T) J. ]                if (numw[i] != 0)& r, r) D5 _) a5 z. x* Q
                    Console.WriteLine(numw[i]);
5 }3 T0 ]1 R( s+ E: q           ' D4 m; s5 B  R/ ^. @
            Console.ReadLine();* z% v2 O! P) V7 N8 {% k$ P
        }
* l: y( E, s! X5 v    }
  N0 X; P) j7 ~+ N0 B" _}
+ ?: e3 b# R3 ?/ M
小甲鱼最新课程 -> 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-6-14 12:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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