鱼C论坛

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

猴子问题

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

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

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

x
大家好!
* z$ `6 [: n, n1 d/ [  N这几天我在忙着编一个问题,我用了一种方法编出来!
# D- w( v1 P7 a  M! z- q$ P- H但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!7 C% ^: h0 k- @& G0 t
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 & o2 r" }- W9 `6 j! a
9 R! x* G; x& Y" R+ m
/ Y8 w" r2 [8 T1 T) I
                            题目
, q/ o& J5 d& K' E5 B3 U5 I山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。5 T7 ?! W% `& I. A/ l
第一种方法:利用循环链表
/ M8 J, e6 z+ }# V#include<stdio.h>
6 `8 O3 u0 D5 D4 Q% B& c#include<malloc.h>. p. Z! s# `2 s. I, A# y
#define M 8            //共有8只猴子  r9 N" s- `1 u& v* [+ x
#define N 3            //数到3只时退出第三只1 R. j8 E( ?' l3 f0 n
typedef struct monkey' Z, n3 ]/ a$ h0 o( c
{int number;
' U. J* Q  B/ H  g8 U1 v, h. Hint flag;" J, s; e" Y+ |4 s3 h! o' \! F$ _
struct monkey* next;
$ l8 _& }1 J' j}MONKEY;# u7 W0 D3 W, j  t, E* `3 U7 a
main()  j$ `0 p8 o, t4 c( k8 l( D+ E0 P! m
{ MONKEY *head=NULL,*p,*s;* j7 v( ~; @0 l: h- d7 k; z( ^+ _
  int i,sum=0,count=0;
0 r$ A* g2 I* e. U/ F  clrscr();              //清屏+ [: S; p) X6 u! {
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
9 b' n7 ^. p0 O& }% ~" p$ s' y  p->number=1;p->flag=1;
' x$ C' \" f0 X- q& x; E! u  p->next=head;
% l! o& F; \4 Q* C2 `9 b* k' M  head=p;
, j( W1 G- b: m: q! z$ b% Q$ k" y  for(i=2;i<=M;i++)$ v% q& V) E/ [( Y
    { s=(MONKEY *)malloc(sizeof(MONKEY));
) Y! u/ ?3 D' a     s->number=i;s->flag=1;7 F$ P, N1 c3 t4 U
     s->next=head;
2 S1 N8 d- D; i3 }     p->next=s;p=p->next;
% n7 M: ~0 q6 q4 @& v    }! [0 V1 j, M& [5 P% w0 b
    p=head;
) ?. n0 t6 C% ~; v, G   for(;;)
' @% Y) p+ @: K+ e    {if(p->flag==1)8 V* H7 N7 Q* z; E
       count++;% l! V1 a# I* L' M+ c, R
     if(count==N)
2 f* c; m! d0 c0 G1 O+ y        {p->flag=0;/ b7 }/ N/ |- u* k9 V, H! x
         count=0;
- V, c* V' g+ P* |4 z         sum++;}1 e4 v) |& J) G. o+ p2 R% x
     if(sum==M-1)* P2 f! `. `0 s' [( m
        break;: G' m/ {3 s+ s2 y8 B# x
     p=p->next;) m9 I8 O) V9 C6 x' J
    }
8 W* u+ @4 c( |; y& \3 F    p=+ q* Z4 ]6 L$ j5 G3 \
    head;% X! F9 {) Z, H/ X# ?0 C
    for(i=1;i<=M;i++)
' t. o0 x$ S4 `# [, L    { if(p->flag==1), k# b0 S, z2 ~, i, @7 ~! J  v
        printf("\t%d",p->number);
' r3 c8 k9 y) C) n: i% C      p=p->next;
: {) C4 I& m, n. b% K    }, I. E6 k( V6 d7 K5 j. [

2 ?5 `' I: k- x& N( C8 z
6 y. ]* o, P$ e) X; o& ^2 r' N2 p1 U" i; j
}

$ K) _" _# U- \# b第二种方法:数组
2 `" Z8 T3 p# D" T2 M#include<stdio.h>
+ t) W* V1 Y5 u  \# k#define M 8  c& ~9 J( N: ]6 ^( P& r
struct monkey' y- N1 j5 {9 ]# e" y
{int number;1 x) ]$ y# Z' ^7 t
int nextp;. s  O% K5 @8 K) L. S+ c) f
}link[M+1];9 T& z! @+ T  ^; |4 U

