鱼C论坛

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

猴子问题

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

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

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

x
大家好!
$ r3 ^" |( {" Y9 _# i  L这几天我在忙着编一个问题,我用了一种方法编出来!9 L& j" w0 J7 \5 P. }3 I" o0 z. N& |& f( A4 s
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!/ H) B6 r5 H* L$ f* T! g2 U; _* E
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
6 ]8 P  _. V" U0 M4 z' b* F, b
, F6 K" [# r4 E; |  q2 J3 B4 n. e; w0 v& p( x
                            题目+ z& {- l! p) ?
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。$ r. D) z( K/ W4 t/ F
第一种方法:利用循环链表3 k" V+ o+ v! o1 k  T3 M
#include<stdio.h>
& K" r6 A. E% E' y! J& @#include<malloc.h>9 [1 j: K, U+ Q8 D0 Z
#define M 8            //共有8只猴子
- W5 c, ], ~! \9 Q9 b! C#define N 3            //数到3只时退出第三只* d: ^, K/ |4 l: Z
typedef struct monkey0 P' p) t# h+ M' f/ {$ ?: b; V
{int number;2 W) m( A0 z# o( C9 |9 o
int flag;
3 E) P" _: I! g1 f" X) Dstruct monkey* next;
: R- u3 @# ]1 _" I4 t  u}MONKEY;5 M/ g9 W3 `1 j) b! [2 b2 H, o/ f$ o# z' R
main()
8 V& o! X& n9 L' G. y1 J% z{ MONKEY *head=NULL,*p,*s;
  ^! M' I% `( d" i  int i,sum=0,count=0;
