鱼C论坛

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

猴子问题

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

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

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

x
大家好!
- [5 Z6 \4 V, C0 u这几天我在忙着编一个问题,我用了一种方法编出来!1 R7 Q5 I& r$ }4 v( o' \. D
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
- t3 f, J) w0 C5 y; t# p注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 5 s3 Q; S/ S5 @  z7 ]' q

6 u# b& ~+ K# m9 R: V# `' D. [: J, e8 w) v
                            题目* m" l& }9 r% e0 j/ J
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。6 t) l- R! a7 g0 J# V
第一种方法:利用循环链表9 X1 @3 c# I/ g3 b
#include<stdio.h>
" T: s& i) g$ _, j2 A#include<malloc.h>3 k* X# `" G( T7 I  l# m
#define M 8            //共有8只猴子* C; X, c* R, [9 _6 `
#define N 3            //数到3只时退出第三只0 z  w) Y5 c' }( m/ d/ @" N, x
typedef struct monkey4 R0 Y  q; n# I2 J+ `  i
{int number;9 Y0 c4 _- U) S( v5 |/ D. b
int flag;" l4 g& w$ H% i4 y9 o3 x, w
struct monkey* next;6 ?+ T' j) T! {3 ]. @2 U: l
}MONKEY;
! W0 I: x/ g5 i" n0 j2 P! T& f5 mmain()2 |) P6 N; M/ P
{ MONKEY *head=NULL,*p,*s;
/ L' O& w$ g+ {! H  int i,sum=0,count=0;" g( z! L0 H* Z$ o- l
  clrscr();              //清屏
) c3 ~* f: n1 R  m( a3 f  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存& a9 l# f$ ]1 X& _3 [# i
  p->number=1;p->flag=1;
4 m! }. l) ]7 u+ e- q  p->next=head;
7 |- S# k- `: ?, ^4 c0 ]+ `* @  head=p;
  f+ Y4 g( h$ s5 `  for(i=2;i<=M;i++)1 ~' n2 M7 d' _9 [$ e: w5 F; L
    { s=(MONKEY *)malloc(sizeof(MONKEY));, R( J$ b" h" {/ l0 K) e8 ^, o' Z
     s->number=i;s->flag=1;9 b% s& Z; h/ t# ^) z+ M! x7 Q
     s->next=head;$ u$ ^3 A/ m0 t
     p->next=s;p=p->next;
) G0 _: L5 k6 `    }% g* f& R& B1 n$ [! O* F8 p: s
    p=head;; x0 N* o' I. I
   for(;;)
+ e" ~! i6 B/ p8 `2 S& l' c2 V    {if(p->flag==1); O$ b6 o' n7 v! ?3 X
       count++;
$ ]. l6 P# R9 l2 s3 U! w     if(count==N): _  U- Y. \9 U6 B, ]
        {p->flag=0;
# v$ K" I9 K% \* {0 _8 z# A/ x         count=0;
3 A, u0 U% i5 k         sum++;}
  D6 S, b) I' q     if(sum==M-1)
  s0 n5 J* f. b' X. U1 u! {/ s0 a, V        break;
% Q% o& w4 G1 i6 l* U& Y     p=p->next;
; ^7 e; l% W3 `( j* o* D    }
' {3 u: u7 c) h3 D' m    p=" R. T% n2 Z! G
    head;
/ }5 _: N/ z- \7 X1 A& K    for(i=1;i<=M;i++)
! I) ?7 V$ J4 ^    { if(p->flag==1)9 a- q0 T' A; o8 M7 ^2 v" q! \
        printf("\t%d",p->number);
4 Q0 H/ n* D7 E! s      p=p->next;3 d2 v" U0 W" K' k6 U$ l
    }% p) T: |; b- U* @6 s

4 A4 ~6 |/ [  g1 Q' s# D: V) [5 i# t9 g

* }9 a( s+ k  }. c: Z}

/ M4 `- D0 `& ^5 \第二种方法:数组4 V) o3 Y. S& L
#include<stdio.h>
. }1 H5 k5 z# Q$ S7 {6 G) v#define M 8$ S6 o1 C: Z' \2 l0 J
struct monkey
' x7 {2 q( h! n; g: N{int number;$ m. t  c0 L. m7 M/ m0 y
int nextp;0 x2 Q9 I& L! v- O" Q4 J
}link[M+1];
( x* ]4 t9 D/ i* T, P8 T
$ F3 G) y" {( S! Z' [2 A. nvoid main()% h0 f, y" q; K; U8 s
{int i,count,h;3 N1 w. t0 X1 q: N7 b* i! C0 k
for(i=1;i<=M;i++)
0 ~9 @9 m$ e0 H+ B! w1 s! ?& F{  if(i==M)
; j+ h4 u: I" |2 c1 J  S   link[i].nextp=1;
: u5 u7 H0 `0 }" t   else6 T5 f4 t. e# P9 w: ]: Z  \
   link[i].nextp=i+1;