' N' Y8 n: q! \9 v( {8 evoid main()
7 f& B9 n3 C1 P& D+ R{int i,count,h;
$ T! h* R. n/ o* u. cfor(i=1;i<=M;i++)
8 @* L: @, {7 J" i) S4 }{  if(i==M)
: _8 Z: u( X; N! ^9 B   link[i].nextp=1;( d) Y  y3 s" Z8 T! T
   else+ w0 t8 V, U: t9 x  E" @  p" I0 Z
   link[i].nextp=i+1;, R' A) n# M# n2 t: S& i2 _
  link[i].number=i;
( s; [( ]& u4 Z6 u7 I( X" z}# V  |5 y  g: |0 S0 X# h" _9 G* ^
printf("\n");+ t3 I& P) T4 t) D) B
count=0;$ c) d/ X- X! `/ E
h=M;1 J5 e' v$ f2 y$ w. M$ x5 T7 G
printf("依次退出的猴子: \n");% M6 o- o/ O0 e$ U" r+ `
while(count<M-1)2 }2 s1 S  E. v8 G8 g2 o4 _+ E% v7 e/ R
{i=0;
2 u" d$ A/ W1 L/ Y5 Kwhile(i!=3)- t. Z: O) l' N8 b* V, l' t9 q
{ h=link[h].nextp;
) V) C# {( M) \, K3 K- x: d   if(link[h].number)  ~2 n; W' q4 q% O0 S
     i++;}: Y" u5 [% i! _+ V7 U% H/ G0 [  o$ c9 T

' p* a7 k1 y& G1 Kprintf("%4d",link[h].number);3 W2 p9 l6 z) x! l5 E/ H3 v, Z7 I
link[h].number=0;
5 {0 o. k, N" k$ t/ q: {7 lcount++;
& K  D! x5 D+ h0 T}" x' M9 i/ X+ a3 s# G
7 x  C) L0 F+ \# ]7 K: o
printf("\n大王是:");$ F7 |2 @" Y( A0 L$ T/ L
  for(i=1;i<=M;i++)
2 `4 {: ]# g0 _5 f4 K. W7 ^/ Q  if(link[i].number)( d7 O) x. r, s' f+ Q( m
    printf("%3d\n",link[i].number);
9 K7 Y1 \" _+ Z9 B* L) Q8 E) `& W' b! |

5 _' {. A/ l3 P5 {& c# O0 g}
/ S6 \" d6 u$ R$ W1 v
第三种是普通方法for循环

6 h, Z& a' E7 W# C  X! z#include<stdio.h>/ D/ A# p  p+ B- o
void main()
4 T2 W5 d9 d4 N2 B{ int i,k,m,n,num[50],q,*p;
' q8 d: k. x% b( m    clrscr();) \. Y5 @; J, X- T5 g) j& K, |
   printf("input number of person: n=");5 D6 O# P( }( u" T( E! h. `$ t
    scanf("%d",&n);
. x$ O0 i# N1 r5 ~' K5 n: Yprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
% L! O5 S) s# ]- |4 u  l: V" L  x+ a    scanf("%d",&q);+ a9 A! ^; w- p1 x8 Z7 P
   p=num;+ K9 N7 d1 }0 d# p+ H7 J, j
  for(i=0;i<n;i++)
