鱼C论坛

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

猴子问题

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

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

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

x
大家好!
/ B1 U8 U0 Q4 J, o0 q这几天我在忙着编一个问题,我用了一种方法编出来!
5 H7 W! Y$ L5 y: h2 r, b0 g但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
6 M: k" }9 Y. p+ O. |注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 & N- ?6 h- G3 q, [' N
3 ^4 r$ w; L- _/ q

& ]! T0 ~* M- d' S3 G: n
                            题目7 \$ ^+ I9 X7 f" x) t+ B4 y
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。& M  x1 v% Q0 e
第一种方法:利用循环链表
, t. Q6 j! _" Q( }#include<stdio.h>
  w0 A, X# d1 X8 x5 e1 V& L#include<malloc.h>
! y. B5 f0 F4 g6 m/ k4 }7 Y% L#define M 8            //共有8只猴子2 I: _( \- `2 j. x
#define N 3            //数到3只时退出第三只
4 T- ~% g* o) _$ n4 G- Qtypedef struct monkey
/ {5 T$ w0 J" s9 j, n4 F{int number;7 d/ A6 C: n& b  N  k) t
int flag;
$ ?4 `/ a. s' G) @8 P/ U- |struct monkey* next;& @1 F2 E, M6 S: Y; r5 B5 ]  C+ d( X3 Z
}MONKEY;
) a4 {4 f; V; smain()
# I/ R2 |% o- i! N* U, B{ MONKEY *head=NULL,*p,*s;
1 e2 C# T2 r! s) R& O. p  int i,sum=0,count=0;
  F1 b4 i, }& `' G8 P  clrscr();              //清屏
) c. U+ o2 v  Z  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
& A3 J  Y. ]7 A; A. A  p->number=1;p->flag=1;
/ C7 C! Z/ }7 m1 N  k3 W5 n4 b3 P  p->next=head;
, j7 G1 m' q" L' f4 s; J  head=p;
. g# Q+ v8 x. t9 Z, k- C  for(i=2;i<=M;i++)
# G4 u- D2 f0 c0 O9 n+ I! L: y    { s=(MONKEY *)malloc(sizeof(MONKEY));
5 V' s2 ]9 h8 [) \     s->number=i;s->flag=1;9 c4 ?( U. J2 L) m
     s->next=head;
) J$ ?, b4 Y, E) t4 M     p->next=s;p=p->next;
! H) P2 X" L3 L, M! N6 O2 K( y    }
2 W" W1 o) U/ V) J. w- ^" Z. S    p=head;7 D8 Y: l# z+ c8 U
   for(;;)1 \& X% e( S$ Q& [  y
    {if(p->flag==1)% J. K" e: l0 G1 j
       count++;  k+ R8 V7 i& I: x  N5 K- I
     if(count==N)
0 u3 ?7 m3 {" |8 q& C        {p->flag=0;& z# f- v! F$ @- `
         count=0;
- h  u6 {5 g- V6 _$ X         sum++;}, G* q5 [/ v" M
     if(sum==M-1)
0 P0 l8 B, j* i! A! B        break;
' G- I4 s" \# ?& z2 ]5 X     p=p->next;
9 r* N+ S9 t+ c& S    }
) J, Y. p- P- z3 ~5 o4 H, |1 C    p=
; b' I) L$ m0 X( i: M    head;$ i: o& ^9 o  |& b, T) O
    for(i=1;i<=M;i++)+ X- e) ^5 w" e
    { if(p->flag==1)
" F# _3 x3 [8 o        printf("\t%d",p->number);- u# H5 `. n  n% R- l5 ^2 v
      p=p->next;& k8 M3 _9 i" F+ J4 Q, X7 W7 B5 u; u
    }* Q; @2 L4 ], ]5 @' }/ b: N

" J1 s% ~7 m; ~! Z
9 i4 k. c6 Q4 w8 q; Q  D! e& X& i& V" s9 ~7 @% @2 T* y/ y' V6 H* `; `
}

