鱼C论坛

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

猴子问题

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

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

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

x
大家好!4 m1 \" \, s( @: F2 x( c/ X
这几天我在忙着编一个问题,我用了一种方法编出来!
! G. b0 T, P1 ]但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
/ P, I; x/ g, X) K, |' s% u注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
1 h3 c& y$ x" R! C
. l8 ?, a- X4 z2 A
; B! \8 e. {' s8 I  ~
                            题目
: Q) v. a+ N2 y% r/ Z山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
& s' ~5 `& J! b+ @; b第一种方法:利用循环链表
, ~9 b' q0 g# j8 |& V2 ^' S$ q#include<stdio.h>( ^+ b. H& m, c  J& F- [8 V# r: C
#include<malloc.h>
( h7 H+ p0 W; F5 M. Q5 ]/ I#define M 8            //共有8只猴子: ^, n0 p0 [8 v  Y9 V$ E" ^7 `8 K
#define N 3            //数到3只时退出第三只
& `6 m: x! F/ o7 ~typedef struct monkey$ ~9 k3 i$ g) x+ ?4 D
{int number;
) _4 N  O1 V/ H; ~; D2 ~6 aint flag;& Y* [9 V# U, T8 b3 W; I( S' p/ j4 [
struct monkey* next;) a1 K- o* @; Z- l/ W/ W
}MONKEY;7 U* R- y/ }% h: U
main()8 K8 F, q! h0 i4 K
{ MONKEY *head=NULL,*p,*s;5 ^  w8 C$ r9 m# }* }7 y! J% H& D
  int i,sum=0,count=0;
( w8 s; F3 z" [1 b  clrscr();              //清屏
; B! N$ K" {0 i# O  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
, T* L9 f  m/ ^2 W. C& X  p->number=1;p->flag=1;* n6 d" S  ~3 G9 d# F
  p->next=head;8 n8 l. }7 z' h) x+ X
  head=p;
- P9 Y# ?4 o$ \* i1 @! A  for(i=2;i<=M;i++)
3 P5 G8 h. k  x" |% g    { s=(MONKEY *)malloc(sizeof(MONKEY));1 h, l6 M, i0 ^7 {( |7 g7 Y/ ^
     s->number=i;s->flag=1;$ L1 F) _( H4 f( Q& Z% L
     s->next=head;
6 Q& U6 N( G, I7 ?1 \     p->next=s;p=p->next;1 I: R% }% x4 @# M
    }. M. N+ G' O% b
    p=head;
8 H9 _$ Y) U$ T! S   for(;;)5 a1 L( H  J2 C: Y
    {if(p->flag==1)! w  x6 A# o" V7 S0 u, F
       count++;1 f2 }% f  u: @6 H
     if(count==N); C, c. \' e8 n6 r% r" t* o  @
        {p->flag=0;& J' \& S7 ]0 @( Z3 q* o  \; F
         count=0;8 k" l* U; b1 X) h
         sum++;}  Q! Y- \. k3 c  Y$ c8 R: b+ N7 H7 s
     if(sum==M-1)- i& t' y8 Y8 Z4 Y  c# U" @
        break;
$ {4 |+ ?3 k; M: L( Z     p=p->next;% l; l: y5 h  R. D. v. m
    }) _) o5 L) B& l8 D
    p=
( F  H$ U( _! H& G. z$ L) B    head;
2 k* B6 j* ~! N2 o3 j/ Q" W: D1 Q    for(i=1;i<=M;i++): ?5 w4 M; _: P: ~9 H7 e% b  m! j. A5 r
    { if(p->flag==1)
' o. Z7 N# g# F$ f" S0 I        printf("\t%d",p->number);
7 i& F+ F: p. Z! V$ I      p=p->next;
. @; N# k/ Z( H, C: D    }6 b; ?: \' u8 i, m

! _0 O; }, [* v- m" p
  C$ P! v# s" M: z0 Y/ ~* }
* u1 Z+ n0 `0 s# y7 D}

