鱼C论坛

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

猴子问题

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

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

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

x
大家好!
0 C7 i! h3 y9 j- K这几天我在忙着编一个问题,我用了一种方法编出来!3 k5 G) ]2 M, E. M
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!7 S/ T/ @( _2 p6 n. q& N& u  u
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
9 K- E5 P2 j- p; W
6 E1 ?, [* r$ L' t! r" p  L: z8 h+ H* }, g! w+ \' c
                            题目( C/ O1 u3 r. E. l. N* n; E9 p
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。4 F( \, n) m- w+ c9 E0 I& t' o& Y
第一种方法:利用循环链表
/ o' v& h' j, m#include<stdio.h>
# A& J& `5 `" D#include<malloc.h>
  b" H! D  ?- R' ?  S! @& p* w5 M#define M 8            //共有8只猴子
3 `2 c  g1 C, N$ Y( q7 V4 ~% z: C#define N 3            //数到3只时退出第三只6 K, W! d6 t% d" y& [
typedef struct monkey
1 G3 C+ V& d0 s4 I{int number;  _' N$ [4 \$ s. R- T/ }$ F
int flag;
8 G, P: Q9 K4 D& X6 n. ~& W* dstruct monkey* next;- ?/ s0 R  h. Y8 s. ]+ o9 l
}MONKEY;
4 q- N4 K$ i0 h- k4 Z5 P$ ~6 imain()
4 i/ {' b. M2 t1 o- u, p" J. p{ MONKEY *head=NULL,*p,*s;
! n7 ]8 X8 Q- e" S; A& }3 w  int i,sum=0,count=0;
4 g5 R7 a4 ^7 o  clrscr();              //清屏( W) A) Z8 Q- F
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
" u% f: V* q; l; U% c+ S  p->number=1;p->flag=1;  |# P/ g7 Z: x7 c/ b4 @
  p->next=head;
2 \5 ?3 B3 D& A3 v5 z5 G7 p' @  head=p;( Z/ ?% c6 B3 t, H, q* F% y+ q
  for(i=2;i<=M;i++)
2 f& p9 M4 W# _( u    { s=(MONKEY *)malloc(sizeof(MONKEY));
8 ?. R$ w: S- w" I     s->number=i;s->flag=1;& Z. z7 c3 y- |3 ]) e; L/ [& k8 |, W
     s->next=head;
' C$ l% e. m) M" ~     p->next=s;p=p->next;
: S& s+ l! H5 D: L    }' ~2 r' B7 }( D& J; f6 y8 F; M
    p=head;
8 h& y! [9 Q! g0 I% @   for(;;)0 V4 \6 X9 z, p, e. a6 g, W' y
    {if(p->flag==1)
8 D( d# s5 n# \5 s- k       count++;0 _/ ^( h3 D6 B4 m3 W5 R8 T" K+ ?
     if(count==N)
4 `8 @& p7 J- b4 _* N, B        {p->flag=0;
) s# p1 b& Z! v+ d& n         count=0;
9 B& {0 L7 f- H' d: l$ y4 j         sum++;}. ]: K/ O0 a% L# [, Q
     if(sum==M-1)
) W* ~/ t! i! N* ]: V        break;9 ^% B# m7 Q$ O: S
     p=p->next;9 ~* i' m& Q) W% J+ ~6 N
    }
4 t# U) `+ O( |" j0 H7 ?7 o* y& b    p=
. a# p$ h1 p" b# H0 Z3 v% E( ?    head;& @5 k! a" X$ w& N
    for(i=1;i<=M;i++)
8 W* m, ?/ M" k1 z2 W    { if(p->flag==1): H% b0 h- A% ^( b5 S
        printf("\t%d",p->number);  I8 n: {3 G0 g% o! X5 P
      p=p->next;
4 X8 A, Q, P, u9 X0 k    }
$ v" u5 N# a& S( L  h; S" Y
7 Q5 `$ `& L* K: [3 l( S4 \- j
* y0 D" j1 t2 `: S- @7 o! X1 @% G6 h' i5 v
}

6 p1 N% ?/ g7 n; P3 o0 `/ }第二种方法:数组3 Y% v& c7 R& ^; z
#include<stdio.h>
' v: a- X; }6 p) K+ }+ i! g#define M 8
: l+ P# q1 z3 n# d( ?, H5 C1 gstruct monkey
3 M/ O2 T4 R# ~. Y  P% D+ t{int number;
! y; J' e2 [+ _0 }int nextp;; E" a9 Z+ H% u) n. u* T0 [
}link[M+1];- m4 f. X+ d) d8 A+ c. g' Q
3 r% `: x$ g9 F
void main()
* M$ B' B0 E  P' o{int i,count,h;
/ T# N. M# e4 X+ z! lfor(i=1;i<=M;i++)
0 t) U4 c3 X: g# _6 t6 l{  if(i==M)! m2 E- `9 p5 |$ ?+ z# b
   link[i].nextp=1;
7 m4 U. g  e& I! s5 V9 ^   else; e! W  G/ O# r' {0 K% J3 U. b
   link[i].nextp=i+1;
0 Z6 ~8 r- F$ N) n# s. @  link[i].number=i;
9 Z; }3 Z! M$ c( e- F& ?}
4 {( h8 c% H' h7 i! W- S+ Iprintf("\n");' X! p' {) W& R2 Z
count=0;
$ l" S6 A1 e& e7 F/ Q# V; ~h=M;
/ Z3 Q% ^  c3 m0 Q( ~5 ?/ Lprintf("依次退出的猴子: \n");/ h4 \% V. h6 D* h  [
while(count<M-1)7 r# z" I8 B  V
{i=0;# f7 M; w0 [# A! K' Q- C; r7 g* l
while(i!=3)
: j2 x4 k$ |( p* M; F8 n5 _{ h=link[h].nextp;! a$ k1 Y0 X8 l- ^0 k; X8 }
   if(link[h].number)
6 }" R5 v2 v# K, D' r     i++;}8 O, n% P( f* R1 A2 J1 Q  J6 k, i
) i% ?6 {* W9 Z8 P9 I9 Y- W! C. K
printf("%4d",link[h].number);
% z. Q  Y& T+ j/ D( i8 _3 j$ T9 [* @link[h].number=0;/ B* R2 f9 P) _
count++;/ [& n3 }& J4 L1 a
}2 ~, z9 d4 H8 B6 u3 F. u5 P- Z

6 J' q8 I+ [& Jprintf("\n大王是:");* W4 x- x! h7 H' M
  for(i=1;i<=M;i++)
7 y9 l0 x' y* v  I  if(link[i].number)! O: _) N/ {& r* q" r, x
    printf("%3d\n",link[i].number);
& B9 A( E* Y3 ~  h6 ]9 Y% _# ?0 V8 f' p  d% I: h2 T

7 F. @. Q/ J8 P3 J/ T}
) V: O, M! F) S$ L, s
第三种是普通方法for循环
1 x1 \: U+ g7 ~9 G, O
#include<stdio.h>
2 b6 C- U5 o3 y0 n9 Qvoid main()" }; {3 o3 q. ~; Y% j' O
{ int i,k,m,n,num[50],q,*p;+ }# e* y8 k0 G' M8 v& r
    clrscr();
: ]8 G4 g3 R9 {, z   printf("input number of person: n=");* c2 ?+ C, }, N7 }% @1 c1 B0 \
    scanf("%d",&n);