$ q* i6 b+ V9 O, L/ X4 u  _  link[i].number=i;2 r2 ^# U, K, e* X6 D8 c, M
}7 u8 o7 b9 J; e, D6 B
printf("\n");
) h" F/ _# u+ Mcount=0;
. w0 E& {, u% Ph=M;: P7 U6 ]; ~/ z( a" T# A/ d$ f6 j9 q
printf("依次退出的猴子: \n");9 N. p, i# D# N
while(count<M-1)" T1 U: D% F. Y9 b, n1 `0 m
{i=0;* R, _# [2 E1 L" \
while(i!=3)( d+ M0 L# [$ i& C+ B1 U" ~6 o
{ h=link[h].nextp;
5 Z9 T  j  m5 R# `) B! t   if(link[h].number); m- O! K; c, U
     i++;}
8 m: ]% S( c7 r. V# E% u
/ P) S( ~6 y! O9 L2 gprintf("%4d",link[h].number);
+ J4 J! E9 s. u( Olink[h].number=0;
2 L5 f* x- s& b% C/ bcount++;
: ]6 f. y2 d% f/ U6 o}8 |- Q, W6 F4 q$ |' Q8 h
" A. U4 R; _; d  Y1 Z
printf("\n大王是:");
$ m) G0 Y! f' P& k6 @  G  for(i=1;i<=M;i++)0 W7 N) U" Q+ l0 g' V/ ]" S) Q/ l
  if(link[i].number)
, P0 I* _, a# E& w8 G0 |    printf("%3d\n",link[i].number);
- D  G* T% J0 }1 e2 D+ D4 l/ N- g9 P! h. U( f

, d& X" a6 Y. E% X}
! K9 @: w5 F9 D; f$ B- z3 g
第三种是普通方法for循环
) N1 x- k. E* m: r1 Q
#include<stdio.h>6 q- O1 Z3 T, I: D7 ~5 f
void main()# N3 C7 W% n: i* f* ~9 v
{ int i,k,m,n,num[50],q,*p;3 j' @+ O0 }. c! J% P
    clrscr();
# g- o3 N/ {# y- ~' r0 U/ a, Y   printf("input number of person: n=");
/ H# n  r4 N* v1 l    scanf("%d",&n);
& C1 g. q/ T  z; T8 \# j' }printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只% [# \  ~+ C4 e' l! K* B9 ?& i5 r
    scanf("%d",&q);+ r8 O7 M3 s6 _2 A$ C
   p=num;" a& y' C$ j% {  q! k
  for(i=0;i<n;i++)
* n  C9 l/ b1 G3 r) G6 a; x0 X    *(p+i)=i+1;
- U% {$ n; l: s1 N   i=0;2 E* T' |! M! b9 _) o; a
   k=0;
1 L# S/ V* B1 ^1 q- [" @. q# `   m=0;
& z, f' d  a  V3 B/ x+ |2 ?/ h  while(m<n-1)
- Y9 I. [. o& \! h   {if(*(p+i)!=0) k++;% _' R/ ]% d0 w* Z) X
     if(k==q)4 P) z0 l5 d5 |) ~$ A
      { *(p+i)=0;
$ ^) }* L/ v& y        k=0;) W" u; d0 N) J* d  z8 o! ]
        m++;: Z* J; F  m0 x/ ~
      }
