鱼C论坛

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

猴子问题

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

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

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

x
大家好!, ^/ w& i: L' w3 j! y
这几天我在忙着编一个问题,我用了一种方法编出来!
2 Q/ P0 W% Q. l4 z. ~7 L但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!- G0 }/ m0 @/ |- T4 k; d. Q* v
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
8 s. C1 N9 g& E! J4 g0 e! _6 h1 R7 }9 c9 T8 C0 ^8 Y

+ l6 {" u1 }4 \7 I3 D4 _
                            题目
7 @7 [- o! S" }8 \/ \$ {2 y4 w山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
2 C; B) U% j9 k* q7 j: i第一种方法:利用循环链表
1 K' ?8 c' `6 \' ]#include<stdio.h>$ ^- `7 }8 p9 ?8 g3 _2 b' i
#include<malloc.h>6 L$ E4 C& N( E: Y; R1 B
#define M 8            //共有8只猴子
1 Q( @8 N9 n/ b. M6 h3 O! R#define N 3            //数到3只时退出第三只
0 Q  g4 e+ G) d) ]) l* vtypedef struct monkey% j! O- T: X. K+ X" o+ z! u/ u
{int number;
/ I, r# G% n; p3 n0 a- Kint flag;" b, C' @6 `1 Q9 K. x6 T8 q3 X- X
struct monkey* next;
% L' F: p8 z: Y, d0 V}MONKEY;; `" Z$ J4 ^' q, F) B, l
main(), {$ Y; r! |! i3 G! T" O. ?
{ MONKEY *head=NULL,*p,*s;% ?5 J3 Z& f" _# o: b, a: K
  int i,sum=0,count=0;
" @$ P$ r% r. U, r8 w5 |# R7 J$ t, O8 B  clrscr();              //清屏- ]. J+ J" X# C5 `( `
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存+ ~+ M. E. I8 i% I- T3 F
  p->number=1;p->flag=1;
$ @* S" J, {, L9 P5 }  p->next=head;
/ l" F4 K8 K5 P/ ]0 `8 \' F  head=p;0 |; }. n: W, X: p+ W6 L$ m
  for(i=2;i<=M;i++)
3 |& V0 b$ s) e/ e" t, L    { s=(MONKEY *)malloc(sizeof(MONKEY));
- d( n7 L9 }; A2 C! h) y! L9 p* }  V     s->number=i;s->flag=1;% P2 \0 \' e; Q& o* ~& O7 w9 z& c
     s->next=head;
6 }2 _8 L6 |& s3 n! n( D  P     p->next=s;p=p->next;
0 `9 y' E  X- n; ?! H    }7 H  I* T3 q7 A1 h' x9 L
    p=head;- q0 M# {# z2 H2 o+ R1 r  f3 ]; n9 l
   for(;;)
7 C. |0 Q) g" s/ Q    {if(p->flag==1)8 p; K5 m" b+ u. [
       count++;# _% ^7 R$ k2 g- z6 j0 T
     if(count==N)
6 f. Q0 G, B5 P9 \        {p->flag=0;
/ |! w6 \1 r! U5 S3 R         count=0;6 B# T0 Q0 l! e" w
         sum++;}
" `3 F2 l* m9 c6 k     if(sum==M-1)# |( A% H0 ?9 F6 ~( \" D1 O
        break;
. ?2 ]1 j7 O1 N$ s' K     p=p->next;/ ?: ?4 c' D$ @% W2 U
    }
