鱼C论坛

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

猴子问题

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

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

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

x
大家好!& q$ d/ J5 ]) ?" j" g
这几天我在忙着编一个问题,我用了一种方法编出来!. {' s  ?" I2 q4 e4 ^& r6 s
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
* S8 C/ y* `  M" V/ v注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
3 {1 X* I+ Y1 ?6 Q2 E
$ R$ P( x& b7 _4 K
8 r) ?& O5 ]7 Z5 o  E8 p2 J& }
                            题目
- k# T1 w6 r: \& z# r山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。0 |$ D+ U  O1 l! ?. I# d
第一种方法:利用循环链表
" X! M2 z, J  S1 j+ Z1 l( L+ h: y#include<stdio.h>
. R0 _% ?# ^( h4 o#include<malloc.h>( h" G1 b/ A+ Z7 J$ e
#define M 8            //共有8只猴子1 f0 `7 P3 l0 k$ N
#define N 3            //数到3只时退出第三只
5 W- U) u( `4 C2 [1 ttypedef struct monkey) N  c: {* s- a4 }5 N
{int number;
1 Y# f1 ?* _  |( p! |int flag;# W$ f: C5 ?: q2 @4 v, H$ |
struct monkey* next;
6 F3 c) a! A) `}MONKEY;, c0 @  `& E3 G0 p8 N( |
main()  Z) ]! C7 Z: n- q
{ MONKEY *head=NULL,*p,*s;
* B0 t! n1 ?; s( u  int i,sum=0,count=0;1 {2 L8 s4 g/ q; r
  clrscr();              //清屏
2 U9 j6 O" A% }+ P; l; o* k- ^  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
4 c" D7 L  S/ }! s5 g8 L  p->number=1;p->flag=1;- J  i5 y) y% c" G3 {1 E" D
  p->next=head;! g/ J2 v8 y* t8 i3 a, U
  head=p;1 x- i- C/ u/ W% G9 @; r$ E
  for(i=2;i<=M;i++)" P- d) s  Q5 t  w) k
    { s=(MONKEY *)malloc(sizeof(MONKEY));
5 O* H: F6 [+ L: {5 W     s->number=i;s->flag=1;
8 v$ b; u. N% E: y     s->next=head;
  g3 s' ^3 u! Q9 E  ^9 z. ~1 `     p->next=s;p=p->next;- ~) `( W& m2 d) h" }: C
    }
; i% ?4 q7 q3 U    p=head;
$ |8 }7 C& @% E: C; P7 J   for(;;); l" M; v6 a+ t
    {if(p->flag==1)
7 I5 L+ Y8 Y; ^# H       count++;7 u- y3 T: H5 b. k/ @
     if(count==N)# I( O$ M* e1 c( M. e- S" s! F
        {p->flag=0;
" L9 e, }4 `7 P         count=0;
. B) r$ s; ]; E; b0 n         sum++;}& `5 L" ^$ E" A3 C
     if(sum==M-1)
& I' C# g4 b" f- r+ H$ \: [        break;% h/ {& x- M# [- V: ?4 d" U/ w
     p=p->next;
# d6 _% A& H* X+ O0 i  {  Z% F    }
  A) V4 `0 `0 n* ^2 m# Y    p=
6 G/ O: Y- r# k- z    head;( E- F8 Z8 G# u4 H  b% O
    for(i=1;i<=M;i++)
4 N8 T0 b& w7 ^/ P  J+ w    { if(p->flag==1)" n- a6 M0 R! f: F* ~. G
        printf("\t%d",p->number);" @# Z5 ?# D0 [) z* |# B
      p=p->next;9 O* P2 g! @% R& ]
    }
: d0 I0 H+ l3 ]; v1 Y- Z- }
1 _: ?; n) V2 J7 q8 |4 b
9 v: [. T. Y0 v3 A, T
4 n' \6 a. S2 z: m( j" j2 p8 r}
& E; z# Y4 \: W+ A0 J" e$ l
第二种方法:数组
: b) J7 y" r$ J* x1 F#include<stdio.h>' e/ U' q0 R0 K  B, ~
#define M 8, k; ]5 f6 p6 O7 T+ H% t
struct monkey
* f% e: I# {0 K: o! Q* [. o" f{int number;
; `% @; c$ ]9 x1 A# D  hint nextp;
; g( h5 }3 b  W6 M( q4 U& y}link[M+1];0 O  [3 T4 {3 Q' U2 Y/ X" x
. H. y$ B& _3 G  N/ D
void main()
: l& r! l% P. c2 C! r{int i,count,h;3 y0 D3 z5 x: A/ l9 {
for(i=1;i<=M;i++)3 [4 R3 e3 `% t5 Y( A: j9 h
{  if(i==M)' @8 \& C/ r# ^
   link[i].nextp=1;
! P( b5 z( c) Q! n$ U6 a   else
! q/ B) W0 Q! ~9 q& t: u   link[i].nextp=i+1;
6 W7 \6 P" u; \4 s, M, u# Y* m  link[i].number=i;/ {$ f# I; r  \; a  q2 `9 a3 w
}
$ L1 _, f- r2 g, u9 eprintf("\n");
; L: U9 L$ O- m3 m4 f6 ecount=0;$ b; D1 X6 a; m0 t4 d+ o
h=M;
# |! x" c( r% A1 e& r: z4 K  _0 eprintf("依次退出的猴子: \n");3 [$ m% c9 W* h- E
while(count<M-1)
7 P  W7 ~3 t0 c1 u1 G+ P& A{i=0;
; T$ ^4 Q# n- z  @* q8 @8 Z% twhile(i!=3)' B) J' _. C* {3 K% j, J, w
{ h=link[h].nextp;7 ?- F( d. k$ a3 k5 X& \2 J) u
   if(link[h].number)
4 [( ^( i( s5 n     i++;}$ E! }! t  ^  e9 D+ z5 s' \& m, l

" l8 L/ \! x1 F+ r" v3 X  K8 pprintf("%4d",link[h].number);
9 D2 P( P3 e/ M. @* glink[h].number=0;+ D: I1 [  t0 I6 ~/ B
count++;
: \) v% c# z9 k8 r; `, n  C0 R' d}
- m) D* {7 X" e( a& d: h3 @: Q0 S' M( V; j1 t
printf("\n大王是:");
  y# [0 Q2 H* x& I' y5 K  for(i=1;i<=M;i++)
7 g7 {" q* ^0 e# h! L- P! p  if(link[i].number)/ z( b7 v1 z4 c. |
    printf("%3d\n",link[i].number);
4 j( \- W7 V* o. w7 h9 ~9 ~8 H$ w  F' K! u  J, \+ G" C5 b, H4 [
, A' p& y+ M  H& K* _
}
- E3 M$ G1 q4 J
第三种是普通方法for循环
2 s" L- a- C# S: F! `  _
#include<stdio.h>9 y+ Y7 \1 D( T- w3 K
void main()- q7 m1 V( K! E( ~" k( }* x" L* G+ g
{ int i,k,m,n,num[50],q,*p;- ?: a; u; e4 k% K9 J
    clrscr();
+ p) L: P) E5 Z" U% |, L# z. z! {* v6 L   printf("input number of person: n=");; T1 n! ^- I5 w3 R: ^2 i/ M
    scanf("%d",&n);
. d; C+ d& Z2 N  f8 ~printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
5 r/ X$ b' R2 Y; a3 W6 v    scanf("%d",&q);8 B' |) j  c6 U- u+ \' s7 r
   p=num;3 L: ~2 e$ N- f$ F
  for(i=0;i<n;i++)
. G% n$ Z& d: }2 f; S( G    *(p+i)=i+1;
, E6 x# [1 N- {6 q& W   i=0;
1 ~1 [* ~9 b6 Y' \3 K   k=0;6 Y, x) t# X3 K5 d! ?' s
   m=0;
/ {4 N6 P1 X' m8 X: I  while(m<n-1). F/ @7 @  d6 R( T" C
   {if(*(p+i)!=0) k++;. A0 o2 O! o1 C, D. ^
     if(k==q)+ B5 c' g" W; Y( ~2 B
      { *(p+i)=0;
' ]7 b) o2 _% A  F- ?        k=0;+ y4 Y3 {1 w1 T+ L" P# O
        m++;
  [# x3 F9 u. P2 Z6 C2 f      }9 p' g. R4 Q9 J5 k) [
    i++;
; d3 \' A( i* y# D: Y9 c! P4 M: o    if(i==n)i=0;1 n8 M1 R/ S; o
   }
% c# K0 h! u' V  while(*p==0)p++;/ s  F7 C2 b/ b( v  Y+ g8 t
    printf("The last one is NO:%d\n",*p);
! a; C; ]( g- Z6 m6 V/ D; V     getch();
% x, {0 K9 M7 E* l$ N4 Y: o. N4 X* U8 T
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
0 P6 `' [6 n% l8 x! |( Q1 q' Snamespace 又费马达又费电
) Y+ h; L9 O/ {{- L. k: `) R' a$ O/ ^6 n9 F1 N
    class Program  X, C5 j/ A5 r9 U! ~/ }
    {& ]' |1 Z" z  V2 P
        static void Main(string[] args)
& l  G1 \- t0 I$ n! d. N        {
8 Q: g. |4 G# B. o            int m, n;
0 F+ d; x; s* ]" X3 ]" N* W            Console.WriteLine("请输入数组长度");
! y/ J- K- `$ ]. X2 `/ R            m = int.Parse(Console.ReadLine());//m为数组的大小& z" W" Q- [& p% N
            Console.WriteLine("请输入要截取数字的大小");# W! [9 @. _) k! ~  W
            n = int.Parse(Console.ReadLine());7 _, C9 ~1 V* x% J% M
            int [] numw=new int
8 _; n) o  T; T* ~  L0 }- b8 x, K: }3 f5 i! z. t4 b
&shy;&shy;&shy;;
! L. B' d# Z. `( E% i$ L" T            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
" s# I9 v. j" r$ `! Y( n            {
' \9 a  V: r/ f2 {0 W% w                numw[j - 1] = j;  ?/ \0 {4 T& X# v0 U) }. T
            }0 W3 e# z/ `. M: k- E8 y
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
. _8 S. G; R5 c1 ]: s0 D! ~            while (d != m - 1)
+ ~7 b$ g* @- i7 B# f$ @( b, |            {
3 z1 e5 X, l6 x/ ]' }& x, S  M                if (i == m && d != m - 1)
/ t4 a+ b8 [# F: Q  b                {
  o1 F8 I+ F2 C' U# A                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
) }; s$ B- v$ r) e                    continue;8 ]( Z1 @) ^7 O7 Q$ c
                }3 D5 b  F# ^, i5 ]
                else' Q7 v) S1 p; Y0 j4 X
                {
+ [2 @- Z! P1 p                    if (numw[i] != 0)
( m: k$ e* ]: n& q! [4 W: ~                    {
9 c$ K+ z3 V3 G* _                        i++;" @0 u/ [4 V0 P2 p- A5 N% \. g8 n
                        k++;
! @) _& x" H$ h                        if (k == n): n8 L+ G1 F/ Y. f9 n
                        {: ~. E2 ~' q& B2 @! O
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了; ?: r. v& ~. _& ]# ~
                            k = 0;
, T$ }; L' B: N, g4 v. \              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
! d' Q! h' [" \; z                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
0 e7 N5 {  c+ A# X/ u5 R7 m                        }" z% m  S* |. Y# n+ v3 \% Z2 F
                        else//输出暂时还没有改变数组元素的值1 I! X. o2 k7 x( ^6 z
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
8 L, w. ]! z" u) j9 U% d6 c                    }3 ^+ e7 z% l) E9 d: k* B
                    else
! O7 [5 T4 U+ m* ~9 L$ t7 U7 M6 V3 e                        i++;//数组元素为0,直接跳过,不计数。。。
7 _( ]7 V' y, W+ G& m1 N                }9 O. c2 ~+ p- d1 S/ X( `9 g- J7 n
4 I0 A: V; U- F& F# D  ?

" _3 r, F) K8 u- r" l- }2 Z            }//结束while循环
+ ~- D. X- e. T" E            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
4 Y- f$ M0 H, }8 t# ?; H           
3 ?" S0 z8 R9 L" i7 U9 t! o: e* x                if (numw[i] != 0); d1 }! {% _( n# [/ l: T" f5 n
                    Console.WriteLine(numw[i]);% t: ]7 K# F) n+ O* j3 H( ~- j
             J! K0 P% M, q  n1 V" c
            Console.ReadLine();
& @" B  o8 m% f. o        }
. I* X0 q3 i; u0 [/ ~( E    }
8 k# Y  G1 r+ Q+ A}# k4 v/ e/ d- ~8 w2 w$ U
小甲鱼最新课程 -> 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-8 13:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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