5 N: t. q' R) s) S4 L第二种方法:数组
8 y' `3 |1 n0 m& i#include<stdio.h>
1 S% A& p# h1 l8 _1 C4 r) e* C#define M 8, B% Z4 }' R% U9 _
struct monkey( q9 e9 a9 E( p& g0 y" ?; Q2 ~+ ]0 }
{int number;1 M' f, p5 l3 A: W: I4 O; H
int nextp;" x2 M3 C$ o2 \2 `; D1 `
}link[M+1];
% v+ `. b. \" d$ x( u) p; I( G! K, t  f. ~' W3 {$ v: V* c
void main()
& S$ y: s( M$ Z6 a) h$ Z$ K{int i,count,h;' M+ Q8 s8 Y7 W7 F' e, L/ d# H; l/ c
for(i=1;i<=M;i++)
" F# s7 ~9 q% ~% T" `7 _% G{  if(i==M)2 ^. `7 K2 R2 Z! n- Y. U$ s
   link[i].nextp=1;" s6 R8 u. s4 X  d  }7 S9 i
   else
0 K5 R3 W$ t2 v4 }; d" d   link[i].nextp=i+1;
  y  j  c: `# i  P7 `) B+ N  link[i].number=i;
8 |- S/ ~* `8 K}
! u# v( k5 R  H" |+ e9 |! aprintf("\n");- o/ x, g* i" _- ^! d/ {3 A/ V
count=0;# s4 w! y; N: c
h=M;7 U0 h. S& S# v; N
printf("依次退出的猴子: \n");+ {' t/ d6 E0 r: G& n
while(count<M-1)
( T" o" e8 a4 X# s" Q5 ~3 d% D{i=0;; i' _6 K3 u$ `6 O6 _. b
while(i!=3)5 q* m, I4 F) k3 t5 t
{ h=link[h].nextp;2 |/ l& |$ X0 i0 k7 ?
   if(link[h].number)
% n: q: l: {' a, K" o4 c9 T     i++;}& J& J7 m6 K, H( K! o9 t2 K
( f: R$ c9 J4 `4 W
printf("%4d",link[h].number);  B6 X, g) j+ ]
link[h].number=0;/ `$ x' x4 n1 q+ L7 J
count++;
, f- z- S$ h- t. g* G}
" l7 A+ c  @- P4 R0 ^
0 M$ g  ?' v7 Cprintf("\n大王是:");* D6 N, ?. E1 [! I$ ?$ ~
  for(i=1;i<=M;i++)7 p2 d; z  b, Z; H% I. x
  if(link[i].number)' R+ Q0 c2 u9 g$ [4 e  u
    printf("%3d\n",link[i].number);
1 @  l& a: I9 b. H5 N, b
5 q! {: }& U7 X7 r/ u5 h* ^+ b' @6 d
}
# b( N5 j# p& }6 M
第三种是普通方法for循环

' n& L# k. K$ l  I* a1 t* y9 h#include<stdio.h>
6 N1 i( B* j6 h+ r! \- Mvoid main()
& V3 j% r) b$ X( L" z( A) o) G( n{ int i,k,m,n,num[50],q,*p;% s4 l/ s1 J. A, ~
    clrscr();
/ H; k" p6 S; E& U; G/ V   printf("input number of person: n=");6 l. f  r. L! S3 X
    scanf("%d",&n);
0 w1 f; o2 I8 l1 C6 dprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
! c0 t" S, W% h  Y. O- m& }3 N    scanf("%d",&q);
1 C  Y% Q, X& C1 E( r   p=num;# Q0 }0 h$ @5 p( @0 ~- X  x
  for(i=0;i<n;i++)+ H5 h8 O8 E5 C; m( H8 X+ u
    *(p+i)=i+1;
6 B* p; T3 o% s6 `& `: P   i=0;
4 E# q8 R% F0 C6 _   k=0;+ S' J3 K7 ]$ i  n
   m=0;
6 [: E9 S+ n) `0 d1 V  while(m<n-1)3 ^; Q2 W$ ]1 f! C) U( ]9 X: D) w
   {if(*(p+i)!=0) k++;
& u) D1 z7 _$ |- A! Y# E. [9 z4 p; R     if(k==q)2 j. d% B' t& g! E6 K( Z$ n
      { *(p+i)=0;
! g  X; R6 Y1 O( L. ]5 P7 ~! {        k=0;
' w5 o* s; U& B- v6 h+ ^1 T        m++;, \" q5 V; A, X2 ^* O) h* `
      }4 A$ a1 f$ i; T
    i++;+ Y5 q% P: O+ C& v6 o/ p( m* S
    if(i==n)i=0;  p% {; ^) w& _% F2 [% b6 w
   }
4 x5 a& p- F( T7 n) [8 g  while(*p==0)p++;/ i- Y9 F' C% e2 p$ e$ y; p6 o
    printf("The last one is NO:%d\n",*p);
1 ^! D) }, D. Z2 d     getch();
) u4 W" B: g6 K2 H+ k, L+ }
8 _) P" v( c7 P9 B: ^2 n! x* T2 T9 Z}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
' M# w* c1 ~4 j9 a  u; I) Xnamespace 又费马达又费电
# ?+ P$ h; r! `9 ~$ O; ^: L; Y% F{
$ ?+ F! X- ?) b8 S( D- Z  B    class Program, \' G  K/ M8 U0 a3 ]
    {
" x" \) T* Z- l4 ?% o: }2 u. X9 t        static void Main(string[] args)8 D5 o6 f( L' @
        {+ F6 Q4 j5 T0 h2 S6 S/ {4 o" {
            int m, n;  q+ |) ?; U. Z1 r( H. R4 t, f
            Console.WriteLine("请输入数组长度");
5 w# C: X6 T  _4 y: z$ T7 `7 r            m = int.Parse(Console.ReadLine());//m为数组的大小
' f4 S1 B+ T( K8 f            Console.WriteLine("请输入要截取数字的大小");
) G8 ~) ^6 ?# _* ?) W% B0 ~            n = int.Parse(Console.ReadLine());
/ o) G2 W2 h, M            int [] numw=new int' Y% h  V) {2 y5 I# s" E
0 E$ T, k8 l- M3 a$ H) o- k6 Z
&shy;&shy;&shy;;7 `) j! @: |7 S$ k$ W3 _1 u
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数+ c  X4 e7 p# n5 Y
            {
/ `# }& H' J/ q: b( Q* d                numw[j - 1] = j;
- _) q+ H; n+ O6 m+ ^, M- u* c( N$ F            }
( N8 v' p3 ^9 U5 ]! \            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
8 i' [3 G* q0 \% s            while (d != m - 1)' F( e+ K5 ]: P3 \& A6 o# M9 z1 V
            {
& O4 @, Y$ W" B2 v* o) \, M                if (i == m && d != m - 1)0 e  A8 Q5 z' K
                {" ?. g6 ]9 N2 O0 ]( O
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!4 |: |* i% Q" |0 [$ j. Q# w2 y8 m/ W
                    continue;  n5 f% h/ n7 D4 H8 ~
                }
& j/ r' l0 P! s3 R; N0 J                else
) _7 f+ |) o! @2 k7 ?; P3 ]                {6 K- T5 k. i) A
                    if (numw[i] != 0)
