鱼C论坛

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

猴子问题

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

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

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

x
大家好!1 D6 A7 X4 ~. x3 s, n+ L3 E7 }( b
这几天我在忙着编一个问题,我用了一种方法编出来!
" s& V- D- s/ ~) F' h$ Z/ {9 G但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
- ]4 U) R. I6 q4 c" y注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
: s) q9 H) T" v/ m6 E7 P( E/ \' h6 V; |, O! g
, Z  {( z1 @2 q/ j) w) g7 u) T! n
                            题目- m! ~2 V( o& `5 C5 j" o
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。! W4 \5 U! T6 C
第一种方法:利用循环链表
6 q' t, H, I$ u' M: s/ d#include<stdio.h>* z* Y, h1 i0 G/ d  y+ y
#include<malloc.h>
3 a; m! U' Z6 q3 N. O! a: i#define M 8            //共有8只猴子
& t4 b' y" N: V( A/ L#define N 3            //数到3只时退出第三只. k! P# w/ O+ o" ^# r  ~! B
typedef struct monkey* v: F' `9 d+ m1 j8 W2 r
{int number;; T# U6 g* h/ `6 w: n2 O# L# F) ~
int flag;: t$ E! a( K0 ]  U+ ]
struct monkey* next;4 \0 n6 W- w8 x" \1 ?
}MONKEY;
% C; f" T# V/ M  z+ amain(), H* ^0 C1 e% D$ v- ]0 Z. h2 w
{ MONKEY *head=NULL,*p,*s;
/ [1 \" _$ @# b  int i,sum=0,count=0;  k+ @( s; u' P
  clrscr();              //清屏0 L& f* [9 C/ o8 {' e$ \# s: A
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存4 L/ F  f* Q+ G, X4 L% k
  p->number=1;p->flag=1;  }: O9 c/ w) c- t7 u
  p->next=head;& P* A" j6 W6 w+ L
  head=p;# i2 O. b4 {+ Z2 c4 \, C. K
  for(i=2;i<=M;i++)9 s8 A: d3 Z+ X, ?& X2 c
    { s=(MONKEY *)malloc(sizeof(MONKEY));: U# F! F+ R4 H/ }* d4 R
     s->number=i;s->flag=1;6 U4 x9 d8 p5 q# N" T
     s->next=head;" ?1 o: s3 A( Z( H
     p->next=s;p=p->next;
7 y3 ^3 z* B" Q. D    }/ |  Y, }* y" s2 A& T4 ~. ]+ Y1 h
    p=head;