; C1 i$ }5 \( h& F0 U7 ^8 Z第二种方法:数组' k' O8 l$ s+ I( E- G
#include<stdio.h>
7 r# ^8 Y. d' c5 M#define M 8* D2 b' \' s1 `6 ]) @
struct monkey
! v" P. d& K  j( ]9 R; ~' }{int number;
9 f5 u9 I3 Y/ y2 q; I9 Q6 y& ~int nextp;/ b( M: a2 _- @/ D2 q* t
}link[M+1];
7 i2 T, ?6 Z) D" R( S$ e1 j9 L% T5 _2 _$ \" }
void main()  o' o1 _% V0 ^" M/ N8 {
{int i,count,h;+ y2 Q  b2 T- Q: j; D9 d
for(i=1;i<=M;i++)' R0 z5 [# I' c2 N1 k
{  if(i==M)
6 @; Q3 V) D, f4 o# k# f   link[i].nextp=1;
; ~8 v3 k: x& e* S  J; H2 N# n# @   else
1 t$ p9 h* [) t! C! S; Q! h# {   link[i].nextp=i+1;# W2 V4 ~3 f; y0 H# k
  link[i].number=i;+ u5 k# o, W# j8 N3 y  `  i
}
, b$ {/ Q' d# X8 zprintf("\n");
$ V$ K# w. m5 ?count=0;
+ ]' M. e- K5 ~, w- n$ Dh=M;6 a% H) D, T& [$ J! d7 ^6 w
printf("依次退出的猴子: \n");! k0 ]8 d# O1 z( U
while(count<M-1)6 U3 h3 |5 \& K8 z
{i=0;
. I9 ]. _3 q- c  ?while(i!=3)
' Z) ^6 p, a6 t! x{ h=link[h].nextp;' S& T1 j4 s# X& k
   if(link[h].number)
$ l0 i# m; z" d9 `- K0 y     i++;}/ w# N) N* m1 `, J3 t0 w
2 o  U+ l8 v0 Y9 D' r; w
printf("%4d",link[h].number);9 I3 k, H$ w# E+ i' B  t8 {/ C! w
link[h].number=0;
2 D: ?  I* \5 {1 i' p% l1 E2 R) ycount++;" }% S+ R; ?8 @9 h7 [
}
* x" }6 B' z3 }! O, a+ t: W( b/ f* }7 W  {6 G# }
printf("\n大王是:");7 w, d  v% U4 u) E0 X. d/ h: |
  for(i=1;i<=M;i++)
7 j5 ]' z6 V( x& {! F, g: L0 V  if(link[i].number)
1 L! n1 A9 I8 T  P    printf("%3d\n",link[i].number);
+ N3 s% t+ q/ \6 y& p: Y/ b3 q* C( s$ }3 Q& J, }" e

