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

猴子问题

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

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

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

×
大家好!9 |& H! T+ _8 ~$ \: ~+ s0 ~7 A( v9 d
这几天我在忙着编一个问题,我用了一种方法编出来!7 \0 I$ n% J) \/ \# x9 }
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!: w# _" A* F$ y+ J6 m
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
! h: ^$ [, Z3 V5 S4 D; h; r
. `7 X; \$ H  m6 Y& U
9 ]  M2 e  W! P% E4 E
                            题目( m7 Z1 _$ r, _' h5 L$ v
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。; ?" g9 E5 [6 g, y8 J
第一种方法:利用循环链表7 Y" p. u' f" N+ O. F' t
#include<stdio.h>) f$ d/ w2 c7 e! d1 c& T
#include<malloc.h>5 r2 a# o( n8 O! i2 S5 d: s# g# d
#define M 8            //共有8只猴子
. L! h: S, C3 |% l* X. ]- I#define N 3            //数到3只时退出第三只5 y4 F3 G$ d! @+ _- n
typedef struct monkey
- ^( V$ M8 J5 v) l{int number;; c$ w0 ]0 U4 h$ O
int flag;4 g, U4 P1 ]$ A# h$ s# I
struct monkey* next;! P- N0 O4 x2 W  O9 F$ V
}MONKEY;
; ~  T$ i6 n2 \main()5 d) R- k* S5 G* w6 I' h" p+ B0 f
{ MONKEY *head=NULL,*p,*s;) Y$ s2 B$ t3 t* g% @8 @, K& F
  int i,sum=0,count=0;
9 p7 l) J! i! d6 u! ~  clrscr();              //清屏* ^: U. \! Q6 {4 M8 m
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存1 d- N2 h9 Y* u! _. o: E
  p->number=1;p->flag=1;
8 ]$ t9 z. A: p5 l  m  p->next=head;
- X1 m& ]; r0 P1 R6 J0 {  head=p;
3 T4 B& Q2 x, Q  for(i=2;i<=M;i++)& G/ e6 z  U! O. o' R) u
    { s=(MONKEY *)malloc(sizeof(MONKEY));1 r: [: ~: e9 s$ {4 P* L
     s->number=i;s->flag=1;. Z! `) Y2 J# m
     s->next=head;
1 O$ U; m" U8 A9 T/ ?     p->next=s;p=p->next;
. B( [9 L7 u$ p5 k8 e1 J* _    }
: V+ C) O1 K; o3 G0 [* v2 F& {    p=head;; ]$ e$ w% e9 G) ~+ _2 x
   for(;;)
