鱼C论坛

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

猴子问题

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

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

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

x
大家好!
. }" j& B; b0 J& Q( }这几天我在忙着编一个问题,我用了一种方法编出来!
/ I$ s* s4 m4 ~# o& K; |但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
" `5 w" x& L* H- w, E. v9 J注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
; V/ p  v) c, o5 d5 [8 R3 {0 n" y3 r
" V) w) q" q+ ?. Z) i
                            题目+ Q& E. b, e2 f& J7 g
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
0 i# Y; t0 H4 h第一种方法:利用循环链表
( v+ r9 R5 H' P; F, U#include<stdio.h>+ `& G  W6 t* C7 i- ]% r
#include<malloc.h>
  Z% Z; V, t; ^1 |/ [4 s4 B4 h( O8 i- m#define M 8            //共有8只猴子6 \" a* S7 s: A$ _# O6 A
#define N 3            //数到3只时退出第三只4 O, f* o! @# w9 k
typedef struct monkey$ W- c5 k$ x3 C6 N6 |2 H+ W
{int number;
+ A) D/ O: t! i. `1 F1 Eint flag;
, y) q/ a- L" Z& w7 m7 {struct monkey* next;* \- K; F$ h3 I. N8 A) ^4 |
}MONKEY;
; R' E, G0 G: t" A4 M: w# ?& Lmain()( Z" b( }- |) `6 N7 ~/ T
{ MONKEY *head=NULL,*p,*s;) q0 _5 h1 U6 V5 Z( v7 h3 a& l
  int i,sum=0,count=0;
9 d2 M% J# K8 O6 O) F+ @' n  clrscr();              //清屏5 J  `( @1 |% E( U. ]
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存# Q, H4 z+ ~/ K, Y% i2 ?- e2 l
  p->number=1;p->flag=1;7 ]! k( f$ I. D4 n
  p->next=head;/ M0 ]0 ^/ W2 P
  head=p;0 S/ h1 [5 B7 u& B& r$ Y: y
  for(i=2;i<=M;i++)! h! G5 F5 `, [' |3 H, m/ ^
    { s=(MONKEY *)malloc(sizeof(MONKEY));2 r6 S; s, C) o2 e8 b/ X+ v! d2 {
     s->number=i;s->flag=1;
! ]- a# x0 o; q9 p: y2 b     s->next=head;* W$ H0 ]" B' O( i: H5 w2 X9 j2 K( E
     p->next=s;p=p->next;2 r, B/ m& z) T9 Q/ R
    }
0 s0 i/ D/ j, e! d% l# p    p=head;6 X( ~6 a, t! S8 I# `0 w. j
   for(;;)
$ q8 {/ t5 U' C; N7 z: I  y    {if(p->flag==1)
% ^8 v, k* ^$ t; V; ?. X! O, U       count++;8 e# G2 P* Q8 Y' B! ~
     if(count==N)" I8 j0 k1 ]' f; j1 _
        {p->flag=0;
& c3 L0 h3 B* T         count=0;
9 x& H% h! u7 q( B         sum++;}
6 j: H: Z6 v/ G3 t, ]6 X" Z$ b     if(sum==M-1)* x- L& i8 v0 b. Y6 x8 Z/ [4 G" B
        break;
0 ~$ ]' |0 F( S4 t6 Y$ s" B/ ]- D     p=p->next;6 l/ E- \$ z+ l
    }
9 b6 v$ {! T! X    p=
4 H: k# o7 }/ ]. W) f1 T/ M" [* e% g& d    head;
, u: U* x* W( Z' R' X    for(i=1;i<=M;i++)5 r5 E! V2 h0 e
    { if(p->flag==1)
+ q. h2 P; k  D/ a1 Q2 T        printf("\t%d",p->number);
! |8 A' e8 b! J9 A      p=p->next;
& Y. ?; @7 o2 D2 q4 Y+ O8 \0 p) h    }& L3 n- B$ p; C. o6 A& N& _

+ v4 o. s* \5 p1 G5 t3 z3 d* M7 S" i& U) V6 h2 }7 M1 K
4 s+ w0 T# |; M
}
0 ~& _% ^4 C, @
第二种方法:数组+ v7 M4 E4 ]0 u2 ?0 h
#include<stdio.h>+ y/ K6 f, v( n- F
#define M 8: z: d7 H. ^& A
struct monkey
! V; T6 ]- h2 d$ _, `5 u4 t( l{int number;
& x  p* l1 c6 T8 n3 k7 C! ]: j+ tint nextp;: i, V$ @4 |# ~" X
}link[M+1];
0 c0 F3 ^" O0 p: X+ [  O) X! C  Q& R* y" H& F3 t; ]
void main(): E, X% }5 z  G9 s' O
{int i,count,h;! |# p' O5 L0 s. m7 s
for(i=1;i<=M;i++)# c% j9 V5 I% L& p9 M' L
{  if(i==M)
% F! }& A/ }# L; t  W/ X   link[i].nextp=1;4 @, |8 E( M& y7 t* x( @) G: z
   else
; E6 J( P+ C/ F6 q   link[i].nextp=i+1;
6 y4 Z, x) q+ x0 P6 e, b  link[i].number=i;
" d: I7 j. p: R# I$ O}
: J- l$ |. y/ H4 r* A5 E" _9 gprintf("\n");# Q7 _5 J5 H. ^5 O: y3 [- U7 R
count=0;! N, b- P( S. r
h=M;, y5 S, a" ^$ F# O
printf("依次退出的猴子: \n");  v3 e& S4 V& m+ l% {
while(count<M-1)$ N/ H8 B4 f( b: R, A% d& k
{i=0;
% g4 ?: V" B6 @! m; k3 W8 v5 twhile(i!=3): |9 D0 z# L$ b' `
{ h=link[h].nextp;; c& |+ u# F, S$ ^
   if(link[h].number)1 `- J0 V$ |/ T! H( a
     i++;}4 u9 n. P5 j0 `+ o3 D

/ ~. W. [# Q4 C+ m; kprintf("%4d",link[h].number);7 \4 n" }- U; P0 [
link[h].number=0;  u6 [" j! @$ c' [4 D# G, W% d
count++;
- d& j3 o: D0 E; @3 Q}
( R  k: a) g( Z. K* v, v8 d" D2 H, t% I! O$ V. ]
printf("\n大王是:");
" R4 z4 ^* a, q  X  for(i=1;i<=M;i++)
* t0 J7 S3 ]: Q$ H+ F  if(link[i].number)% ^8 `0 G9 U: x) s& @8 ^1 S' ~
    printf("%3d\n",link[i].number);
) e8 }. U, u9 S* I
! {0 H. b2 J; d; f% x2 x+ ~) l+ J/ M; a% v
}

) z5 F" J$ V$ G% A第三种是普通方法for循环
" t& ?+ y' A6 ?6 \& q, T) ~
#include<stdio.h>& L7 n7 D* m( a7 S  G: I) A
void main()
+ B. _; [' g+ X$ p& ~{ int i,k,m,n,num[50],q,*p;
* `' _. x. W$ [* c7 i    clrscr();+ t- s4 d) O0 a; e
   printf("input number of person: n=");
/ q. V' U& @9 [0 |4 i1 k0 ?# o) j4 g- E    scanf("%d",&n);
3 r* _) i' X' H; O" l2 s6 D  jprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只2 L  m) Q% a7 H; j
    scanf("%d",&q);- v0 i5 p) g7 Z/ J1 C
   p=num;( W/ V5 ^2 [( T' E
  for(i=0;i<n;i++)
( w1 ^0 f6 [& z0 j; l/ c    *(p+i)=i+1;
! H, ]/ \8 p! t9 N$ P   i=0;
& y" L. \$ X5 N   k=0;4 M" i! s/ Y0 r" R! k
   m=0;+ n* U8 D6 U8 ~* }9 y
  while(m<n-1)4 A5 M& y6 ^! A
   {if(*(p+i)!=0) k++;$ Z2 A2 a$ Q9 l# m/ n, g
     if(k==q)* R2 M( M) q; U& [- r0 {5 z3 m
      { *(p+i)=0;
% v8 [; G% [; ?$ A) ^, |        k=0;% k5 ]2 P8 x, t
        m++;% v3 }. [! _5 a% k5 Z5 |: F
      }
+ o6 v& G4 g& X8 h( v5 @    i++;
* `0 [; V% n1 _$ i% t    if(i==n)i=0;
( ~  X" ~: @4 m& l1 H$ b   }4 Z+ M) K( d$ ~, T+ X, d
  while(*p==0)p++;+ p8 L: g/ e& p* D( Q$ w9 K9 j
    printf("The last one is NO:%d\n",*p);9 V5 |8 H$ Y" }  l1 y: k0 }' H: F& E1 S# X
     getch();' @, g% G2 i( f" \/ u2 {

/ Y) o. a" U  y- |- n  M}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;) [$ {* c' A# N7 ~0 r. M. Z
namespace 又费马达又费电
" l; k+ L  C* L3 O. |. [5 G{
" ~+ q6 `9 a6 e& H    class Program
4 u0 w* X+ n: j4 h7 L2 z' O: ?    {
* E1 u7 F/ L' \" l        static void Main(string[] args)/ \8 Z" O& `0 m) e! t
        {
8 s4 g/ c9 u5 d8 T  X  e) X            int m, n;
5 X  t* W7 d6 A7 p4 a2 b- U- z, @            Console.WriteLine("请输入数组长度");
) S5 C" n9 M' K) g0 R            m = int.Parse(Console.ReadLine());//m为数组的大小
7 z6 \% u4 s& q8 y8 P4 S+ G( |            Console.WriteLine("请输入要截取数字的大小");1 F$ ]0 b- K1 e; f/ n2 j% g
            n = int.Parse(Console.ReadLine());! {, I8 ^# ~' m' J! p
            int [] numw=new int" A9 ]1 E2 X5 [* [
- Y/ `$ X& p, u8 M& d0 [# t2 b
&shy;&shy;&shy;;
/ M, Q# z" U; K" C            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数& R- X; ]' C) a! V
            {
0 n% s# L( S3 u1 k3 ?% [                numw[j - 1] = j;/ L" f. V( W, \- O3 U
            }
+ p" k# v$ d" B0 r* V2 N& A% v            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!- u4 R* V2 B2 ~
            while (d != m - 1); v* J/ c7 i: K' w# ^
            {
: e+ u! W# i4 e$ R- T/ r* M                if (i == m && d != m - 1)
% h; I- y1 f2 \8 Y8 o                {3 h5 V3 `( L; s/ {: l# I8 k2 Z2 \' o
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!0 k' J8 k3 t$ b& m
                    continue;
9 c* p" W% J3 c. c% u2 s0 O, {6 z                }
7 O  [" v. F: l3 D3 i7 _                else( Q+ I. l5 s1 T  T  Y1 }: G; i
                {
0 _' {+ I: @7 o- y% I1 ^                    if (numw[i] != 0)
1 A5 U9 S: {  ]; l8 A5 \                    {
- [- W5 e( v% _                        i++;
2 e% w) N$ N; T/ u- G                        k++;
  i& _# |4 e' q0 Y2 d$ N7 u                        if (k == n)* G2 s; Z% _1 r/ p* X
                        {
) u# ~  t" v' A9 j+ ]( |1 l                            numw[i - 1] = 0;//把在n位置数组元素的值改变了+ R7 z# q  |" w, H' f
                            k = 0;
& C  O; n  s) f, F. u              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小19 ^  G. T) _' C% G* l
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; j( F7 t  J' l% ~6 f7 K$ c) |                        }
; H1 e! s4 i* a2 B$ D; g                        else//输出暂时还没有改变数组元素的值
% B$ Z( P) Z6 n                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
9 {' Q7 S; Y) V2 F" P6 G                    }  {) ]$ h5 W2 S0 y0 c
                    else  q3 K' G" a' G3 A/ ], I  J' x
                        i++;//数组元素为0,直接跳过,不计数。。。
/ u+ S2 B. F; ?4 A6 G                }
# c( a$ u! Z# j7 a4 i5 \
, o6 X5 e2 R3 g) X7 G- {, k( C2 E/ ]6 Q6 [" t
            }//结束while循环! _5 |( g, e* A9 @7 B7 i! H0 j
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦" w( B( I, |& t' P) }; F/ l% N. F4 X5 D
           / B* Y+ p7 l  x& |
                if (numw[i] != 0)+ B$ W% h5 f; r
                    Console.WriteLine(numw[i]);) Q* M- A# z( ?- C8 l
           
6 R+ q# c' P% T            Console.ReadLine();
9 @; v% c2 T+ i. u3 T        }
# G5 I) a& m5 D- F& v/ j8 r5 Y" H    }3 [% [6 D$ \# D  y  T% o3 O( B
}8 f% H" y9 I- y3 H4 z+ u
小甲鱼最新课程 -> 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-17 18:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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