' C6 ^( F. y# @3 b1 ]: A  clrscr();              //清屏
$ |' n4 I7 a5 o( }5 K7 l  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
/ p  @. @9 T+ Y* q  p->number=1;p->flag=1;
. A8 `$ f, ]& k& t! Z  w; f. s  p->next=head;
9 V/ B8 R& |6 S  a1 d  head=p;
8 n/ ^$ C1 r1 N4 ], O( i- q( ^5 B4 @  for(i=2;i<=M;i++)  j) Y) `8 e, n8 c, W9 [
    { s=(MONKEY *)malloc(sizeof(MONKEY));% H! X% D: z2 t  g
     s->number=i;s->flag=1;
/ z' l: k0 a* a$ ^1 m- u     s->next=head;) r3 h' l/ Y1 J
     p->next=s;p=p->next;* y: t- z2 X1 V# L
    }
3 U1 j, I9 R3 {2 O7 m8 {    p=head;# t9 H4 c  z  J' ~
   for(;;)8 D$ p4 l+ _) t2 a( R
    {if(p->flag==1)( C2 \& M, }+ Y; T% L
       count++;7 D$ m* R5 M3 @1 g8 e
     if(count==N)8 G* z7 p8 _6 K" s" K4 H
        {p->flag=0;
) T# f% w( Y, }" n% A! p: F         count=0;/ v" a; u: F/ j7 B- q
         sum++;}5 G! v% ]7 f+ z% [0 [  I4 s
     if(sum==M-1)* u/ b+ H* t$ a& b! R  |
        break;5 S4 b0 B. _( k2 d$ r
     p=p->next;, v9 ^+ ]6 _) J
    }
7 @- t6 B/ \7 A2 N0 S    p=& O$ @6 f5 S8 T8 c
    head;& W* ?1 e) I- G; A* K0 Z8 o1 F
    for(i=1;i<=M;i++)' B2 G2 U; {2 Z! X$ M; x5 O
    { if(p->flag==1)
5 C* `2 S6 X$ a4 u" H( h        printf("\t%d",p->number);
) ~' S2 C8 M. x( M      p=p->next;) j, x5 U' B3 j, k& g& Z1 p8 R5 ?* a
    }5 E& b' z* W* ~: Z

" I' O2 p. I; R4 @+ b4 @& [" M) X9 y
) n; [$ N% C4 _3 m. V, ]
}

( J. N4 f- _/ ?第二种方法:数组
: S: v& Z$ q' [5 v! ]! d' c0 m3 w6 R9 y#include<stdio.h>
8 V) @9 M, M. [4 q#define M 88 z0 N) e! s, ^0 @+ V4 ~) r
struct monkey/ Q% {& o1 e" X) W7 E9 g3 z# X
{int number;: v9 r8 w+ r2 }) c. R; V
int nextp;* Z( ?1 e7 f) d; L
}link[M+1];
, Q- V( \  O: {( F1 _" v  a2 p
+ {# D: e& H7 [. \void main()3 ^( h# z8 h$ V, G* G5 X, G
{int i,count,h;
0 k, k, g! C! N4 u- _! w' gfor(i=1;i<=M;i++)
0 V) O, r2 r3 C{  if(i==M)
( o2 Z2 @- D0 c   link[i].nextp=1;1 `0 |. H% [0 H5 M
   else
  {% r& Z$ ^3 |   link[i].nextp=i+1;! N+ Y0 ]8 W$ i1 U
  link[i].number=i;
3 D$ d- O* _. J, p. ~2 J}' C, P8 E0 d. O4 C
printf("\n");; M& T, V, F( X3 |
count=0;
; @3 Z# G' V8 F& g" O3 Oh=M;' @* [0 s  V$ P/ y" O7 }
printf("依次退出的猴子: \n");. ]5 b6 u. T7 T3 E$ I  c4 c! F
while(count<M-1)& I. O& q- w) C: |% L
{i=0;3 E7 C; Z( ~% z- X: s7 e/ p5 W
while(i!=3)  R8 h# T% ?1 o. X- f1 B
{ h=link[h].nextp;
' u, B) h0 a! ]7 r2 U8 L& R   if(link[h].number)
: ^$ {/ [; b4 x) S2 Y     i++;}
6 Y8 c1 O, ~+ @3 ~4 c0 q3 o7 c1 p3 I4 g7 `3 \, E" E1 |
printf("%4d",link[h].number);' H, S$ s- |; b- W7 [1 p
link[h].number=0;+ b9 m7 ?& y8 p( _: z. M
count++;
  \; K+ V9 o$ c" o9 p+ X1 K. o}
/ U7 c' o6 ]' [) Y( V! M8 A" w/ \2 i3 ?: r) H( N0 A9 V. M
printf("\n大王是:");
6 y% D( V$ u8 W; }) K& K  for(i=1;i<=M;i++)
4 E6 g# I- @  e0 ^7 ^1 s2 ?3 ]  if(link[i].number)  z' `7 s2 x* |2 w9 E" Z* M
    printf("%3d\n",link[i].number);
7 _- Y) l( Z/ A8 V! r$ i
5 ^1 [+ M7 S2 A2 m7 P4 Q+ i  E# H0 L0 w
}
* y5 \6 n  P& t" K6 s0 A% P" E8 L
第三种是普通方法for循环

, c! ?1 {; x) v/ {3 K#include<stdio.h>5 L& e" w+ T0 L( ~3 l
void main()
' i* q7 |4 R3 t) X6 M7 r{ int i,k,m,n,num[50],q,*p;& _8 V( s# h' ?* ^: f5 U
    clrscr();8 X, F* Y: u" m( |
   printf("input number of person: n=");. Y  Q4 s( j+ v( q5 R5 o- m
    scanf("%d",&n);  b, h; ^: z9 C8 e0 [' e4 A4 s# a6 Q
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
; f$ \) n' k# [$ n( Y7 [    scanf("%d",&q);
$ C3 B0 ?7 p# N$ J* ]   p=num;
, h2 r( S2 M- T, B# u1 J; n0 T6 ]+ I  for(i=0;i<n;i++)) H3 U* E6 J- k0 X# @7 Z. ^
    *(p+i)=i+1;. D. p/ ^4 F/ b6 N( T
   i=0;
# }/ |5 ~! s$ f( c' D8 ^1 D, q7 g, H   k=0;
1 P* K+ |0 d0 B: K$ ~   m=0;" ^, O$ \# i8 a6 G) Z
  while(m<n-1)( B9 B/ w" b# d- Y. E4 k
   {if(*(p+i)!=0) k++;
! n* p0 |5 P/ Q     if(k==q)9 \0 K4 {! d3 \: r+ u3 I& ?( }
      { *(p+i)=0;9 x0 O- e. P/ Q& H; `. z0 u
        k=0;
, ]* N  X- S  y: _% G& g$ t        m++;1 Y: c! p# r7 K, W' Y
      }
' N. }# B! G  v( v    i++;+ Q( P2 Q3 O+ T7 I; b  j# T- A3 R
    if(i==n)i=0;
  b+ c5 I+ ?( i4 J. J/ w   }
( c& ]  t) F( `' m) ~  while(*p==0)p++;
4 Y8 Q- z" O. O% q4 i    printf("The last one is NO:%d\n",*p);0 F& |9 m! O4 A6 N
     getch();, M, ^$ T9 N) H) t$ v* N
7 ?9 X9 \5 z& c+ v1 B+ n
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
# l4 L) r9 m! w1 t& Y; ]! F4 [namespace 又费马达又费电6 |. V, R4 z; L/ o/ w
{0 f$ O! T' g# b
    class Program" K5 N2 F6 C2 R; g9 L
    {5 G; |  W3 w+ [' `( f5 T
        static void Main(string[] args)
+ V0 \$ y+ W% r# l        {
/ a) n4 h" B! d% F( Z            int m, n;( m2 C+ V; A5 `
            Console.WriteLine("请输入数组长度");! [) [* O8 f. n5 \% r  B
            m = int.Parse(Console.ReadLine());//m为数组的大小3 X/ j3 Q- A+ ^
            Console.WriteLine("请输入要截取数字的大小");2 X( ?) p/ T4 {+ X8 D( k0 r4 M
            n = int.Parse(Console.ReadLine());6 F  @- r' T9 e
            int [] numw=new int/ V$ ]. t7 J" u" w" t

; m; g  W4 K4 U0 x% Y&shy;&shy;&shy;;
( h% j9 j2 ~4 ^8 [/ Q5 C            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数4 r* k; ~) `" n5 `9 y# O# o7 n# G
            {
- V" S9 I  V8 K6 S) U1 w5 X                numw[j - 1] = j;' }; J8 v3 U0 U
            }
1 k9 Q8 P& O) V            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!. y, u+ S% U# ^* W/ I
            while (d != m - 1)* b" r1 s% A2 A+ P
            {3 {9 @) o7 P4 a+ J
                if (i == m && d != m - 1)
) |8 H. C7 I$ ~9 [. g8 a                {
; H- O, L, c9 \. D! Y' r* x                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
% s/ ~6 |5 M; y+ [. y$ `7 z! |$ j                    continue;4 Z) ~4 R: s# r" B) u0 Z  K* Q
                }& b' @- S, F, F5 m7 P5 T
                else
6 L! ]& q* ^5 d                {) F4 E, F8 w7 f* ]) L# v3 y
                    if (numw[i] != 0)
$ `6 g( u$ v& q, N, z5 I                    {
8 l! R$ Q4 `( F6 y                        i++;! Z- C) s( w& {- ]- n; |
                        k++;  n1 I$ A$ K* V# c% ^' ~" E
                        if (k == n)3 x3 d% M  s4 n; Q, H4 d
                        {
. g( ?* r; Q) h0 j2 t1 z                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
5 ^% w" J3 `  u* D4 B- _                            k = 0;: w, O$ l$ L, w7 z, p
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小16 {0 V! ~$ H0 F2 X
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);: j% x; y6 T2 T0 A
                        }5 J1 _; f2 p( w+ C
                        else//输出暂时还没有改变数组元素的值
- w6 |4 q* w' F                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);! X# Q3 Z' D1 f# P7 F) u/ d3 z
                    }
- Q1 C( T- D. r' k/ Q; J8 }                    else
( \1 k; U" C: D% ]- g                        i++;//数组元素为0,直接跳过,不计数。。。# ?/ r  }& n9 t
                }. v: z1 p0 A1 ^6 A; n5 {

% |1 I! p- G9 W3 r& [1 _' F$ [
' p5 `2 |3 G9 Z3 w7 U0 r; i# e            }//结束while循环& [" u7 c- V% f
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦) Z) h6 r1 J1 C# d
           $ n: F! i4 @0 ^2 ]+ C
                if (numw[i] != 0)' x! a  d3 m8 V8 @& t3 X6 H! v
                    Console.WriteLine(numw[i]);
- O( ]- e0 l" C3 E9 `& e           # E9 Y  o' W/ j5 g+ ?2 c
            Console.ReadLine();0 |7 @. l9 l2 A/ `+ S
        }' P* D0 K; f. u
    }; o/ S' v" o5 W5 [2 f; O0 O
}! c$ y0 q5 ?2 ~* r
小甲鱼最新课程 -> 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-2-24 16:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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