鱼C论坛

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

猴子问题

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

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

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

x
大家好!# J2 |0 o8 c" F9 `6 m
这几天我在忙着编一个问题,我用了一种方法编出来!
3 A1 w+ b* I$ _9 O但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
. s, b" |4 w% `' _' x( i# v5 n注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
, B7 x' e1 @4 i( z  c
9 p) w; h  P& {  ]' ]) l7 E. C6 B6 C, Q0 ]6 @2 O
                            题目
* X/ L; ~; ~- \山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。9 n' e; }( \7 \8 n  j# c' ?# G
第一种方法:利用循环链表' w4 g- O! V) Y& m/ |
#include<stdio.h>
0 Z% i. O% [; y7 N) y# B#include<malloc.h>4 w& K( {6 R7 @6 q2 e, Z! ?1 C$ f/ i
#define M 8            //共有8只猴子7 q& ~% D( r. z" W
#define N 3            //数到3只时退出第三只1 ?' Z1 l' B' m1 M% D9 M% @6 I
typedef struct monkey- y+ M- o- p2 F. N" M
{int number;" G9 h8 `1 b$ r& c5 l
int flag;
5 D; M5 j  k4 b6 d$ z/ e9 Nstruct monkey* next;
( T8 M* x2 M' i* U% q& P1 g2 n/ J}MONKEY;8 n5 }( A2 @+ q) S: @2 a, P, A
main()
; Y  ]& P! w9 O# H" E' n' i{ MONKEY *head=NULL,*p,*s;
0 u1 s1 C  g2 P  int i,sum=0,count=0;
) B, D/ b1 c$ }+ m8 k  clrscr();              //清屏% ~6 Y$ `) G; ~- ?4 Y. Q! a4 [
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存' b- U) K' O) o2 U6 [$ h
  p->number=1;p->flag=1;
  n- }0 f5 C9 x# @' z8 W' v  p->next=head;0 u4 n* D4 c! ^. A1 t1 u
  head=p;