; ^! O( w# n" s3 q6 T1 W  w& s    {if(p->flag==1): a7 c! S" t6 D& m  R: b
       count++;/ S7 |2 S* N; F! P. v2 F
     if(count==N)- w! ?2 C% J4 T6 [$ `( g
        {p->flag=0;
: h2 H6 h+ N- g5 ^! L6 a         count=0;2 z9 o/ L4 y  K' k) T) I
         sum++;}
* h9 h7 }* P- H. |3 c9 @     if(sum==M-1)4 a  j8 N0 m5 M  N7 l5 J
        break;! R* f0 Z2 n( Z6 Y3 L9 o- v
     p=p->next;
3 ~! G3 V. J# g    }' B3 h1 ?) P4 k
    p=
. K0 M9 e+ t% Y- n9 i6 q( x7 A    head;
+ B+ d0 r  M, j' i. B* T1 [. P    for(i=1;i<=M;i++)
2 ?. E, ?  t7 ^    { if(p->flag==1)$ k. @; C  h# @$ c- p: J
        printf("\t%d",p->number);" h2 ^- ]8 Z$ J% I8 @
      p=p->next;
# D8 k7 F" n0 U* Z/ h5 D: `' y    }' P" F* ^, V( b: A" F: ~
) |% N  z/ |3 y0 J5 Z/ {
4 [) D. W9 p. E5 ^" l2 j/ @
" m8 e; \9 c" [' k
}
- t& A4 M& m: V- ?( S1 ?
第二种方法:数组
3 M( {- t& g" h& g0 C" y- }#include<stdio.h>
6 H4 g0 W+ X+ U' T6 u, w( Z( z/ e#define M 8
7 ^+ E, i! x! M5 r7 {$ w  pstruct monkey9 I5 V- p: r# {8 T
{int number;9 @3 R% I0 J4 v5 x/ ^+ s
int nextp;
$ }- F/ _, C' V: y$ T}link[M+1];
1 W& _  N8 V$ I5 q) b
- o7 s/ i4 d6 f% R8 V# L+ |; Q6 Xvoid main()
/ {: T5 `  P9 l% W* i{int i,count,h;
: i- c' {* e- K; s) e4 qfor(i=1;i<=M;i++)
3 L, |1 t2 _, |{  if(i==M), n' r7 s7 S3 c0 q/ _! D+ Z: f
   link.nextp=1;3 C7 t1 L5 o" V$ o) H
   else
  z. g& w) G( \: [) _   link.nextp=i+1;3 J+ \: R* {4 ?. T5 U
  link.number=i;+ @' o# y1 B- g3 K" U
}
3 x1 F1 d7 [4 A1 hprintf("\n");
' p* T3 v. Q: o7 u) e8 w/ R5 S3 ucount=0;
( E4 g+ h% C+ @h=M;2 p7 a/ I. Y( Q5 W% C& w
printf("依次退出的猴子: \n");
4 J" A, S. j  a3 Awhile(count<M-1)6 e" N3 X/ L8 m
{i=0;
" H* i  H' S3 t3 j. k: c. F; v  Jwhile(i!=3)# s; D- M/ d  y2 J( L9 e5 \
{ h=link[h].nextp;
$ L: l) K2 ^# ]% V" ?" B" W   if(link[h].number)
  u2 T3 S4 O* c2 i     i++;}
" O& i* N' r, \+ x: f$ F$ ]2 ~5 W* M! }6 s
printf("%4d",link[h].number);0 Z, N+ l* G8 f, J. c
link[h].number=0;
2 q8 w6 y, A3 l* l+ Icount++;
- f, V- s0 E& R% u* G. z+ k}
% B/ ~' E# ]8 Y8 `: J) z* |$ u. `# F  n6 X" q1 v' y
printf("\n大王是:");
% q) H3 v$ J2 W; I5 L  for(i=1;i<=M;i++)
% \' q; u6 U! O  if(link.number)
" n5 Q2 L( o5 C7 J4 m" h    printf("%3d\n",link.number);: l3 w1 U8 [: \7 `1 o7 U5 Z$ |

8 J+ u/ _& X/ Q! R; c* P
+ V% A- Z# [, S9 M}
5 F" V7 L% N, J# z1 ]3 x  }9 h
第三种是普通方法for循环

9 |; B9 j3 S* a#include<stdio.h>
$ l' b( Q9 g0 A, f0 ?- ^void main()
9 X4 l  l9 x& S" H2 x{ int i,k,m,n,num[50],q,*p;& B9 d. J# i3 c4 w
    clrscr();9 Y% a( Z) x/ H0 B/ ]; u& t
   printf("input number of person: n=");" C8 Q4 n+ h( a/ C3 k
    scanf("%d",&n);- S! G8 }$ i/ [% v3 P- k
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只6 [- ]7 T: e1 s) _2 D  Q) o
    scanf("%d",&q);+ V  x4 M* H/ F% Z; g2 {  {
   p=num;
! j1 \1 p! E/ }  for(i=0;i<n;i++)
, c6 ?& k# |1 H) E( k    *(p+i)=i+1;
, s( L7 L# @; `% F( v( y   i=0;  C5 [: U& \0 `/ z
   k=0;0 T: R- p- C( ~' i
   m=0;! G; ?! h# P! l/ r4 `# i& B
  while(m<n-1)* e3 o* S$ m1 V/ h  D3 w' M
   {if(*(p+i)!=0) k++;0 l; G$ f- k8 l
     if(k==q)" {! S6 {6 {+ ?" h, r9 J
      { *(p+i)=0;
3 V) v( Q: X9 f" g- C/ h        k=0;' t' O( Z8 y- H2 N' ?$ p
        m++;
5 C" _9 l" a! W; e      }8 h7 }% q5 `4 Y. |+ S
    i++;5 p$ h3 B. T# X
    if(i==n)i=0;* q* U0 l) N" ?, [# A% b
   }: g3 Q; Q7 V  x& _
  while(*p==0)p++;
" _- h2 y: r% P" ]    printf("The last one is NO:%d\n",*p);6 J' P, N: T& H" m7 o
     getch();4 l: \% f) r( e8 A& h4 B$ ^

4 Y" D/ ?7 Y) Q3 |* {1 D% o7 X}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
; j- K4 _  v" ?5 v' V5 ]namespace 又费马达又费电2 N* y7 I! h  {' z
{
6 U1 m4 ]5 i% R' W& L2 p% }2 ]1 v    class Program+ V0 c2 c$ q- {/ D
    {' b2 }. |% T: {- t! t5 {% T' r
        static void Main(string[] args)" G1 o# D$ L" f
        {5 G5 U* l" j  \! T+ ?5 J& c
            int m, n;* a; t% a+ x' _4 X, M0 z6 a1 d
            Console.WriteLine("请输入数组长度");
( d+ |$ t) W/ \            m = int.Parse(Console.ReadLine());//m为数组的大小$ R# e+ s: r, ?7 N- O4 Q1 a
            Console.WriteLine("请输入要截取数字的大小");: x1 l( v9 m+ N
            n = int.Parse(Console.ReadLine());6 {* T9 T0 s6 H' e" T& U" f
            int [] numw=new int( l' U6 q0 T% r

% O0 t; k7 `. a. A&shy;&shy;&shy;;6 j2 F! `+ `. m3 S$ J
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数- E3 r# C) ^+ k5 y" T% F- z
            {
4 d/ ]+ i$ M- k( {  P9 l9 b9 a                numw[j - 1] = j;7 i( {0 ?2 D) c; a9 ^. i1 ^
            }
8 u, v  u4 r- J* x3 u" u            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
: x& }' |8 @+ F- L. m4 x            while (d != m - 1)6 k. m6 M  C2 a. z9 \! `
            {* z; N! R9 A! n- Q% S
                if (i == m && d != m - 1)
- u& e+ R  Q3 e                {3 z9 ~7 U5 [; v, M; W- q
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
- y5 ^9 S" {5 Y# P) f                    continue;
$ D, k; j  W8 O                }$ h. u# V. {& j  F5 ^8 [  S
                else
3 B' I8 ~/ d, {2 f# d3 Z5 Z+ A                {
1 ^* m, S5 v. }                    if (numw[i] != 0), t1 z/ c0 i4 D  N
                    {5 i, b) n' f2 o) x9 t& a
                        i++;
, Q! {5 I8 h/ ]$ R& Q" j                        k++;
9 u  Q  B; d% M4 G! @2 [2 c                        if (k == n)' ]2 \; P) B' C/ d) L: O7 K% u
                        {
3 g9 H/ O4 Z& Y# z: z  Q                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
' {) l" }) s1 N                            k = 0;( P1 a$ v6 p' H+ N) X
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
6 i0 ~, j, S. L6 N                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);0 e, K8 N& {7 }' s, F+ X; Z
                        }& [8 {' p2 q7 p' v) {
                        else//输出暂时还没有改变数组元素的值7 h" `- }, n9 {& p
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
6 A/ z/ D5 w0 J5 d; a; k% ]                    }
( n4 k. C" `) A1 m9 F! j5 o3 O                    else4 `% x/ [, V& {7 C4 G
                        i++;//数组元素为0,直接跳过,不计数。。。, D3 `- o/ H, a. I" k: T- a
                }
# ^7 Q5 A5 C# U5 k% ]/ Q4 T  Q
' g5 E' ?( \6 z( ], d, i2 I' I6 \' C8 P) F' v! M
            }//结束while循环* l) E: {) L+ L" \
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦3 P! z3 Y3 J) C7 }# F
           - D% P2 |6 g) c
                if (numw[i] != 0)
# E5 a% w+ e% G" m+ n* R, x                    Console.WriteLine(numw[i]);) m" Z$ `. ]  B6 a* n5 ?
           , e& b; A' ~/ V- ?: E) _( A5 c4 h
            Console.ReadLine();
! W! t0 t( J# ?% s- K3 f/ o0 P        }0 K* i( C6 w2 C) \
    }
: @& T% K, R9 V. _7 [}+ r- h( T) c( i" @: [2 A- N6 R; S- j- J
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 1 踩 0

使用道具 举报

发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

Archiver|手机版|小黑屋|鱼C工作室 ( 粤ICP备18085999号-1 )

GMT+8, 2026-11-6 17:31

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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