鱼C论坛

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

猴子问题

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

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

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

x
大家好!
8 @# x% J* I. Q- _% \, d$ A" \这几天我在忙着编一个问题,我用了一种方法编出来!. y! p! z8 p$ ]- c) ?4 e2 ^( f0 I
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
' n; o  i: F8 D0 q/ S, e注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
( S4 L6 n' Y* e; J: t8 @4 Y5 I3 o0 W% u! e3 d6 A* `% O

/ C  I' F) X- ^1 Z# u$ v/ r
                            题目
$ M" O# h8 E$ I! R$ M山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。' f0 d  W. `  [2 c5 d) h
第一种方法:利用循环链表, t/ Y% x" Z+ f; c
#include<stdio.h>, ]; i% d4 p$ j% G& o; q
#include<malloc.h>: p& i$ [" ?: f0 u
#define M 8            //共有8只猴子7 g. L7 N. p+ j# |' u
#define N 3            //数到3只时退出第三只" m- k; q, ^% Z
typedef struct monkey- }+ f( t1 y2 n7 t; e+ x3 L
{int number;# a3 R  M% U9 t& t1 [/ y$ I
int flag;% o5 R* J6 ~4 V
struct monkey* next;
" }  x' C& P3 k& V$ x: a}MONKEY;
% n) C% Y4 M5 kmain()& Y4 p, g! ~, e0 M
{ MONKEY *head=NULL,*p,*s;( J! [/ N5 ^7 k  B' P+ a- d: Y( V
  int i,sum=0,count=0;, R+ L5 X8 n2 ]2 l. o
  clrscr();              //清屏
$ q- s. E1 I4 G6 k; `  k  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存, E6 E% v/ e3 r
  p->number=1;p->flag=1;
* u1 M% Y- c! e' \, r( z  p->next=head;, j& s. M7 Q( M9 J
  head=p;
0 [' ~9 a6 Q5 W6 X9 E  for(i=2;i<=M;i++)* u' U. e8 t! u/ a/ l$ }
    { s=(MONKEY *)malloc(sizeof(MONKEY));) t  ~7 D# m" c# a, }: l
     s->number=i;s->flag=1;7 C3 {" a* m" i
     s->next=head;: W5 J) ~: h* d
     p->next=s;p=p->next;
" m4 \. v- R" i    }
: P$ X; \4 }$ N7 E& A    p=head;
) g2 L. W) r/ h6 ^   for(;;)
4 ?$ X1 u8 _3 S) _  N6 x    {if(p->flag==1)" i" `- W3 v. x: R  g% S
       count++;9 T& w7 A( J, {5 B) s- o
     if(count==N)% m4 N2 q9 E6 k  M9 B- c2 A: T" I& m
        {p->flag=0;( D' H4 N! Y- i( ^8 C6 h% C6 ^
         count=0;& Q7 Q( |  A/ T# X3 m8 X$ R+ }7 l
         sum++;}7 @* z- I! L# [3 L
     if(sum==M-1)9 M( D5 n5 r4 o5 j$ P: Z3 g
        break;
1 @% R5 w! l. Z5 A4 j% d     p=p->next;
( }: R6 T% [0 F+ E# p3 @7 Z    }
+ ^* r. f5 Z9 @5 c  x    p=
  m. Y' Y$ @) d& m7 Y. t) }& \- R& E    head;
; ~# v+ F) _) @) {# X6 X! E7 X4 O    for(i=1;i<=M;i++)" A* F1 ^) O, u7 l7 r5 T
    { if(p->flag==1)5 M  Z. T, N# E( t9 i6 o# p
        printf("\t%d",p->number);
+ A( l2 r( G- c* d4 ]  A% }. }; V      p=p->next;
1 }3 G! R7 [+ w    }0 T9 T  l( T: [; |: g7 E

6 P# S6 H0 m' P$ F& ?8 G) F
* [# z( O  @  |
- x. R6 g, g3 T4 }}
* J$ U0 `; j0 G  @! H' w& C
第二种方法:数组; [+ }, q% W# C! Z# s
#include<stdio.h>5 v0 ~1 w3 V- J/ w. l- F
#define M 8. R' h3 T/ N* M6 V6 H
struct monkey$ _! H5 K/ C/ M6 j
{int number;
3 f) L9 O- r' Z3 p8 P1 J7 pint nextp;7 a1 V" l/ `9 h8 d$ O" `, `  |4 n6 C
}link[M+1];
7 S1 T3 t# V" O( T* _2 t9 G7 w8 G
void main()
0 K; x" }; N3 ~: |{int i,count,h;
1 G* ^1 h! G* ifor(i=1;i<=M;i++)7 P0 `. z& W8 Z% b
{  if(i==M)( P9 ~/ J3 t3 o& X
   link[i].nextp=1;1 J- G% A0 ~% z! B4 t
   else# d( X' Z4 G2 j
   link[i].nextp=i+1;8 P8 p; a4 H8 n- w/ m) [2 d2 K7 V
  link[i].number=i;2 a# h, z6 b' K
}4 |# ~! o' S$ B* R: P
printf("\n");% L( u1 _" p3 \/ G& Q
count=0;
' N. X- }3 o6 W+ ~7 i4 L8 R7 Ah=M;
* g& b  c0 p% _; p: g: i2 w. dprintf("依次退出的猴子: \n");
2 W8 _# D0 i& Z0 K8 F9 l; d, O0 T; nwhile(count<M-1)" B$ \( p! t5 ?; u2 g$ }, `" }
{i=0;
6 f5 H) |% W- G) Mwhile(i!=3)3 ?8 L! Q/ Z) D. \
{ h=link[h].nextp;
4 r% I7 U! `* C% j5 b7 c. \5 I/ ~   if(link[h].number)
1 X: _& }8 b# H" z1 v- M0 Q1 ?     i++;}
7 h. |& I+ m7 K4 w/ p. o7 \5 {  {1 d* h9 A( i6 i7 c
printf("%4d",link[h].number);
/ c$ y6 h$ Z$ Q  Rlink[h].number=0;0 `& F* \0 i2 l$ h* D" K
count++;7 G3 F! S. u3 n; f2 W( i& u
}
2 z1 V  F* U$ G# Q: q! ]  S& `+ h/ ]
printf("\n大王是:");( T& `& n; z7 y) j! y6 Y, R
  for(i=1;i<=M;i++)( d3 B* X% o8 ~
  if(link[i].number)- p+ D; D$ W% x
    printf("%3d\n",link[i].number);
  _! ]# Q/ i" T0 W) p( w- Y6 l6 z1 T1 M* N" t
, b; q( L$ `. Q
}

% o- \* x- U( t$ J! m2 C第三种是普通方法for循环

3 z: \8 J9 d: e: o- m9 L#include<stdio.h>
' l/ v/ ^: L' X: [. z5 pvoid main()
3 p) M& q0 o( [# {+ G7 X{ int i,k,m,n,num[50],q,*p;
7 g/ T/ b* T! ?    clrscr();0 S! O% I9 c% O+ g; m- K8 x7 a
   printf("input number of person: n=");
5 X# _) G' B) b1 V0 A    scanf("%d",&n);" L$ l" I# K+ t0 B* x2 z9 z, y+ ^
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
  w' T) l. o. b4 @& F' ~    scanf("%d",&q);
& q8 H( Y) a6 {7 D3 v   p=num;
. f* e0 E& g5 c2 E7 k1 p. J  for(i=0;i<n;i++)
* }3 r$ E/ H) D, q2 Z    *(p+i)=i+1;  T) n* l, Z4 c* y* a& o; Q
   i=0;
" `/ a2 f1 r* P2 _1 B- g( l6 X3 ]7 q7 Y   k=0;
8 J& v8 s: t! d8 U" ?9 w8 ~   m=0;
  s5 r; C. |7 r2 S, ?3 i) `) e4 G  while(m<n-1)
& ]8 H/ p2 Z, G* |   {if(*(p+i)!=0) k++;
' `+ [$ s' _( z7 X& R8 W     if(k==q)
- U5 G+ \; D3 K9 E' {      { *(p+i)=0;
0 G% R- c  c' q) E( F        k=0;0 g9 k  |- n0 [8 j  V  a
        m++;; b6 s: x/ D: Y) x0 O4 T
      }+ S4 ]3 t! _# |
    i++;3 n0 T4 j6 J/ _8 y! q; D, C
    if(i==n)i=0;
# n7 X/ o$ {) e   }$ x7 R2 n4 s, o/ l
  while(*p==0)p++;! t; H7 u  D# ]9 v* X
    printf("The last one is NO:%d\n",*p);/ n. k4 `8 J- e! b, A5 Y6 n' E# l
     getch();
8 J( F7 o2 ^& c7 H4 z8 U7 s
4 G7 h3 P$ |- m& [2 J}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
" X& r6 [* ^% ~+ Mnamespace 又费马达又费电* n- ?9 s& U; z' e
{
5 K' i- R. Z3 f/ \1 O; K% m    class Program6 E; l6 ?* D* N/ O# w+ d
    {( O6 C3 h/ H/ @6 v: `
        static void Main(string[] args)+ V4 e: l2 j, B
        {4 r5 K0 \) h4 E! Y
            int m, n;/ f$ y! j; N8 v! M  Q# b( L
            Console.WriteLine("请输入数组长度");8 T4 E6 S* N  |& `0 O$ P
            m = int.Parse(Console.ReadLine());//m为数组的大小8 K* _! K$ s8 P0 Z7 c$ g
            Console.WriteLine("请输入要截取数字的大小");$ ^( ~/ @3 w' {0 S' m) J
            n = int.Parse(Console.ReadLine());0 B& C7 `, @& Q2 W2 ?" q
            int [] numw=new int
3 c; v1 z7 d' ]8 [) ^: }8 H- i
/ _1 e. V; Z% ]1 g& J. T  i9 J: i: M&shy;&shy;&shy;;
7 B- r& o# v' g) r            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
" N% k4 V& [, q9 Y! Y0 a            {
. [, H5 Y6 q0 D5 j7 ~                numw[j - 1] = j;
" {# [$ ^8 I' w/ p; \            }3 `4 M: H; P& `5 @$ i$ O8 _) Q
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
8 F# T% c# E2 n7 h            while (d != m - 1)/ G1 z7 Y, d, l( A, e+ ^
            {+ i7 d) Z- M( t. [/ B; @
                if (i == m && d != m - 1)
& C) f' u  `* Z) S8 {+ D                {# T: M  L" p- p/ B
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
9 v8 i8 C6 A7 T+ @3 P                    continue;' r7 {7 Q$ y0 W- I- [2 p" K
                }: O! ?& Y+ H: ]; J( e
                else5 h: W% K' i4 z2 s
                {9 g# v3 h$ ^% |' A
                    if (numw[i] != 0)
$ t7 z) _- R& `: _$ r                    {; p- W1 Y$ ?, S+ _/ z4 R
                        i++;: t" q' {. k% u9 w
                        k++;2 u1 j' o; v' d, L7 k$ h+ N
                        if (k == n)
( l% S9 y! ]  `4 B                        {* v9 U/ X+ Y' m* O( `4 M' L1 P, a4 l
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了, G' K0 \" n8 p) C
                            k = 0;
/ X( \% U+ h  D6 V% y              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
1 s7 n1 O$ d1 Z- ?' D                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);! d4 e; F9 w" M( n! e7 ^  X
                        }
; I' ]' f' B1 p( {& h4 q4 [1 a8 k2 L                        else//输出暂时还没有改变数组元素的值/ w. P9 s3 c/ a% v& _) i
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
1 d5 f; p. E& Z* a. }6 ?                    }" ~' W  t; Y2 _+ o6 o$ D- ^
                    else
* E, p4 q: Q9 {4 r# x                        i++;//数组元素为0,直接跳过,不计数。。。
$ Z" `: `# S1 v1 n9 J                }
# q0 Z8 T! y5 ?% G 2 y  k: }8 m- F+ N3 D9 e2 l  B% v% N

) W! R& i- Z6 n: Q. S, `            }//结束while循环
4 t" n0 \0 H; z( J4 G  v            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
! e$ E# c! W' P4 f           
) g1 t( k, w; z2 g5 w% p                if (numw[i] != 0)
$ R9 {7 {  d* _+ t4 q) [$ V2 K                    Console.WriteLine(numw[i]);9 r* E2 K9 D6 D: O
           
, n* h" I  i4 f, x9 c3 X            Console.ReadLine();
/ T+ T1 B; `' u0 U7 k  l7 |        }8 @1 ]2 N; a4 C
    }" a" V) Z# j0 Z$ t
}
5 U, m- T( B  o+ Z. a" V% T" [) [
小甲鱼最新课程 -> 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-3-25 13:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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