/ o0 K: _% d' d* c1 hprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只  P# e. [, \8 e. `% j7 D
    scanf("%d",&q);
& L+ f0 Q$ b0 r   p=num;
1 w6 z. ]7 Z6 F9 o3 z  for(i=0;i<n;i++). `* W" k: K  R; ?6 t4 l
    *(p+i)=i+1;1 |% g3 p, T. O
   i=0;. Z9 _  Z" m( x
   k=0;5 a4 r" |+ J& g$ P$ s
   m=0;4 R. Y; n" Z, Z+ r' W
  while(m<n-1)- s# Y; ]% F& D% ~6 X8 h
   {if(*(p+i)!=0) k++;
/ J0 L7 V6 R+ T* a( T& p     if(k==q)& k. \1 U& j* f' m
      { *(p+i)=0;
8 _. w9 o% m# O0 w        k=0;3 z/ }) W; T8 U8 k
        m++;
8 T. a" m& J0 H) }/ d2 r      }* g2 L1 V- `) I! A0 r, g
    i++;) T0 c: y7 N$ z4 ?8 b& E2 o8 Z/ {
    if(i==n)i=0;
9 l! C( q1 i: Z9 ^5 U% M   }! A* r: B5 y. i/ Z% e+ k4 s! y
  while(*p==0)p++;% Z- t' t, q3 H! D1 n  y8 q* s& V) Z
    printf("The last one is NO:%d\n",*p);, X. z8 [0 ^4 C8 F! `0 e  F1 c, V
     getch();: }7 o. ?/ Z% A: d# y( \+ c, s
- B* M- H, F, c" p. O' ?2 N  `
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;% X4 h. {: K9 ]
namespace 又费马达又费电
0 }0 M: b% N7 l5 n7 v( e) \{
2 k0 \' H! c4 N; a2 D- n    class Program
, w: \& N* U$ a  Q( j    {0 Q  D3 e3 H& M- Y) ]
        static void Main(string[] args)
5 ]& ?. m% N: V% |5 Y; S" y        {* A5 C9 h5 D$ r0 d5 G' Z# o
            int m, n;0 N* J) q2 Q/ M" f, ^3 \" }9 y
            Console.WriteLine("请输入数组长度");
