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

猴子问题

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

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

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

×
大家好!
! V1 G  ?( Q. C9 r+ ?) R- w( C这几天我在忙着编一个问题,我用了一种方法编出来!
% c2 Z! t/ i& `6 O但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
+ n# ]- a4 s" h3 u1 L. g注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ( \. y" l* k1 M1 _1 Y" V
0 v, |( ?: w) U4 F4 ~: C2 c
( m1 w& \" }* `& O# b6 G' C* M
                            题目
: F  B& `! x6 ]! V" W/ \  {山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
( G) D& `" e. f' c第一种方法:利用循环链表
: D% x. D& U, u8 K1 N% i3 X#include<stdio.h>
8 S" e9 Z. }) V( c, q#include<malloc.h>
- m8 q! N; e  p& T8 ]6 D) z#define M 8            //共有8只猴子
8 [$ c3 `# ?( Z1 k5 }/ x#define N 3            //数到3只时退出第三只
, e. I# m9 r- Ttypedef struct monkey. X. j2 W* Y2 x1 J3 Y2 n$ d
{int number;9 r; s" @$ o6 W( J2 h' p
int flag;! m/ h: Y3 i6 m$ J& u1 I  I9 Q
struct monkey* next;
& [: W  e3 t6 E}MONKEY;
0 P$ V1 z5 L) p" Qmain()! x! }+ N7 s8 O1 M$ @1 A
{ MONKEY *head=NULL,*p,*s;+ _& b$ b. Y& u2 P
  int i,sum=0,count=0;& D7 z/ d+ b9 O. o
  clrscr();              //清屏
& h- n: ~3 h4 ]' r( C2 D  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存3 z5 l+ C4 y  `' W6 F/ j7 y6 ?; d
  p->number=1;p->flag=1;' l8 D$ Y. n4 r6 n- T# O
  p->next=head;
! N# V3 ]6 Z5 J3 Q8 O  head=p;
: F: n" \9 |( u& u( g0 L  for(i=2;i<=M;i++)
* {1 P; w& H# i# |% \' g- ?    { s=(MONKEY *)malloc(sizeof(MONKEY));4 q. D9 t2 p# Q; x0 @8 X% Q6 {
     s->number=i;s->flag=1;
0 u3 C2 B, \5 W6 ?- [     s->next=head;+ {) _, j7 Z- y% i
     p->next=s;p=p->next;
7 c/ x' X( Z* [) F" `    }
' A6 D, R4 o: d; F2 u: d    p=head;& ^2 t/ s3 G1 Z  p1 w
   for(;;)  w- x( L. G+ L" y' n
    {if(p->flag==1)+ t6 B7 x6 \4 x
       count++;
" |, f- T, ?0 A0 c! y+ N; y     if(count==N); [; ~& f+ I- ^. a
        {p->flag=0;
# ^  ]8 e, y1 p& |. `         count=0;
+ i0 M3 u5 g% G- b1 ^+ |         sum++;}
7 M( |# y9 H9 U! n# u     if(sum==M-1)) o0 I! Y. T* Z: I3 W
        break;
$ \, `3 `5 V  }5 v7 W8 V     p=p->next;
! k" g) Q7 p# J1 k    }
- U, ^6 |8 C7 a/ A8 @8 B    p=
" k! O  l6 y" m    head;( h3 L5 x9 V. y- j) n# w& f0 u
    for(i=1;i<=M;i++): z0 T! K% ?9 h: [" K: e- }) I
    { if(p->flag==1)/ |+ x/ b: H5 ^/ i& {4 y
        printf("\t%d",p->number);0 F  m4 y; B. g$ I
      p=p->next;! Z. G: ?7 j1 k  p$ a: e0 E
    }6 U: T1 V: ]" F7 T) D  h

$ `2 F4 S  }- T# Y. F) u7 g7 H2 z" L( d4 H' y4 f

( l' w: S9 f- D+ E9 a}
; m3 {: M6 G' Z* L+ R
第二种方法:数组+ A/ W! \2 f# z- f' v8 P6 z4 \
#include<stdio.h>
- u1 C! u' @2 s( u#define M 8
: g1 r6 P. Y  Q: H8 k1 U6 ?struct monkey0 f) h" p" B3 a2 u7 U$ n! R
{int number;
) G  o2 `: d9 t( mint nextp;  g+ i% t9 \# m- y2 |
}link[M+1];0 ~9 {5 a5 D! {# o1 j( G

& i& E1 ?& o0 Y! c& v2 h2 z4 Ovoid main()
) C1 o% H0 W& m5 C. Y1 |8 Y# z. I{int i,count,h;
% C7 l3 c8 |6 a' o% cfor(i=1;i<=M;i++)
: I1 l  Y) a' s/ {  C4 ~7 f8 f{  if(i==M)9 k- J  [3 X' Y+ @5 s
   link.nextp=1;
1 V  U, y# i/ o/ C0 T+ j9 M, V8 @   else
! X1 h" [( t7 y! |   link.nextp=i+1;
6 n( M3 b" s! m8 R  p  link.number=i;+ k3 X6 k: y" E1 \4 r
}& C* y5 |( B2 I$ o% F
printf("\n");
- `  t1 N0 ]' o( E- tcount=0;
; P7 u* V9 m' m9 b- N0 t: x7 R1 qh=M;6 V% H: ]8 m; V% b
printf("依次退出的猴子: \n");
/ r% N. Z+ T2 ]- X" z: Uwhile(count<M-1)
4 _1 q# N: _# X" j& c/ }{i=0;1 r* T- i# ~3 }, @" ]
while(i!=3)
4 b$ I% z# \9 R( n7 B' o{ h=link[h].nextp;
, S8 x& S; E; a6 H; K' n   if(link[h].number)* H9 _& f7 b* e( i! l9 R) [% {8 f
     i++;}
, g; C0 s8 q* @3 A& l- Z1 _  }
9 }- v' U9 Z. u" yprintf("%4d",link[h].number);) ^6 A/ T) Q$ @8 n
link[h].number=0;
8 |5 y6 c" Z0 G1 _' N+ fcount++;) o9 f- e& [& X+ t
}- p; Z4 J. [1 L4 h9 `
, E0 X. S( S( B/ n' D
printf("\n大王是:");
% n0 z1 [8 g1 B8 U! V: Q% H9 c7 D  for(i=1;i<=M;i++)
2 B& _& A+ Z8 ?. ]/ q- ^  if(link.number)
# S7 c. i. K) J% E: y    printf("%3d\n",link.number);
' o7 b/ z+ Y' m+ E8 n. n# L# {9 {" X. X

7 G/ p9 c: T0 c8 R" F6 h: Z# x}
: _6 h3 I5 d& z- `" A
第三种是普通方法for循环

2 `  c: g! b$ B! T#include<stdio.h>
! p- B7 J, H: j9 m4 P% A/ K3 nvoid main()
$ p2 F1 `) Y0 M5 `& T{ int i,k,m,n,num[50],q,*p;* `' _; T) ^2 V# t; @  e. E
    clrscr();
, c$ f8 @; k4 h9 F   printf("input number of person: n=");
2 k2 u, i. z5 w    scanf("%d",&n);
4 i5 |& ?4 m9 l( x5 B" qprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只, p6 Y4 O6 j1 u1 c9 _& c( ~8 c
    scanf("%d",&q);
; |' a* W9 B  m, h4 m) P5 j   p=num;
/ D4 a$ L7 K) m  C6 [5 K3 {. u  for(i=0;i<n;i++)
7 w8 h( Y6 {. ]/ e6 j3 q6 d    *(p+i)=i+1;2 H5 }& C) Z5 f4 f* I8 A/ a% [4 P
   i=0;
' _6 r- y" @4 p9 D   k=0;  r! ^" |: ?4 l7 Q
   m=0;
0 [8 J2 V! {+ [. `  V; T  while(m<n-1)/ F8 T) u, S; R& q
   {if(*(p+i)!=0) k++;+ [! Z1 ]2 t0 ?: c! S1 M/ s0 \
     if(k==q)/ E) ?- v6 {/ a  E! x, {
      { *(p+i)=0;
$ i, f. |3 a+ Y" u- J3 x6 i, S, X: H        k=0;: d& `* h9 m$ i( I' s+ m; S; r
        m++;
$ R2 M2 X8 c% v/ v# q, V      }
/ x  b( V- F  J0 h    i++;
2 l: d% V+ r& O" C7 G! f- I    if(i==n)i=0;
0 @1 P! K3 Z) s* S, Q! G   }
0 o# H: n' W% F5 @* e) c  while(*p==0)p++;, U* g3 J+ i7 W& M8 x- ?# z
    printf("The last one is NO:%d\n",*p);
$ \- L4 \' y- z' B1 ?3 x* P     getch();
: G+ ]6 t6 L0 Z+ e2 g: Q; r' w$ M" H- f1 z
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
+ m9 _8 J7 X/ d3 U3 ]# ^namespace 又费马达又费电1 v# n6 A: k5 _3 D- R
{
( S- q; }. _. G* a) G& f    class Program
5 q+ q# ?) P8 `% }0 ?  h$ H    {
) l0 _/ z) x/ T5 ~% h        static void Main(string[] args)
: W! h$ O4 z  \1 E        {
% ^$ E* v) F- k) _            int m, n;
- P, H% @, Q! [1 Z; [: L" Z& G            Console.WriteLine("请输入数组长度");
: M+ Y" N8 `' q& t            m = int.Parse(Console.ReadLine());//m为数组的大小0 J+ U- @* Y: e; v- [8 @4 z8 v
            Console.WriteLine("请输入要截取数字的大小");
; v1 H% A# U3 a8 U. {            n = int.Parse(Console.ReadLine());
# l; S* E7 l0 \& L9 ^5 z. Z            int [] numw=new int9 Y' a4 Q$ f% Q5 q& V4 S: w) g: q

( ]- W  ^1 _( v" C' |&shy;&shy;&shy;;7 R! O) ~) I) K4 C0 H4 w
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数' R$ J+ W/ H( z  [& c; I
            {
3 H. i' S' P# o8 c& I                numw[j - 1] = j;
! J2 P  C- S1 W            }
. Z9 V7 v# l4 r5 k- z            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
9 `9 i) H2 {! E6 m  m            while (d != m - 1)
8 M  p( o8 P% b. b            {
& a, k, `7 }' U' D& J) m                if (i == m && d != m - 1)
* }8 c( P: ^" y# A% h                {4 ]& x5 K/ J; l0 F2 i( S& U- E
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!% G0 r) S2 \8 {! Q4 X
                    continue;: d# c! `6 Y1 D3 [: B. R( s' c5 ~
                }" ?# D( t+ d8 _
                else3 q+ d& C  M( Y+ b' R( \" B& N
                {
, ?% o5 e% y2 P) K                    if (numw[i] != 0)" m# |/ u3 h6 |2 X4 n+ m
                    {5 c5 N3 R/ j) [9 O$ Y, b/ E. I/ x
                        i++;! }. E; w( E3 n% l& H
                        k++;
' q4 U/ }5 q; o+ V7 [8 t3 ?) H6 x                        if (k == n)
4 A5 V$ x% c2 T/ c6 P# Z; }                        {
- d* j; F6 P8 Q                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
/ a% m$ n+ G3 M  H5 c                            k = 0;4 D8 K+ [  T. J. R5 q- z3 N! g
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1( g! W" T: U; ]4 j0 d1 _
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);$ D; w/ W; l) i7 r* {" D
                        }! L- u' U9 s; j
                        else//输出暂时还没有改变数组元素的值
' r5 F) y/ p6 Y& O  {4 w8 A! X- i0 v% p! ]                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
, U$ D1 o- U9 j6 O# p* p" l                    }
. [4 D- {9 D: o& x) D3 P% |7 R                    else
3 @: x" U$ [4 G, F# F! s! e- Z% G                        i++;//数组元素为0,直接跳过,不计数。。。
0 N2 C; b+ K. V' O# x/ W$ p                }
6 n1 {- \8 I# Y/ Z5 D8 B/ ]
8 H: ]. y) A  v* p: f
5 B) H; C4 w1 g0 a            }//结束while循环
) Y  n6 u2 n/ r            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
, v- x& g/ u7 E8 b7 g- C           
( j6 R# [, ]3 u; X                if (numw[i] != 0)
4 Q; Z: i! m) c8 t                    Console.WriteLine(numw[i]);
8 E# ?: G5 U" m- s9 Y+ f& a           
) _+ J4 }% s' U. Z+ Y            Console.ReadLine();) |3 M0 j, N: ~# N" S7 c) W; d
        }8 A9 c' i4 h$ r# W
    }& C, K6 g1 u( v7 e
}  D5 H! X* h) ?' @) K9 B9 N
小甲鱼最新课程 -> 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-5 02:47

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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