鱼C论坛

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

猴子问题

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

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

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

x
大家好!
0 {4 q+ A4 w% o1 h这几天我在忙着编一个问题,我用了一种方法编出来!
- q. |; `5 v0 y' ?2 q6 r但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
: R2 x: n) k) `# A注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 * z) ^( A' u) h1 L- ~& g5 z' a
4 M# f; L  Y- }. s- i- L2 x& c

4 \1 g, k" t1 V: p; B& y
                            题目+ S  B* g7 g# d$ ^- z
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
/ y6 `: k( [, d. ^第一种方法:利用循环链表5 @2 J8 G% `+ Z5 W
#include<stdio.h>
/ @: O; S/ K2 b#include<malloc.h>0 A; l+ q8 Q, o6 a
#define M 8            //共有8只猴子
2 G9 V" J3 V5 w0 C. G9 U#define N 3            //数到3只时退出第三只
0 g/ E7 T7 B; ltypedef struct monkey
; a' G8 c5 d) b5 q2 g{int number;
; D% C' z' _7 \9 n" Aint flag;
% W( `  x, K: W8 gstruct monkey* next;
1 T, |- t9 v. b3 D$ z}MONKEY;
8 v1 l) N( A+ _3 Xmain()
3 P) U$ x  m' k! Q; z: Q: z3 s2 p{ MONKEY *head=NULL,*p,*s;5 S  F' s+ M7 {/ R( K
  int i,sum=0,count=0;+ c! P& r5 f2 V0 S! K
  clrscr();              //清屏) x  f( }2 j+ g
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存, T9 ~' ~! T* d; B
  p->number=1;p->flag=1;5 @/ d* s9 z; J' e9 O9 W  Y
  p->next=head;0 L6 S( W0 J* ^2 q
  head=p;% s; L8 C( \1 Y4 O
  for(i=2;i<=M;i++)+ ?  F4 j, v4 Y% q! x
    { s=(MONKEY *)malloc(sizeof(MONKEY));
) G, B! `* i6 A9 _     s->number=i;s->flag=1;
  f* [& `" Z- S% Y, _; V     s->next=head;
; l0 L! v6 w1 E5 q     p->next=s;p=p->next;
7 O; l6 B$ L3 K' e" z    }, c4 o  y9 t) I3 n, m" r
    p=head;1 I  A& |) U8 c+ @5 T, f' m: X
   for(;;)
  Q# r# R  R8 n) l) i; V: B    {if(p->flag==1)4 F) Z; t% g% Q
       count++;
8 _5 a! w% K/ X" V  a0 Y4 O- X     if(count==N)
, \$ I- b; K. U4 i        {p->flag=0;! ^+ \3 C  p) o3 D
         count=0;
- m  C# r0 J# N         sum++;}
9 ~" `! b: a' S" s3 m' k     if(sum==M-1)
: [+ a8 X# ]  D3 {; p$ \" d# z* u! ^        break;% a7 R- i# ^% p( j4 }5 v3 }( g2 k
     p=p->next;( W& r' W7 D1 o* j) y" j
    }8 n! L2 c4 q. V7 g4 }7 B
    p=
! H2 N6 d$ x/ J6 i/ [    head;
* p( |/ R% N' B% L4 ]    for(i=1;i<=M;i++)
, `/ X$ i  H4 g  `5 e" A  p1 d    { if(p->flag==1)
9 [0 W$ Q& C/ s1 W$ ?        printf("\t%d",p->number);
7 i" C$ h7 {; G1 g4 }2 ~0 Q      p=p->next;
: h& V4 C8 ]7 C  e  W1 \    }
4 t* P8 c  e0 P) _' j" N# Y* [. j9 b1 Q8 {% y4 W
6 o+ U) w% h- c, u0 ?& ~, s; q/ C8 ]4 z
0 |1 t1 `/ }. @
}
. g& o, H1 @- q5 w0 ?9 ?' x
第二种方法:数组& o) `& C) o0 G9 G( \
#include<stdio.h>0 W. K' @  c8 D
#define M 8
1 p+ F) c4 u" a9 B  |3 rstruct monkey
, G2 P; q8 S5 |" K, x0 T{int number;8 q! |" K; U( y) S
int nextp;6 k6 \5 |5 l' _' n0 P
}link[M+1];% x3 Z) r/ L. `) ^

2 u7 y6 `( N$ p. mvoid main()
4 H' e! ^) @- c5 B& c, |) t# B7 j- r* D{int i,count,h;* k+ n  L* T6 V( w# p! H% y
for(i=1;i<=M;i++)8 M0 m. i  C! Z- k
{  if(i==M)0 Y, f, {8 i4 q! b6 Q. d0 u% |
   link[i].nextp=1;! I, M1 q: H# b: U* R* v
   else
1 a& ?5 m& T3 b  g' ]" r   link[i].nextp=i+1;
( G! m' z. M& u" ^. U+ }; y. k) A  link[i].number=i;+ y6 T6 b8 _  I* i
}1 {  @% I5 v+ m1 y8 C
printf("\n");
" F3 i6 C( R& k9 }4 Hcount=0;2 `* m& l2 U: Y/ Y- D+ _4 u
h=M;3 F* s% P* k3 R0 O" ?
printf("依次退出的猴子: \n");
  b% L% [9 B7 @! n1 ~. gwhile(count<M-1)
0 b) G2 U& [0 u, A# i4 S9 o4 T{i=0;5 d2 |  @) z! `1 o8 r
while(i!=3)
% K1 b& w3 V: ^: G, |$ D{ h=link[h].nextp;
3 c7 m7 o3 g# |% f! O& z5 K, g: G0 X   if(link[h].number). S5 k2 s! c( k; s/ a7 t- i
     i++;}  F7 G* @  _0 V
" \" b9 p/ f  D3 A5 W, D
printf("%4d",link[h].number);; f3 p0 E8 E4 i, Q) s
link[h].number=0;
2 _, Z4 y9 |2 ^3 e$ g2 Icount++;
( f2 S+ h* ~  x3 {. c}3 S6 H3 B( m5 Z* p! [- D7 T
+ y) B0 H' w2 N' X: R8 s% [
printf("\n大王是:");
. f% D5 E* Y" m/ M  for(i=1;i<=M;i++)$ w8 |0 M( `2 W: ~+ z  H* j
  if(link[i].number)& H% x1 \- o5 X! N- [( Z  K0 X
    printf("%3d\n",link[i].number);3 y- p0 F2 o! X5 J8 H

, u! O# y( l- F0 l) A( `' @1 O1 D# _. V. R  Q( O
}
9 ]9 Y; S9 {' Y8 H
第三种是普通方法for循环
" ^' m1 T6 R; z) h$ O+ v
#include<stdio.h>
; g5 l" a5 w0 x) Evoid main()
6 \$ Q; |/ Q' K{ int i,k,m,n,num[50],q,*p;9 y0 }) b! {; C( h! G9 }7 V
    clrscr();9 l! q0 K" d' c: ~. y; D! z; W2 E
   printf("input number of person: n=");
; _" U% ?( b8 D3 K    scanf("%d",&n);6 Y" u& c# l8 o, A2 U3 }
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
7 M4 Z- g, N( t# P$ R7 K    scanf("%d",&q);
* d# ?- `( k, {$ `  e8 ?2 ~# O   p=num;" ?$ N) E9 m  m, K6 w9 Y
  for(i=0;i<n;i++)
; M+ O- m% b; z0 s$ x& A    *(p+i)=i+1;  C! L" T' l0 a) u) I- o+ }
   i=0;: U! s) {% R% d" p2 L5 c2 b$ _" {
   k=0;2 w: t6 d* O. i
   m=0;
7 @+ O- j7 T0 l* c# [  while(m<n-1): T1 l/ S1 C% R- H
   {if(*(p+i)!=0) k++;- w9 \& f- O6 w1 m6 \3 K* x
     if(k==q)
# |# V+ O% O$ z7 ]      { *(p+i)=0;6 v1 S1 |' b' n. n- u1 d9 k
        k=0;
8 s  T8 b/ [( B0 @        m++;
) _- u8 N! Y8 D; H      }
7 f1 k# j, M+ K1 v5 E4 ?    i++;
; L5 f1 d! l, L# L    if(i==n)i=0;1 z) D8 i& Q% a: M: Q
   }
7 W  F( l% A! o9 [/ |  while(*p==0)p++;
& l( v+ _, D, z' G    printf("The last one is NO:%d\n",*p);
# h6 t' Y: G: r9 h) ]     getch();
: m/ g9 {" D" u
/ t! l  T1 @6 d' f}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
* f! b( o# U& \6 }( B  mnamespace 又费马达又费电2 z7 W( B0 i& a/ u7 p+ {: o
{
) S3 \: y2 R# ~( g9 g    class Program
" k: [. k5 c. B: ~    {
" b0 m; F1 a, _5 Z$ B% ?- A5 p6 _7 x+ L        static void Main(string[] args)
0 h- y& R4 T1 {        {
+ ?2 a- H% ]" S+ T            int m, n;
1 p% r. ?" v6 Q            Console.WriteLine("请输入数组长度");
  G! o( C& v0 K  R/ ]            m = int.Parse(Console.ReadLine());//m为数组的大小
/ M1 z( z" G0 x: ^, r            Console.WriteLine("请输入要截取数字的大小");
& N3 [/ s" p7 U5 |+ @            n = int.Parse(Console.ReadLine());! {) d: t& v" C$ c
            int [] numw=new int. b9 C, F1 h& @$ ]- ]1 X, ]1 F" _

1 ~& a6 P& U0 `$ @4 Q&shy;&shy;&shy;;5 h: X# ^- F" t+ ?6 Y. K9 d2 k. @+ e
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
* p/ v* E' k5 u, P+ ?            {
; y3 H5 @; c. Q0 F                numw[j - 1] = j;
8 W' y1 m1 U* O3 {- F' H            }7 [5 y+ U% ^) }/ x2 X! Y
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
% V( Y! K; O6 h3 R7 f  ^( m            while (d != m - 1)
  o) Z7 d; D# y" b& x            {* C/ l% }" ^3 F3 R- C/ y  m  _
                if (i == m && d != m - 1)
6 g1 N$ ?- B3 i" n7 d4 ~                {- R6 G' e- p) b) Y
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!4 ~6 c# S2 ~4 W  `% V1 ?. J
                    continue;1 u1 R8 w5 b) N5 Y; l
                }: `9 ~. M4 e0 p7 {
                else0 B% J) U5 r4 N9 s, f" C
                {
0 N; J  y4 |) y9 E                    if (numw[i] != 0); @6 |2 U& _+ d& V2 m" [9 l  M
                    {
. p& j. k- f) G                        i++;
' o$ b$ q, ^6 \" Q                        k++;. c& h) K1 \  L. T
                        if (k == n)$ b# B5 q6 C( u* I
                        {
& ~$ ?( y" q" A; O4 x6 h                            numw[i - 1] = 0;//把在n位置数组元素的值改变了0 w9 m3 ]$ n2 M: G; N8 Y
                            k = 0;4 j5 r* z' u8 r
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
4 ]4 R7 X# O- P  h% J                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);$ i+ M8 C, a# s4 ~+ k
                        }
6 R; ?7 h, |) R2 u. k  j: T                        else//输出暂时还没有改变数组元素的值
4 ?0 T0 p, ~( B- n1 O% I                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
  \4 D- Z! x2 B; E% N                    }, ^; X( u  k1 a- a6 |
                    else
) @2 D3 v0 Z& g/ h4 p                        i++;//数组元素为0,直接跳过,不计数。。。
8 T$ R, r* q5 m8 t9 Q+ @4 @4 L! \" R                }2 ]4 i! \: [& K+ `: L
# Q/ t2 T) P) Q7 L2 b1 u

% `4 W4 `9 r& L            }//结束while循环
% Y: x* H( H$ a' T& Z            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
7 E* Y1 j0 l/ S* E             r) _" C$ c: G4 y; r) X; s. |8 L
                if (numw[i] != 0)
  h- [5 @6 J9 |: B9 E  i" |% v0 b                    Console.WriteLine(numw[i]);
: Y! p" @  Q" d* z4 \! U  z( E- h           ) c8 h/ D; B" r% n% }* @
            Console.ReadLine();
4 P: ~9 E( C- a7 _        }5 R0 D4 P; Q2 Z, U6 p
    }) S) v; ~% n& H' O
}
+ k6 e, r4 Z, j1 y% 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-5-26 05:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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