! Z& {1 s, w" g/ r) Y; U. H}
; I) w/ `; M; v* o% z; n
第三种是普通方法for循环
7 m' i* ]6 r1 P0 Z3 C
#include<stdio.h>
( ?- I- r+ O2 ?( S5 ^void main()
: F) K# O/ v) J# ?) I, ?  J{ int i,k,m,n,num[50],q,*p;
  e9 m, Z  r& }  I% J    clrscr();
, P8 H- Y; e8 b7 }' \   printf("input number of person: n=");3 L! m$ y' E$ `. B( J9 L
    scanf("%d",&n);* W/ k1 F+ y. \& F  `
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
1 q; [3 s- g) O    scanf("%d",&q);
' n: g) r8 e$ V   p=num;
# p. Z; K1 [3 R. m# o6 H/ V  for(i=0;i<n;i++), J6 x, W2 l- O. V# I, _$ z4 N
    *(p+i)=i+1;$ D" c! {/ e$ W/ ^1 A
   i=0;
* W5 ^1 D: H2 M! M/ s   k=0;
  a6 T# S$ B8 K3 M+ R& `   m=0;
. Z2 `1 C0 f) K" G# b  while(m<n-1)
; V( w! ?) z; o7 z2 r6 @   {if(*(p+i)!=0) k++;4 g! k) l3 u/ S9 H( ^5 K# Q+ w
     if(k==q)
% U1 H/ J* ]8 X( {      { *(p+i)=0;. f; @5 N. x3 s. q
        k=0;/ ]& B4 K  X- V( T
        m++;
8 u  e2 g0 z' A4 h( w7 h- ~5 F      }
4 I2 j* J8 g- X, [    i++;! k# Z% i6 S" T
    if(i==n)i=0;
) V, s" K  |+ z6 P( x, r   }- F5 _4 {0 p' R
  while(*p==0)p++;
' X0 U- k% A$ U' H( {    printf("The last one is NO:%d\n",*p);
& G0 H0 Q6 k# w% [. @. c$ u     getch();% }" {/ |5 \5 V( Y; [8 d

/ R& A- `$ H: M2 r}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;3 b0 n  C' u! {$ B  x) V
namespace 又费马达又费电
& w* R5 G( L% v2 I/ [1 R{  i: r, @, F2 B  J* V4 @! [- p8 Y2 C' p. Z" O
    class Program) z! }) s8 Q) Z2 @7 I6 i2 c
    {
( w+ \1 \# a! [        static void Main(string[] args)) R- i1 D: X3 c  I6 E0 H
        {* B0 b6 P. \* U7 r5 S
            int m, n;/ A5 s# y5 t+ s2 Q( E
            Console.WriteLine("请输入数组长度");
9 q+ f5 H* d& B6 v- A$ F( I/ B) `3 R0 x            m = int.Parse(Console.ReadLine());//m为数组的大小1 S+ i: M. S5 W1 N7 i8 }' n, u
            Console.WriteLine("请输入要截取数字的大小");
% S: P8 _9 }. `3 u% I9 V            n = int.Parse(Console.ReadLine());9 q. M. f) m! A+ @' P& x
            int [] numw=new int
. _; K5 J8 t1 H6 u) q4 m) [# X; I( u; k; R4 }2 ?3 R% }% z0 B
&shy;&shy;&shy;;
5 O4 R  V/ |9 F4 m7 n2 ]' |            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数* Q0 c: [% I* P9 g0 J
            {
& ^+ D2 p6 ?" T$ c4 b8 y* ^                numw[j - 1] = j;2 I, _6 H, a3 i
            }! P" g* X" V0 I! n% `( s( i0 a
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
: E+ j# c/ D9 N2 X! U) k7 a1 s            while (d != m - 1)" ]8 K* b( {" d( p5 u6 @
            {3 n0 g9 ]% P/ H+ U! n- P
                if (i == m && d != m - 1)
8 j$ i. [- Z' G) N- e9 W; M/ I. P- e                {
/ Y6 ^  P6 f% |% J& L                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!5 t& g- m6 E2 G* c" v5 n
                    continue;6 B9 r$ x) B$ ?. o0 ~9 |
                }2 U+ o) u5 j' T2 U' k& {, q
                else
5 o& t" ?9 S; v( p7 W8 [& u' r                {
  {/ h1 B; v6 n  |3 K                    if (numw[i] != 0)
) j5 {" m- X8 J8 X% J2 N6 H                    {1 _5 @7 }8 V' O5 f
                        i++;) F  x- l9 e* k% N0 O" ^
                        k++;' {% f: I4 V: N$ h7 O0 E2 h- @
                        if (k == n)6 A* Q! m$ |* h3 I6 K% a4 u
                        {
2 f/ }3 ]2 q, l  R7 ~                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
2 T" g' M/ o! j& T  _& b$ M( E' ^2 N                            k = 0;
, F9 G" y1 i  w              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
+ V; ?2 i: w- O7 d                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);2 }* W2 U# Z( R6 V$ P" a
                        }2 [4 s9 c7 D8 O& P5 n  ^
                        else//输出暂时还没有改变数组元素的值
* a7 |! J; W+ b: e; M0 L# S                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
* x# v% m+ V; x                    }
) |# O; y% n; x# t9 a, [3 U                    else2 A4 X+ p$ c& b* L4 G+ ^# u" n
                        i++;//数组元素为0,直接跳过,不计数。。。- P4 n+ U# T2 Q. X7 m; Q% x" P
                }
3 `' a$ l$ }3 T" `/ k; o; ]) V
2 N4 y* ]: `) B! U2 ^3 p) T! P! e
            }//结束while循环4 U3 s! h& c* S; Z. T  z* N
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
, ?3 j) U3 v' ]0 n0 A           
; l- ?) S, p% Y                if (numw[i] != 0)1 C$ }, ^. O6 k/ [9 u
                    Console.WriteLine(numw[i]);$ C( X/ A2 l3 q
           ( o  F$ d7 ~% `5 h8 ~
            Console.ReadLine();
. z9 [4 ^% p3 F0 s6 o- ]0 U5 C( z5 m# P  K        }- R, Y% ^: s! g& T2 C$ ?
    }) w" J% o$ q3 Z# V! _
}: c7 A* n( {( p
小甲鱼最新课程 -> 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-7-13 08:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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