( z# o, w3 S" r( B1 v7 P3 O' ~    i++;
5 S( i( V0 ^8 s4 g, c) N6 T    if(i==n)i=0;. {0 U! [( N" I! q% Z; I1 Y
   }
( t' Y+ a4 ^) M  while(*p==0)p++;5 K3 k1 I/ `, q, g$ l, s! t9 Z0 _
    printf("The last one is NO:%d\n",*p);3 @0 A0 t& z1 U% T! N* D
     getch();& ]) L. e  |  Y2 c! Q  {

1 F+ _% J' E- C* b  f  i}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
8 w5 g  M& m$ enamespace 又费马达又费电3 w3 j8 }- h4 E5 T, k) p. z- |7 ?
{
+ ~8 S) k4 A, d! l    class Program/ ?; ?9 U/ k/ V$ h
    {
# l3 h& _! I5 `        static void Main(string[] args)
) w( D: H: G( b" T        {
. O: |5 ]7 t& |8 z            int m, n;! u+ Z6 p  r+ e6 g1 _9 Z6 @4 A
            Console.WriteLine("请输入数组长度");, u" L" A: @2 J: G$ P/ Z3 R
            m = int.Parse(Console.ReadLine());//m为数组的大小
/ Y7 Y6 N! Z. h7 `# m            Console.WriteLine("请输入要截取数字的大小");
9 h  M+ z) o& F* l9 N! O  V            n = int.Parse(Console.ReadLine());
1 C% R$ r1 y2 K( |1 Y* k; ^/ {  [            int [] numw=new int
' {, h8 l# L  o; k" |/ M# g, P
* Q- _3 ~' k8 n, t8 M* `&shy;&shy;&shy;;' `+ c4 R# i0 A* y$ j. G5 v
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数) b# l' _& {2 I5 o0 \  `
            {8 a! U' Z; @0 |/ x! ~1 E
                numw[j - 1] = j;. `2 s9 r  h* I9 i) n0 e0 r4 q
            }& A2 l3 p: G6 k5 Y, V
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
1 z( C" m4 m% q! ?: j            while (d != m - 1)
3 N4 P* a7 e0 b7 M, S2 T            {: k+ v6 s7 W+ q- ?' u' @
                if (i == m && d != m - 1); c) @! U. U$ h: Y8 l# Y( ?
                {
5 X; m+ z2 M: q. W9 R( X; L, N: n6 m                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
  j) H$ y! h/ s8 g$ Q  P                    continue;
7 ]) K1 V, S+ }8 n  j9 o                }4 w; `) a: i* G3 ?+ M( C
                else
; |( {2 F% Z5 m; J  {3 Y                {
, H7 I' s( r# c                    if (numw[i] != 0)
4 U5 M, ^/ A2 k% q9 ~2 s% c, s9 n                    {
, q5 S  L& Z3 F+ i, E; {; u                        i++;6 m" _8 Z' k7 t7 O; c: M  }
                        k++;
; S( R7 w2 Z7 r" C* _                        if (k == n)
- v0 Y. O' A) I5 s4 e                        {; u3 L  d+ l- ^" m5 {, _
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了* C7 Z' M8 O" p$ j9 }
                            k = 0;
. R9 r' J" d) e4 w  X              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
% ?/ c, l% K1 p3 g  X                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
( d  @. ]3 X1 Q" p% o0 H3 ~; P                        }3 T2 `- f6 L+ J4 V. J. V( A) u
                        else//输出暂时还没有改变数组元素的值
) {* H+ l! e& z                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
2 f5 ^' j0 P: u6 b' j                    }
' |2 x' A4 |7 m; w/ `, v: R                    else/ |% A3 {5 s/ M; \) Y8 |
                        i++;//数组元素为0,直接跳过,不计数。。。
2 m) y" S! r; L) C                }
# {- R% \' e0 h0 ^ 3 m; C& a+ Q9 G" ]

6 v- W8 ?1 D0 N1 z9 e" j            }//结束while循环
, R4 K. E( y: J+ m6 _. r) W            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
7 Z4 G. d! W, c0 q           
& M* [2 w7 e+ r0 n1 j  d                if (numw[i] != 0)
$ f9 [. q0 d$ |5 u8 s: {, _                    Console.WriteLine(numw[i]);
6 j8 ^' C: I  p) y; X- u2 A           
, R) m6 i) A3 m8 M; u0 L% B! I. P            Console.ReadLine();9 [3 o# X$ S5 V! M$ U3 R
        }
  F, g1 i! R) u    }
7 i+ j! f& _  o9 C2 t/ [( l}3 A$ s% B/ s0 U' z: t$ d$ t7 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-2-1 11:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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