; g7 u  M/ a- ]6 N- B    *(p+i)=i+1;7 G; G; K  `: Z. _' l8 E
   i=0;
; K  c( X0 K1 o6 ~   k=0;
& K4 t* U0 ]1 V" Y& M& K   m=0;' I7 W7 z/ P/ y7 W. h1 [5 ]
  while(m<n-1)
/ _/ o- c' I; {+ {8 z   {if(*(p+i)!=0) k++;
" ?5 l; e  {/ T; ?4 L     if(k==q): J7 g3 z  F. R7 g
      { *(p+i)=0;! W5 x, j7 l$ x+ j: K
        k=0;
1 @& N. X# Y- q. I/ r        m++;# a: z# x8 R2 M8 u" b/ U- g# p  ^6 d# h/ v
      }- v& L; Y# Q: r# c9 ?7 Y. n# k
    i++;+ ?! R* u  p/ W5 v4 A' S
    if(i==n)i=0;
8 \8 ?0 p' r8 }+ f0 P   }, G0 j2 I& }; H1 S- r$ a
  while(*p==0)p++;
# y2 i5 {+ c' B# t" K/ K    printf("The last one is NO:%d\n",*p);
( k: X) B) N. D6 N/ Q* }/ B     getch();
) j9 C, I8 u( Y, k5 P1 }5 b7 w( `% ?: O6 a/ c, V# g
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;, q9 [' o0 c! D/ L0 o! m
namespace 又费马达又费电
$ Q" [0 q4 I8 \3 H% n, B{
) I* W# P6 @$ i7 i9 D+ {  Z6 O    class Program; W# ^) d5 ]+ \) r
    {% Y( c& [/ j+ Z, Q. ?. l
        static void Main(string[] args)/ [; e  ^. ]7 B- _
        {
: v3 n7 X' i7 ~& Y0 t9 `            int m, n;# a2 F3 a- O% S- h5 `
            Console.WriteLine("请输入数组长度");) x! v8 M0 {! Z0 Q9 C3 N
            m = int.Parse(Console.ReadLine());//m为数组的大小( M- c6 I, i6 C$ n: f% w
            Console.WriteLine("请输入要截取数字的大小");
+ r* o6 g; J9 ~1 x* |+ q+ U            n = int.Parse(Console.ReadLine());$ d/ K# X' d- ~0 f9 r7 [
            int [] numw=new int$ q0 N' g1 w2 h) ^! F4 z1 @

# K! P) M$ ]  F2 G&shy;&shy;&shy;;1 o+ x' ]$ W* b; B. C( q( A/ D
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
) I7 I7 o, w; I1 H            {
2 v9 f+ o/ i" ]" u+ J0 h, @# f+ ^                numw[j - 1] = j;
8 O; ~- ~2 B5 h7 D            }! m( J! w9 J& ~1 m
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!% }$ r! B/ K9 {, a2 F( @
            while (d != m - 1)1 u, a, O4 Z4 S4 z3 A' M7 s& ?7 u5 Z
            {
. M- w. `5 I0 Z3 H& K( Z& E                if (i == m && d != m - 1)4 i7 {5 D- Q: ]1 G0 L+ @
                {
7 F& f: y" G6 o7 B$ [+ G8 s6 |                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
4 N* \8 ^8 K1 `2 f' B% h/ P                    continue;
* [1 d% h9 k! r9 ?$ x# {& D9 x# q( {                }7 }8 A+ L  w& z8 q) I' u) d
                else) o! |0 ?+ a" [0 J0 }
                {
+ N7 d' ^( w& @7 f* S) L  E                    if (numw[i] != 0)
% p; ~5 A' s6 z5 Q9 H                    {
) P' _5 _$ p# j( H, i5 R                        i++;7 N3 w9 c, x& Z  p
                        k++;( j, @# C# }' c; r+ ~* ~
                        if (k == n)
! ]' C! ^( q4 i& A7 b2 X3 j                        {, Z% f" @3 e/ S4 q$ H
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了- B* N9 {/ B, b) }0 H; Y, Y
                            k = 0;; A, A7 D9 U! c  I! J) n4 v
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
: _+ X% ^0 l4 v                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);# B' a' n6 M# b, @; v
                        }
8 j6 O; o0 r! d" ?" Y                        else//输出暂时还没有改变数组元素的值4 P# l( @6 _* F4 [! z3 d5 Z
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);. Y- o# q: i+ b3 F
                    }, r& H: ~5 C2 r: }& s
                    else
8 z/ U: P8 J4 |  u* y, b- [                        i++;//数组元素为0,直接跳过,不计数。。。
+ i' }1 r) ^6 c  Y4 M                }
4 I  G8 ?$ F5 o* d5 Y# n; e) A 5 x( _" M# r9 ]3 o  X: ^/ S0 F
4 D5 T) q* J5 |2 a
            }//结束while循环
! a2 G2 a* J& \7 g- J- d1 x            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
1 _" E4 B, g  R! J& D+ [" s           # M) n. G, b) A& k8 [4 \, u
                if (numw[i] != 0); A( `% T9 K( Y& |
                    Console.WriteLine(numw[i]);
; i, e$ @) x$ t8 U) x; o" q           4 ?1 b: U3 B0 D
            Console.ReadLine();
; O6 B$ P8 [$ \; |4 l6 i        }% O! k& ]2 ~6 Q6 W/ o
    }$ N- R& p/ E7 [  v; K$ Z) A  Y
}! B- S% F3 p: b# |! \" w+ K
小甲鱼最新课程 -> 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-2-6 11:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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