" L& w, P& I0 I$ M, H                    {! N" D8 l  P1 @- I$ Q
                        i++;# h% z, l# \0 x; l  w6 _
                        k++;
; P! T- \7 V$ r* [& A$ D% L$ }                        if (k == n)
. W, D" g$ r& B; F& C8 v                        {
$ A: a1 G5 W: M' H5 P                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
5 Y! c6 F) J7 X. c2 s                            k = 0;* m& N, Z7 k1 R
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
7 M+ [) [2 i: r/ Z9 g/ }                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);4 E0 o7 \" T! x4 o1 @" ^
                        }
$ s4 Z$ d1 m0 J8 Q& p) W( L4 D                        else//输出暂时还没有改变数组元素的值, S' y; M' h2 z8 y" t4 X- v7 k( l
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
8 n: d! x" F5 Y+ ?: V; k                    }0 t; n! A2 P5 k. A$ w
                    else: P# d% Y2 x! y* M
                        i++;//数组元素为0,直接跳过,不计数。。。! [4 B& j9 Y, E
                }5 y3 B" Q  _" r6 u/ w7 U# n
& L" P6 ]$ q! ^6 z$ f

0 ~* `+ _% p; W" Y# {2 L& h$ z            }//结束while循环
+ P; r" G4 p  l0 m8 `' v2 k1 e6 I' x            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
0 i/ p5 g0 T: C0 u+ A& R  w           ! [' ]8 N3 s: J+ \, n7 y+ [
                if (numw[i] != 0)) e  H: d# E! V' Q+ X
                    Console.WriteLine(numw[i]);# Z, x" f0 G' R. L3 Q. M$ D- f
           
: N+ Z. K! g' C/ p. F9 P6 V            Console.ReadLine();
, S% ]  G8 `4 _5 Y# U        }
. R' B, C( {+ N* N% ^1 B    }
/ s! _4 Z9 C& x}
, j: y2 r, r! s" {  L2 [, o' P9 h
小甲鱼最新课程 -> 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-12 16:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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