0 c9 l9 P0 o# U    p=
3 j5 v. ?9 c" y0 P    head;
. W( s; Z' m8 A  M- h    for(i=1;i<=M;i++)7 R' v# l0 H# I. @$ V
    { if(p->flag==1)
' {4 ~6 v6 r3 m% \& c        printf("\t%d",p->number);
4 b" `. t7 x- t5 U4 t! g- d      p=p->next;! B2 `* c4 l/ J" j# D0 K, s/ W8 J
    }, I; T" F& i, E( X4 U' F$ ?2 s& J
3 Y# _% o9 {( _+ E0 c, n( _0 H, a
5 }& g6 ?, p* `$ h! @/ C9 w
6 n0 G! q& N; z5 {% F0 w
}
1 v! l- c6 I1 v+ p4 u( E& |9 i( E- k
第二种方法:数组$ }( }6 H6 s  d9 V
#include<stdio.h>7 F2 P2 E3 n( l' d3 t6 J
#define M 87 K3 n" e2 n2 Y- f* N: j
struct monkey
8 W0 K8 u& }- t: Q" O( G7 @# ?0 {{int number;
, |7 U, S( y" R! {9 i5 g- k) |# {int nextp;
; {! Y  r) F0 ^; B}link[M+1];4 J8 E3 ?  c# D! |: s

% g. s6 Q  |' U6 Bvoid main()
* T# }, H/ }' L8 S6 v, Y4 B{int i,count,h;
- y# `7 q  L  {0 }, E: ofor(i=1;i<=M;i++)2 ^5 M8 e2 a* f' g
{  if(i==M)+ b8 ~! i: [4 \5 `# X. v2 v; f
   link[i].nextp=1;
  J0 w/ |4 _" s  y* G- h   else
/ V9 {: E) L! l5 _  e- @   link[i].nextp=i+1;- R2 u, w8 E4 s+ K
  link[i].number=i;
+ R( p( \: f  T- V  c}4 O, R+ q% T$ I1 Z) j4 ~+ d: c
printf("\n");. [) B6 a: t* C
count=0;3 }3 ^$ A2 c* i, g  i# x* c1 h( P
h=M;
& m2 d7 _9 @" p. K4 ]- m& Cprintf("依次退出的猴子: \n");, }6 B% T+ }4 o1 s( _, A/ k. r9 i
while(count<M-1)
) `9 w5 a$ }# n) T' w" r' a: x{i=0;" z, \0 O4 A/ n' c% n. w4 l' u
while(i!=3)7 M, ?% Q5 q/ C+ S0 n' ?0 {$ `8 |
{ h=link[h].nextp;% Q$ V) |! n: E! f8 X3 N/ o, {. e2 q
   if(link[h].number)
) f* c- R" E* P     i++;}4 m2 |6 m+ ~; `# p

1 ~; `* m: T7 y) B% n% ?printf("%4d",link[h].number);. G6 J) @8 R3 ?6 r# b8 a# u
link[h].number=0;
2 \3 n% X" p/ l6 gcount++;) H+ L% l8 K) e5 H" F4 |
}% i! L) a9 B* P" h8 [" S' c( T

: h# F4 {) ]1 I- T- l* }printf("\n大王是:");
( D$ `: n) o7 p2 [6 ]. u  for(i=1;i<=M;i++)+ O- w; I  ~& a
  if(link[i].number)5 b  d8 d$ b1 `/ t
    printf("%3d\n",link[i].number);
( u  a+ j1 B8 }  e& J$ N( `
) W& R1 ^) q" L! ?: n, q5 V# Q+ \2 o$ w( C, T/ G
}

& _0 l! s" [  @+ N( a第三种是普通方法for循环