3 Q7 \9 ~8 V1 a  for(i=2;i<=M;i++)6 e& j. ], ?7 v; \5 Z) N2 Q1 ~
    { s=(MONKEY *)malloc(sizeof(MONKEY));" n" `- n: `2 {
     s->number=i;s->flag=1;
" p) m8 j' _& C# x! n) u) I3 E     s->next=head;5 U: B  |' X. D4 _
     p->next=s;p=p->next;
/ j. O3 x/ p. g0 \/ K6 P" I; Q    }
7 Z7 {( ?4 y9 W  H7 d% T' Q/ y    p=head;
. v4 y& L; Z! u1 [( a9 S' x+ r   for(;;)
7 \" q; v  ?5 O. q) n$ Q& t  R    {if(p->flag==1)
5 F. h6 ?2 v" K6 Y       count++;: {4 ^) w9 k5 N7 o! s
     if(count==N): C0 U( D0 `- ~/ v
        {p->flag=0;
8 L) O; {7 c4 U+ T* P  N         count=0;2 G; g3 C6 j5 K% q5 J3 z
         sum++;}) N; L" r6 i- P0 g  W
     if(sum==M-1)
* g* l: E. p( U% r        break;" H7 L5 |5 v. k# F
     p=p->next;
) n) n, N! r0 G. b& m    }
& {1 `, Q) c2 C    p=
/ S, Q* M8 b6 h1 }4 J    head;
4 Z" n! L# V8 t2 C3 |8 \0 c    for(i=1;i<=M;i++)
) D2 o3 R. C& l% u+ e& Z    { if(p->flag==1)
' D7 d) k4 B& o, }* y7 h2 e9 q        printf("\t%d",p->number);$ q; B# h7 b. y) }1 W
      p=p->next;% r  H0 j$ ?4 |' Q% @
    }
& L: A- m5 B! Y7 O/ l( O' W* J6 ]6 J5 P; x  s

' i, p( k2 `4 a/ W
/ x& D9 s' n7 K) P5 ?}
2 I" J) `: ~$ Z( F/ ~6 ~% ]
第二种方法:数组! w, b$ M6 C, |  f
#include<stdio.h>1 Q8 F: A* u! {' p) {  p" w
#define M 8  E5 v* z1 [8 R" r' ^3 Z( ?# [
struct monkey9 ~3 t/ K5 A, s/ U3 h5 E6 M; `
{int number;
' F8 y2 W6 }8 S/ V$ c( _int nextp;2 Z( i$ W9 @/ y: s0 F
}link[M+1];
1 d% B$ Q- \7 m' C5 c9 o% g+ @0 ^. k( Y/ B; c# i3 ]
void main()
2 [/ i9 J- _! k$ d( I{int i,count,h;
' W1 t5 D. h. B! Sfor(i=1;i<=M;i++)
( L6 L# f' d8 w% L) O/ i; o{  if(i==M)$ U; l0 t4 v& n6 S) I" f
   link[i].nextp=1;
) S( j# h( D6 O6 K+ x- p   else
/ f9 G# T+ C4 z  `( M4 w3 D1 U   link[i].nextp=i+1;3 c: q$ I$ Y; \) ^* f! u6 i4 n
  link[i].number=i;* E% M0 ?4 }8 I$ p& P4 y, B3 v
}
8 [6 w; _7 r! r. W/ E; |printf("\n");
" v- o- ]! y( x5 p" ]' K6 n* x' tcount=0;' Z4 _# ?  m% e8 e
h=M;) Q4 D6 s7 o, y7 q+ l
printf("依次退出的猴子: \n");" K6 {% I; E, q7 S: [! p
while(count<M-1)
+ a) @; q9 z- t{i=0;
" x, U8 B, K3 J' ~while(i!=3)2 i; o) L4 w& s' u0 `- p
{ h=link[h].nextp;
3 Y/ V, K+ y) z( Z- x   if(link[h].number)
- o! G  S$ I+ z$ O2 n5 `3 L) |/ Z     i++;}
+ D  q7 [) M! p7 X$ v- @5 J1 n  r0 x2 S, x4 f$ z/ L
printf("%4d",link[h].number);
- x, ^" ~' ]# N( plink[h].number=0;! b3 F+ u% |! `% H" \! [
count++;
( [+ [' c  X5 i" {}
3 R  ~3 `2 \; P# E- |% W0 Z- v; [+ }, Q3 g( x# N# g( }, m
printf("\n大王是:");* O0 r3 L3 L9 z1 V" b
  for(i=1;i<=M;i++)
0 n$ ]! h6 \( S( D9 E! H1 J  if(link[i].number)
" G7 F" N& l3 n/ m    printf("%3d\n",link[i].number);
5 x( j# g% N) o: `7 v+ t* U  }
/ c+ r3 W; |- y% `# ?& y: w3 t6 D* L; Z, e* f1 W) d
}

- h: x. F2 E* l2 ^第三种是普通方法for循环
3 \/ i2 U! H4 G, ]0 M3 T0 r2 U
#include<stdio.h>
* d- Z) f8 {' I* Cvoid main()
# b, z9 r+ x' M7 W3 H- k3 Q{ int i,k,m,n,num[50],q,*p;
( F; w' A  D5 K/ z# Q( i  P/ O    clrscr();
9 A7 {0 x- S3 L. D3 ?   printf("input number of person: n=");2 h1 K0 T: t. z( c$ L
    scanf("%d",&n);
, B- l: H0 A7 u7 B% T) m! Y! j# Oprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只# K% R$ G3 g1 d0 c+ J* _
    scanf("%d",&q);
8 u8 @  W/ K! D2 N7 r! x   p=num;4 g; O$ t: A5 h  }
  for(i=0;i<n;i++)
" M. a) b8 o+ }/ ?5 H% p    *(p+i)=i+1;
. j) q( X9 F  _) W" ?   i=0;1 f$ }& F7 u2 \. z; H% q3 M
   k=0;
5 R: e9 P) W2 D% }' `: d   m=0;
* r3 q$ C- i0 r3 l  while(m<n-1)% _3 r' Y2 z% M1 x# n3 h/ ]
   {if(*(p+i)!=0) k++;
4 i5 y  t/ |* c6 z" v& l2 z     if(k==q)
$ ~1 C. Q0 I' t5 p      { *(p+i)=0;
* H# s0 g) T% l) W- s        k=0;
8 ~4 h& H7 B, }6 j+ c        m++;
0 P/ ?6 ?% \0 T" m$ U: @      }
5 B  j9 {* A4 \7 Z) Y' R    i++;
8 n8 b& i7 M0 ]( R$ g8 i4 T    if(i==n)i=0;
0 s5 R/ h; }0 ]. V   }/ ^0 L8 n  v% ?" |# w% K
  while(*p==0)p++;7 C( Y( q7 `2 b6 k; ?# t
    printf("The last one is NO:%d\n",*p);1 d, `- a9 ]/ u* H0 e% ^
     getch();
5 O* B; }* ~& n$ u, n/ \
( q* Z+ }: H3 A/ B4 i# ]0 O}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;  Q5 ?7 D: G! E, m) d1 s. ]$ M. L
namespace 又费马达又费电
0 u  t8 Y( x' N* Q{! K8 M" Y$ l, S0 y0 k/ L- K
    class Program
9 H, r8 b1 Y/ N. u; o+ V9 I( p    {; e! u1 H, L8 [4 y! l
        static void Main(string[] args)
; W0 r( Q& }+ ]+ ?, _        {+ a6 o1 @/ g# |. _& m; e: _
            int m, n;
) X+ Z+ w  a  p6 n6 j  |            Console.WriteLine("请输入数组长度");' r/ @8 q+ [, R8 l+ t* x7 W; A- R; x
            m = int.Parse(Console.ReadLine());//m为数组的大小
% ]* |- g& O1 D/ |5 G            Console.WriteLine("请输入要截取数字的大小");; B, c# U/ f& n! c: D3 {% e
            n = int.Parse(Console.ReadLine());
3 w2 Q% p7 y8 U% L: S" J* R/ N# f            int [] numw=new int1 [3 J  b  y. ?: X
0 I) j- j- R1 Q
&shy;&shy;&shy;;
0 t% U: c1 B; a! m1 Y            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数$ _/ }3 s3 q0 t6 s7 ]0 h
            {' I) A# h9 {$ x/ }3 b' s5 \
                numw[j - 1] = j;4 ]! }. ~4 X! G% w
            }7 V! L% f; }1 X3 ]
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!1 B5 P6 m6 H$ C0 r5 |0 ~9 M$ U
            while (d != m - 1)