* j1 E2 s' h. D   for(;;)& y( _1 |/ A/ l- ^$ V9 \+ R
    {if(p->flag==1)
1 z4 l( ?- r7 Y* q1 ]       count++;
7 I" P0 h4 \" }& {6 T+ }     if(count==N)
/ K6 Q0 l+ q. X; n" O' @% H6 H        {p->flag=0;2 O6 z  E% _0 c) J4 \" H8 v. u
         count=0;
5 D- {, ~' V7 U6 s/ U& J         sum++;}3 z1 l9 d& j& K$ R; m' {
     if(sum==M-1)1 q6 c  _  Z* R* {0 ]' C7 i( W
        break;
9 w) A$ ~3 R' S     p=p->next;% k( y0 a* P# V; T
    }
& H; A: x  d- O, w! \9 u+ N! R    p=% {( ^% \" `1 d7 b5 U3 G6 d; G
    head;
$ l+ o* H& i2 J- C+ I    for(i=1;i<=M;i++)
+ e' {5 Z, Y) G/ A- y" c    { if(p->flag==1)
# N, F, x/ g7 ?  r; b1 D1 _/ `        printf("\t%d",p->number);$ }" J. X1 ^3 r1 v! o
      p=p->next;! N. m8 e5 l9 J
    }
8 c  w( J4 k# v( P0 \2 @- ~) q3 w
& p+ T- E. I5 E' `6 Y1 ?
0 H) O( q7 D2 |, q! Q
5 {7 K4 X# n& |1 I1 l4 \1 {# q( H}

4 G7 }  t' {  m第二种方法:数组
8 ^$ c; g  i5 f) T! c; o#include<stdio.h>$ o7 z% k9 R1 l/ L8 t' e0 r
#define M 83 V8 H* l; f5 d5 Y8 c
struct monkey, N( `* q1 Q+ W* [3 O6 t& y
{int number;3 Q+ _* `8 a: B7 l" @
int nextp;) ?  X+ [+ J1 {; X, ~: c* Z
}link[M+1];% {1 {' q) `2 \, w2 T
  G' {) ]( F$ m4 b/ m+ V2 T
void main()
! I3 W1 p( T/ v' C: D# c6 z* f{int i,count,h;  _' M0 p9 ~" p+ V2 u# j8 m
for(i=1;i<=M;i++): B7 G7 q5 W( m5 M% Z* f1 v
{  if(i==M)
: N7 u3 Z# s) K8 L, q" @   link[i].nextp=1;* V  L* ]+ d4 E5 |! b
   else8 f2 q& g/ i" B# [( ?+ o8 T) T; K9 w
   link[i].nextp=i+1;" O7 [8 E  e4 q/ D" p8 g
  link[i].number=i;/ `- i7 G. h" h+ h, U: z
}5 z1 `( b1 X& w' q: m2 ]
printf("\n");
8 h$ P" `1 h6 O* Z* p/ k4 Bcount=0;
9 }1 S, c1 {5 ~h=M;
" D$ Z& ?; t9 t% L( O7 t3 W! _printf("依次退出的猴子: \n");0 V3 g8 d9 I& p" g+ g, z
while(count<M-1)
8 z+ N) j5 E# ^) e2 r3 X8 L7 `1 h% U% x{i=0;7 _/ X* I- a/ x* ^' h- a" h
while(i!=3)( g% k# x) q5 ?
{ h=link[h].nextp;
9 j6 _1 M7 }' i9 `   if(link[h].number), D- l2 f7 C% y9 ^  A
     i++;}
' s& N1 J9 j2 W" n6 m* W
4 u9 C1 G; o0 ?$ @( N" b9 zprintf("%4d",link[h].number);! Y& i+ D( {5 i0 l1 q) A, y
link[h].number=0;
+ r; \) N8 l# D3 p; A8 ycount++;
  F8 D: t0 c" @( O3 R) i}' H  ~- l2 }0 D; f' \9 P

+ u  m: k. |0 E, j, Tprintf("\n大王是:");3 q7 ]$ y+ S4 y- L
  for(i=1;i<=M;i++)
: |  ?, k: _" R; Q# V% L  if(link[i].number)
! X% o! ~# ~' j, V7 _& K    printf("%3d\n",link[i].number);9 h) [9 \+ `7 z* N9 G& P5 N

) H7 u# k8 b5 `+ \
  k0 f- ~+ J$ ^( z}

2 X( a* C- {- m. z* G; `: A第三种是普通方法for循环
2 e4 B: R7 o9 L* D
#include<stdio.h>
& Q7 |- E( P. b1 m3 ovoid main()
5 D# f; j; T: e; ?4 a# U$ w6 {{ int i,k,m,n,num[50],q,*p;0 \" J+ F! ^, Z8 H' X- }
    clrscr();
6 q. G% u5 S: v" r   printf("input number of person: n=");
. J+ b  w0 n- p" ?0 }& Q    scanf("%d",&n);
, O5 T2 ~6 z4 y) g* iprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
. w4 F: F6 e2 W9 Z    scanf("%d",&q);( @# ^( ~2 Z* I; b
   p=num;
' T& a# n# w8 p  for(i=0;i<n;i++), I  L: M/ @* I& n
    *(p+i)=i+1;% ]8 u" @6 y5 D9 M7 K
   i=0;
) Y  s4 w3 Y  N! h5 f( c7 n   k=0;
5 i5 l- G% v( G# g   m=0;2 A6 @7 t$ I/ M" w7 N. O5 E" R1 X
  while(m<n-1)
8 `' j/ x% P% g8 C( ^  Z$ \   {if(*(p+i)!=0) k++;
" B9 O! Y0 j/ x$ C     if(k==q)
: s0 K% K9 E, r4 A3 A7 _% c      { *(p+i)=0;% _+ [8 l, s7 E6 R$ T
        k=0;
! i+ c9 c- b, t8 i9 ]% S" G        m++;4 n' W2 u. D$ t$ R! ]) y* R$ M% R: a
      }. f9 Q, x5 e" b" {
    i++;3 v6 a; e, K2 m9 e
    if(i==n)i=0;
4 `( s# M) H0 ~% B   }
1 c0 @1 r, ^* G! g2 j6 r  while(*p==0)p++;
, ^: y9 z: {9 V. o  y( G6 y    printf("The last one is NO:%d\n",*p);5 C/ b* a7 [9 v1 n9 r7 s5 g; I4 A5 H& ~
     getch();0 f; _% v6 V' k. x7 S1 r* Z
; j3 H  S3 ?4 @
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;- D+ c# _6 c3 `
namespace 又费马达又费电; d/ {9 m0 G) S" \( E; W, \( i
{" ~+ L& M: L% k% K7 T% k
    class Program
6 b1 m5 w; b$ I- w" I5 {3 E& N! n% D    {
# y# Q& M7 {  o$ b# W: s        static void Main(string[] args)8 N% d7 ]- R2 x7 B
        {# T% X4 L+ D+ q& H) u% n$ O
            int m, n;
$ x- ?( H! v  k9 T  S' x/ z- M            Console.WriteLine("请输入数组长度");$ w- ]+ z- i0 q! i  y
            m = int.Parse(Console.ReadLine());//m为数组的大小
- m+ y6 X" ?- D% i5 s* h            Console.WriteLine("请输入要截取数字的大小");; V* k4 D% a8 u6 W
            n = int.Parse(Console.ReadLine());
. D8 `/ h% K+ B: d" l            int [] numw=new int( x" V7 `5 l9 v0 V# }) t3 i

9 M) e  g* v) T) D6 d&shy;&shy;&shy;;
8 I* y0 N# M, T5 Q, [            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
8 U, @3 Z: K; |. K+ h& H9 [- H5 s            {
" x+ x- x, x1 A0 u                numw[j - 1] = j;
' M0 L6 d9 U. |/ |# h% s# G            }
* w% Z+ c! i( ]0 P* X* r- A            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!& |$ k1 m. ^7 I& l
            while (d != m - 1)+ |/ K4 d6 c$ f4 V3 B* _, M
            {* M5 c3 I" x& t( ~9 v1 F0 H
                if (i == m && d != m - 1)4 R. e8 \+ q" x. R' J
                {
; A' E% T9 V- v( I) u                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
) C/ O7 V- T' _& C6 {                    continue;
; c8 p* ]  V5 v3 h* y                }
# T& o# u# K$ B. F. e                else
: Y8 |& h( ?3 v& o9 X* z5 I! O                {( B2 C) R8 t" p" V& a
                    if (numw[i] != 0)
' R6 K0 S3 c: ?3 J9 w* f! ^                    {, f4 w; \! Q% q7 f. `
                        i++;# Y  c  x% D$ U4 E  r6 k. M+ B
                        k++;
: M* q5 n0 g8 V6 Y* @                        if (k == n)
( F6 c2 C4 V. G2 E1 @' p                        {$ P% E4 O0 `6 s: U5 N! o% w" D! j& L
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了0 S& F. p  N4 }- N/ h! P  M
                            k = 0;
% C# Y2 s1 }# |5 z& k* o/ y5 o% K              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1& I, L! @. Q7 f/ {6 G3 f  W
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
! f% x; x% n- `0 }$ L                        }
; k% p  `9 J# T                        else//输出暂时还没有改变数组元素的值
7 u) s8 D4 d1 A4 E4 `+ A" e                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);" u4 L' W; Q% U6 n0 X" j* ~* ?
                    }
; m. M4 l$ x! ]                    else- c  e* U7 Z& g  m8 ]4 |
                        i++;//数组元素为0,直接跳过,不计数。。。
% a& e# H2 x1 E' V6 h                }. v9 |' n. _& Q" q. N
! K9 F2 i. {2 P
% y( u  l. z: y3 _. `  q
            }//结束while循环1 e3 `4 y$ ?& H8 |- X/ a, F7 @
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
* [1 ]2 q2 v! v$ t  n/ e: X1 z' s           
- U0 g( m) r0 e                if (numw[i] != 0)
: V* @* c* j6 h  Q, M) D' F                    Console.WriteLine(numw[i]);. a- T9 C5 A* c4 [* T: H. ]
           , y2 c- Y$ N' t" X1 B9 |
            Console.ReadLine();" |: ^' u: ^0 ?
        }  o8 p- ~; p; V& s5 J
    }$ P  d. |. }) I- O0 q, b- [. I
}
5 _) f0 d; z7 w& t/ Z
小甲鱼最新课程 -> 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-4-4 21:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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