鱼C论坛

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

猴子问题

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

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

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

x
大家好!; W, f+ E& @, v" u  F5 p5 w
这几天我在忙着编一个问题,我用了一种方法编出来!
! P* L; w- ]2 p6 x但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
" \% M. k( O1 G4 t0 ]注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 - D$ ?  Y. g' N  h% P$ c  T
( E5 \9 I9 g2 w7 W& Y6 m

$ e# E0 A& h: _- _. B8 I
                            题目
7 V$ F: j; P( U% x6 m5 J3 F& u& b山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
9 H# s. {- f* X+ n第一种方法:利用循环链表! j8 y7 W0 E8 x# ]2 Q
#include<stdio.h>+ M6 N9 n$ @3 Q1 w
#include<malloc.h>- |! b/ \( s6 b' q/ f
#define M 8            //共有8只猴子0 Y5 g' Q, Y' a; V: }
#define N 3            //数到3只时退出第三只: ?# l- f( q3 n. C7 [+ }# n
typedef struct monkey8 F5 A) v1 G+ V1 g
{int number;# I- N( p" i5 v8 y
int flag;6 Q! Y1 Z' j8 b- A# m/ i" {+ p
struct monkey* next;
. N: a2 g" v" C$ f" F* ^}MONKEY;0 Z7 H, g2 \/ U& h1 W
main()# B0 c+ r. w( g2 ]1 `" E3 q% _2 u
{ MONKEY *head=NULL,*p,*s;" ^/ k3 M9 v8 c0 M7 b
  int i,sum=0,count=0;, c$ g; U& {: ^" ]& O9 d* t0 A0 p
  clrscr();              //清屏
% C* Z9 ^- c. D# O  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
0 |5 N- H2 V% a" w% J0 o  p->number=1;p->flag=1;
* a! \% `! k9 f+ u. V0 D  p->next=head;
8 f0 u( L- V  l( r/ `  head=p;  f( d' p: G, P4 A* M
  for(i=2;i<=M;i++)
2 ~# [# k( U5 d' J* y% K' i. w  p' h! d    { s=(MONKEY *)malloc(sizeof(MONKEY));
4 y. G* T+ ~3 J# _     s->number=i;s->flag=1;& D- N2 Z. e$ w9 M
     s->next=head;
/ k( V/ K# }2 U5 Q- y0 S     p->next=s;p=p->next;/ I8 R& U0 I- g7 G: |$ W1 O6 t
    }6 i4 v3 ^4 j" _- A) y, z, N- \: b
    p=head;% Z% o  o4 w' J' n  a4 k
   for(;;)1 m- B: N7 T& t( n  j4 a5 U
    {if(p->flag==1)8 }! V1 z$ Y1 W! F0 k3 O# _" J
       count++;5 I. f: I* i7 D
     if(count==N)
4 _' o8 d6 D% X% x' Y5 J- N3 j        {p->flag=0;
6 `6 q6 n; D' v+ X' x' n) v         count=0;
3 W0 O) C% e5 y5 A+ J2 X% E         sum++;}. C- E0 u& E6 L, d. d
     if(sum==M-1)& n8 O) {- H; Y/ L& q2 ^$ e( x& N
        break;
$ Q' N( l  h1 X3 Y     p=p->next;( R, w( _& s  K" j( K9 S4 Y
    }
! \' m  a' z2 P8 N! |    p=/ H, |  s8 v* O1 f/ @
    head;- k% y; t. ]* t1 T
    for(i=1;i<=M;i++)
+ d7 g2 [2 b, V) g. F) D    { if(p->flag==1)4 @( t% ], a! p; o
        printf("\t%d",p->number);1 M4 }; q7 }( N8 O9 D2 V" N7 f
      p=p->next;
( Y$ u# F6 p( l* j' N    }
2 U; N5 g# p6 c- I$ `
9 p9 m, T$ ~/ o2 A, n
* X* ?) ?4 `5 F' C1 x* I/ \1 u8 y# p" c: U+ s1 I. L8 e( Q3 @
}

* g4 d+ p' }% A# j6 M第二种方法:数组9 v' b% o/ @) Y; u
#include<stdio.h>% ?) O6 |% _: _3 M' A9 D
#define M 8/ c: Y9 Q, \! @4 r
struct monkey7 z) Q8 n* J  l- H0 ~9 O# J! r' q
{int number;
6 z, D2 t2 M3 I( ?& N7 P5 cint nextp;
' j3 A0 p, f3 R8 i) C% s8 u}link[M+1];$ A# h8 p5 T3 g2 l8 g, ]

) t6 \0 l( h6 |, e: e6 C; cvoid main()
$ W- d9 v* K6 C& I) o$ r{int i,count,h;) r/ _: F  Z& g; P# y" f. w
for(i=1;i<=M;i++)* n" Z  `4 o6 X) D
{  if(i==M)
, j8 m, ^# T. I5 m0 H" K" q   link[i].nextp=1;
5 `0 G# s6 x' l4 v$ Z   else
$ M7 S# ?! H! g. Z, I+ j+ \   link[i].nextp=i+1;
8 f2 ?$ O2 g  f  N8 c  link[i].number=i;
3 i1 b: U0 ^5 W- K* L9 x}9 |9 ?( u( D; ]9 J8 f3 l- s
printf("\n");
1 Q5 e9 l" K: c# [count=0;1 a! _( {# b' T9 z* f8 ?- {
h=M;8 q9 W" {& }" U& I
printf("依次退出的猴子: \n");  r. R- ?% {  [, q# t' A8 o
while(count<M-1)
  f" N+ w! \  L* M{i=0;
* ^9 g# G& W# owhile(i!=3)
$ a# t- Q5 [$ l6 J{ h=link[h].nextp;
+ e7 s" p6 H8 i" m" E" x   if(link[h].number)% g* |$ C& c" ?# j
     i++;}" i* R. i* Y3 |' A
' h0 m+ O" V& D' h4 C: _5 m) q! d
printf("%4d",link[h].number);
$ z4 M  i5 h  k; v& y1 y: Ylink[h].number=0;
6 |( G5 V3 q. f1 [6 F( U5 lcount++;
+ Z) C3 k8 D4 J5 ~4 ^: F}
2 x+ d8 C/ i6 l! F  F
) H6 b) p8 T% sprintf("\n大王是:");
5 K  K. b. w. ]: X/ k6 Y  for(i=1;i<=M;i++)
: y2 N- u, Z( o( C, U" v  if(link[i].number)+ F+ T' N7 b4 J4 b/ Z
    printf("%3d\n",link[i].number);0 i# D9 ~6 N; o5 j/ o5 |

% K9 s$ Y& N4 x, Z0 I% T. I' G! T, S/ ?  Y9 z+ c9 q; v
}
+ u5 L! Y- k6 C1 ~! a
第三种是普通方法for循环
7 \: L* ^! J5 B1 z4 {
#include<stdio.h>
' j9 \; u* C4 z: Q  ?void main()
+ J! Y) R, z2 r) y! ~. W{ int i,k,m,n,num[50],q,*p;6 p1 c) R" k+ |5 h9 V
    clrscr();3 M! Q% ^5 v. Z& c+ P; ]$ T# Y
   printf("input number of person: n=");9 A+ w) Z% U& T- C
    scanf("%d",&n);
( W1 I/ W& m) ^0 K; _. g7 Qprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
0 s: C* R, }- r% Z! H9 _! `6 t    scanf("%d",&q);
& e9 R( f; `" u9 d' W/ o3 |* X   p=num;
" U7 z; @! V' ?# Z" y, n6 r  for(i=0;i<n;i++)
% I& e! a- k2 h1 y( d: n: Q/ N% R    *(p+i)=i+1;
  `6 j) u$ o! Q- f   i=0;* Z# Q! U- {3 N0 y( n7 W) r' W0 w
   k=0;) Y! k9 n7 x' R# p
   m=0;
- u% r0 b, H, r3 O0 X0 @  while(m<n-1)
( d9 H, c' G+ B* B- e   {if(*(p+i)!=0) k++;6 B/ R( Y; x" T
     if(k==q)4 R" j0 n+ u, m( C. t$ [4 f! K
      { *(p+i)=0;; ~) d/ Z7 d+ R; M2 m0 T6 h" s
        k=0;9 _- t* C6 P, |& Z
        m++;0 W% c( d' ]4 M9 |' `
      }, ~- W- k$ E& L. B
    i++;
* L# K$ W6 N! g! J6 I    if(i==n)i=0;3 r3 _* t5 g4 S1 J7 V7 B) f
   }
$ o( }! Z9 |* ]% i/ ^; \1 {  while(*p==0)p++;
+ R+ C- ]6 w# q( o$ a3 J    printf("The last one is NO:%d\n",*p);* ]) j4 o8 u" |- Z0 m2 ~1 [4 r
     getch();7 _! _) z( w  |7 c. ?0 H

1 C" e& n+ G4 R8 M0 {* L}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
+ S3 o5 k: R# Onamespace 又费马达又费电! P2 S3 ?( n6 T* P: d' P% N
{
( v) E9 @& C+ a# g* P    class Program  V, i% R  B, ^8 i% F& B/ l* S
    {
9 _+ L* O$ R3 |6 Y. X        static void Main(string[] args)% B0 Z. b  P: P7 a7 w- x8 S
        {: q/ w" H! F$ y  r9 v' \) E
            int m, n;- y0 B# x) w+ s5 I) i' _* |7 T
            Console.WriteLine("请输入数组长度");) x! U, x1 L: U7 X4 M
            m = int.Parse(Console.ReadLine());//m为数组的大小
5 f/ I& r8 `6 K3 n) w, _) Q            Console.WriteLine("请输入要截取数字的大小");
1 ?+ e2 a& }  @" q% N            n = int.Parse(Console.ReadLine());) K; ~# z# \8 P; f
            int [] numw=new int
+ }' r2 t4 G! c7 `4 ?# \( p2 B
( k" B3 D2 f" D2 i2 z) P3 [. Z&shy;&shy;&shy;;0 l, G1 R: u# c% q) G3 ?) l
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数  o* l8 i, B& z5 s( M
            {/ E7 M9 e/ [) r& W- h
                numw[j - 1] = j;8 X/ W. k# l* G$ ?
            }
9 c8 @/ Z. B3 q' ~0 B; `) t7 e            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
( s- U$ ~" F9 v. m7 W            while (d != m - 1)  [9 r. \% _+ q. ^+ g
            {0 t8 ?1 E) L! F& _& l0 L, D" z5 ]# ]
                if (i == m && d != m - 1)& S# m  h. M+ T" p- @2 h5 }' \
                {3 I: q, \7 [! X1 H8 t8 v
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
6 j' D8 D7 q* |4 g# \, F: f  D                    continue;* b! T% }( j7 Y3 f. o2 f
                }
7 G' n, k8 @$ M* ~$ F( o8 K                else% A& H& j; @5 e! f
                {( c4 z; N  H( o% b* [
                    if (numw[i] != 0)
# ]' H' K6 E. R                    {
, l' G9 c- @$ m( s: z" |4 V                        i++;1 g% h3 \% e6 x$ `" a
                        k++;
1 n6 l% a4 C- Q' K                        if (k == n)
+ F" o6 o" f8 q* ^! S3 V                        {- `7 E7 t0 j, K
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了2 O8 N4 s! i9 }/ }
                            k = 0;
9 E! ^: Z% d2 B( R              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
  d* V4 v3 v8 N                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);9 E0 L3 h- f) Y+ c
                        }' x2 O2 G, W+ M% P$ p7 i: u" O
                        else//输出暂时还没有改变数组元素的值5 y, Y" ?# z& H* p2 v$ k1 Q" v
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);  e* I$ k, w9 O) ], `  l
                    }
" ~0 P! |: t1 U( l* U                    else
. Z% N7 b; l' S! R1 k& K; g                        i++;//数组元素为0,直接跳过,不计数。。。
/ E# x, y- j& _; l1 n8 F                }* G# {/ @* N, j7 @

6 C/ |6 Y, d4 _  E7 s" j6 q) e- i4 N5 [4 i5 N2 u/ O6 H6 j
            }//结束while循环. n- q! i0 P- W
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
% B( {" U" N& y4 _           
6 M) [. y( ~" c. e! ?. z- U3 R                if (numw[i] != 0)- [. `8 c0 N- h; X* m% Q
                    Console.WriteLine(numw[i]);' L/ Y$ K' Z5 q7 R& F& U
           7 ~; q0 K2 f" N
            Console.ReadLine();
- D  v, q/ G( P% P9 j3 p2 S        }: e% _- h: a6 }( M/ Y& ~8 A
    }; ~1 V2 N* W# ]
}3 y7 H! m+ L* D2 E! P" L$ I. |
小甲鱼最新课程 -> 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-11 19:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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