3 q. a; _$ v  Y7 I0 l$ u' F            m = int.Parse(Console.ReadLine());//m为数组的大小" `0 x6 K2 L' k0 f0 D' ~0 g
            Console.WriteLine("请输入要截取数字的大小");
! t" G$ T' Z. b" q            n = int.Parse(Console.ReadLine());
# Z9 C! B$ H7 f& p& v8 o7 F            int [] numw=new int$ q& U3 `4 p" ?* d' }. {, }4 F8 N  ]# Q+ J
, _4 d" u5 G& I1 N
&shy;&shy;&shy;;) T: p& {5 U( o' A
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数7 Y4 y) h4 [5 s1 w8 o& \
            {
- s" N  k+ z$ @" Y; S: g                numw[j - 1] = j;) w* X, U- z! W& o+ \* g! J9 s
            }
/ j9 @. M* m  [  \, r: c            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!8 u& S1 F) N) r+ a$ {8 n
            while (d != m - 1)& A* o" {1 R& C
            {; h/ U& c) S% b3 v
                if (i == m && d != m - 1)
- a8 C+ w* z2 U( f: v( z                {
- |* }( L( z# R" I  p! m3 B                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
) \7 e; v0 p' x0 \- L; d, y6 l                    continue;
' G0 a1 z, d& x% a                }4 l% g$ ~2 k" p. v
                else
: F1 j2 s& B: J! ~                {
  N+ Q, h9 S; S/ V5 ?# N8 E; h. [                    if (numw[i] != 0)0 y* O" O( t  |2 \
                    {4 Y3 g! e/ I; d' u) Q& A
                        i++;2 A/ w' {- j" M& k  k8 B+ n; c6 r  Z- b
                        k++;
5 X6 Y- ~. X2 q# {: q. G                        if (k == n)8 y' c# ~7 B' o$ K6 V( Y& ^  X2 D$ R
                        {$ ?! A9 |2 L" H
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
$ V5 {& u7 x* }, q) q6 _. v7 Y3 W                            k = 0;
  m6 I- _' T2 L6 E" O8 I7 o4 {) g              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1; y- o# Z/ v1 ^
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);+ N' X, O9 E; c1 [; O, R/ ^
                        }3 u% m" \( {- g7 U0 Z+ _- N
                        else//输出暂时还没有改变数组元素的值+ c& l8 ~6 S7 Z; r4 U. v$ _; Y8 a
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);0 `: X; y% u% ~) ]2 [- W) u( `. {
                    }5 k/ Z3 I5 z! E1 n/ M
                    else
5 G: `  g+ O; K2 f, b! Q                        i++;//数组元素为0,直接跳过,不计数。。。. c  f! S: L7 X( _+ S! }
                }
2 J, j+ S8 Q; n6 _( p9 n
4 O: c1 O2 p5 ~0 \" w" S7 p" h: H$ @+ G* O& A# G$ _5 Q& [
            }//结束while循环
, q0 V$ X+ r) V1 O- v            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
) r7 w0 b7 w. f           ) v4 ?* e# X, Q" b
                if (numw[i] != 0)0 M+ F( G# B% g1 F: k1 ^5 l
                    Console.WriteLine(numw[i]);
% `# D6 m8 s3 `           3 f) N. L; p, A$ ]: n
            Console.ReadLine();
& \, ?' u# K: B/ Y+ t2 C; n        }( Q4 {: \, [, w) x/ S, z- I
    }* X  h4 Q: t$ Z; P* n! W
}
- g$ ^! j, }, U1 g1 c. O
小甲鱼最新课程 -> 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-8-21 07:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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