+ T9 L1 L" A  y& r9 {! ]& }  V# L            {
/ u1 e8 m; w' l6 V. |  h# d                if (i == m && d != m - 1)
1 {7 B- [) F  p1 Q                {2 N7 n1 m+ N$ M/ k& Y+ n! Z5 X
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!% }  _% e0 x; P- s
                    continue;7 |. a4 V0 [6 I0 E( N; B8 G
                }
3 J& T7 ]4 W* t7 M0 [8 p! J                else0 B7 L' F- {4 H* ]2 r6 [
                {
6 G3 m- A3 n  k+ u! u" R! ~                    if (numw[i] != 0)
' I7 I8 b2 W) m3 K3 M- t2 s1 S                    {1 [! V; i4 B( G! G/ _# O
                        i++;
+ b* a$ g" o/ U0 y/ h/ d/ b$ i* v                        k++;; x! g8 e3 D/ Q; _- C* Y
                        if (k == n), `/ D9 |8 v0 D- j
                        {
$ f% O& `7 m* S+ H+ X                            numw[i - 1] = 0;//把在n位置数组元素的值改变了7 d. j3 q  }; _
                            k = 0;; F" O6 ?/ E, h' Z/ U' K
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
) f* W* @8 s6 W: q6 N8 M5 y/ K+ f                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);+ j5 a' [# ~: u
                        }8 s% I" K! @! w  P: ?" Q7 I" {
                        else//输出暂时还没有改变数组元素的值! j, B3 c4 v( f# _: P
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);- Y, l: o2 H4 I
                    }3 y$ _" k' r* ^  o
                    else: J( E0 q! y1 z0 y' y( P( k' T$ j
                        i++;//数组元素为0,直接跳过,不计数。。。
( @2 X1 H1 A& Y8 X4 f" r6 O: f4 Q& C                }1 G% L$ Y+ ]7 X" @
2 g; ~4 V* H# a; e& q+ u6 s& D0 f

2 [3 n5 L/ i( m4 Q, i. h            }//结束while循环' h" r; z0 `$ i, D; f
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦$ a# f  @3 K4 l* l% F; Z8 r
           0 a- C/ G" ]  u8 \1 J$ M
                if (numw[i] != 0)1 Q1 D4 X8 {! Z4 c
                    Console.WriteLine(numw[i]);
1 P5 @" W9 V) I0 T           8 ~* Z  a, M4 l6 _" w/ W1 K
            Console.ReadLine();
( r7 I' }: O. W) ]% H5 {        }
3 r9 z6 N& N' J1 H, P. p6 c    }+ n; j, M! R# _* H* }* b# ^3 v
}
4 ^1 N; G/ X3 o' r, x7 O0 g: m8 b
小甲鱼最新课程 -> 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-4 21:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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