! W, O( n5 j' _9 J+ G#include<stdio.h>) [2 E7 a7 q6 j3 H' D' t$ k
void main()
2 U0 g# ?8 `8 Z; Z; K* ~2 P{ int i,k,m,n,num[50],q,*p;# W7 `% I" z# k
    clrscr();
2 H. B4 t; T* `- v3 J   printf("input number of person: n=");
/ ?1 D" t' t/ y7 p  ]    scanf("%d",&n);0 r& q+ i' ]% p6 S8 B
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只* p: E& F+ i. y
    scanf("%d",&q);* T: j6 l$ i6 B1 n: P) m" B4 {
   p=num;
& b. q6 ?% A5 w* x7 q  for(i=0;i<n;i++)
9 S, J3 P: j& R) ?) X4 Y    *(p+i)=i+1;
) @0 z$ r) j7 N& ~8 _9 J- }   i=0;" L4 |8 M1 K4 t; `. e/ i6 R
   k=0;  C3 o9 @0 h, G7 `( P7 m
   m=0;  ^4 b* K/ `2 R3 G
  while(m<n-1)
; U# i4 i4 |5 d! R: ^5 E   {if(*(p+i)!=0) k++;
* S. w/ n6 b) Z/ U, z     if(k==q)
* @' c6 r3 W, g1 ?      { *(p+i)=0;
( H2 Y# x) `# |' U        k=0;
' E* m( P, B) ?5 A' q        m++;
. S9 F/ J0 L7 e8 A5 D9 C      }
6 W- P, S) z3 f8 u# V, u8 B: V; R1 v$ G    i++;* V/ n* a# _7 U; j
    if(i==n)i=0;
) r  J3 ^9 Y1 ~: `: B9 O0 v2 ]- T   }
5 d: t' R. u! ~' d# }7 j6 p. F  L1 i  while(*p==0)p++;
; B: |- w2 J% {8 Z0 R- h    printf("The last one is NO:%d\n",*p);& u6 ]% G) I% J) N
     getch();
$ D" T4 v9 u) A, a9 |0 ]1 Q6 Y2 K& R( 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- @. y: s' r$ D, g" \- F( r
namespace 又费马达又费电
% v3 k, _9 f% w9 f/ B# h{
! k: Y2 D- B- S: I7 b0 [    class Program: h1 B0 G1 r6 v$ b% D6 H; W, n/ l5 ]
    {& B" Q  k, X2 |/ U8 T
        static void Main(string[] args)5 I$ Z- I2 x4 j# S; C7 K8 }
        {
7 ]! W/ f+ x; n# r" e( J8 n            int m, n;
$ H! Q& Z1 N4 ?6 a" [% Q# m            Console.WriteLine("请输入数组长度");* r) e8 u, B& H, B
            m = int.Parse(Console.ReadLine());//m为数组的大小
% m0 G, z# o! g2 D( h" P2 g            Console.WriteLine("请输入要截取数字的大小");
/ b0 E9 t+ F+ j; R            n = int.Parse(Console.ReadLine());" G. t3 J# J- T3 Y$ _, v9 ?
            int [] numw=new int
3 \5 r# C! e0 T: k
$ ~* U/ q  u0 S3 H% Q! ?4 E&shy;&shy;&shy;;
! a2 u! A4 l/ X! E) d% l+ \            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
- ]" a1 _' ]5 v            {
# p* B+ T0 \7 K8 v; i                numw[j - 1] = j;
* H! s5 M( Z$ I9 f! h            }. q5 S  w2 P+ k7 o# E
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
5 W. _# k$ t3 C" R/ ?# I            while (d != m - 1). m% A5 c) z" a0 P
            {
6 e0 C" a( H- t/ ]                if (i == m && d != m - 1)
4 ~$ E# M. c, h                {/ {4 s! p: t! B- H6 x
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!8 B' c% D, I) y- n& A. T
                    continue;
2 A3 r6 n6 P4 i% I( n                }
" l" q7 d$ `9 G1 [- b8 g                else9 G2 l4 V9 z$ m1 U1 I
                {% w) u- }" K2 z/ u% K
                    if (numw[i] != 0)
" j& X* I; S5 A- H5 v1 _                    {6 o: p  ^1 [6 l3 s5 X$ B. Q& Y3 O1 a
                        i++;
7 r# Z  I. n7 @1 U0 c                        k++;
$ z3 \! w, L% o2 J7 j                        if (k == n)
4 S5 L/ [9 n1 q; {: A' q! c2 ~  U                        {: X) H# f% ]* c5 r
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
# J6 p! E3 B0 V2 [+ |/ U                            k = 0;
1 d2 Y/ g9 v9 q: C" m6 u6 p              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
  L# O; U" c& f- ]( }                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
' e9 x, z2 Y' q% e0 U6 f                        }
) X6 U9 O2 [; ^, ?! M3 ?                        else//输出暂时还没有改变数组元素的值8 z7 P6 o. ~6 D0 O
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; b' X' c7 F9 ]0 ?4 c) x. E; e" C                    }4 M, ~$ H; C( U( |1 R5 q
                    else- c, \6 j' O! }, t7 V) n# a+ D
                        i++;//数组元素为0,直接跳过,不计数。。。+ \, Y, |4 y) U  x
                }
5 o0 b" G3 Z- u1 U
' d; y+ l7 ?2 X' Y1 j. l9 `5 |! F4 r0 b  V
            }//结束while循环, F2 {6 S  f, P" g. {
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦# r& b: ~* M1 p$ L
           
  ]: ~' Z: f$ |: z) ]                if (numw[i] != 0): D: `8 ~) b- R( H- J3 c5 M
                    Console.WriteLine(numw[i]);
& z  O7 R3 K8 a6 c           
( I  \1 E1 F) B+ M            Console.ReadLine();& N' ~8 r: D. Q/ _/ G( Q
        }& g8 s) j1 }, ~
    }
! o8 e! r, N- ~8 G0 `7 ]}: D  t- G& @, O' N
小甲鱼最新课程 -> 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-5-25 09:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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