鱼C论坛

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

猴子问题

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

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

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

x
大家好!
) y4 T+ U0 W7 u& v" F; b这几天我在忙着编一个问题,我用了一种方法编出来!
- H3 ?8 c) [' g! P但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
* y: t1 b3 @/ }( Q注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
- ]- {4 c! q1 z7 I- z$ Q* m4 Z" E( ?& G* b5 \. Q: ], f& k9 T9 R

$ R0 I8 t) c9 G$ u) D3 Q
                            题目
% `# i# }3 i5 R, q$ l# U' t山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
7 M6 Y$ n- \2 f/ C% E- y* U第一种方法:利用循环链表
5 f7 r) X7 E; j#include<stdio.h>
* N5 S" g  W. ]#include<malloc.h>8 g. E# [% E% g) J: y3 B
#define M 8            //共有8只猴子
! F9 z2 X3 S  g5 V" B9 U$ d#define N 3            //数到3只时退出第三只
! X  O4 _9 h! V: ^9 ]+ Gtypedef struct monkey
+ V5 m: c& c9 L3 R9 c$ a{int number;
0 m5 r7 z; b; L+ R1 d( S7 {int flag;5 o6 l1 n! b6 F- |' e* O3 L  t
struct monkey* next;
9 \( E8 Q' |4 g1 W: N% I}MONKEY;
# u9 Q; O/ I5 T+ Fmain()  @0 |4 s# Z- h- t/ u
{ MONKEY *head=NULL,*p,*s;
8 c5 Z9 J/ D- x# k4 E  int i,sum=0,count=0;! _8 W+ P/ E7 J
  clrscr();              //清屏* Z1 }, ^! K$ |$ T' S
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
/ `( I" Q! c$ B7 b4 c  p->number=1;p->flag=1;: j! S! ~- _& L/ _  x
  p->next=head;
5 B4 i. O0 p9 w4 V1 Q' q  head=p;8 Q, N+ }& n5 Q4 V# o( O
  for(i=2;i<=M;i++)" O. v  g7 |2 ~2 @
    { s=(MONKEY *)malloc(sizeof(MONKEY));
0 F' m- h4 z( o5 J, W     s->number=i;s->flag=1;' W; S0 l4 D* P1 c% l( p
     s->next=head;
; f0 [6 B, h+ v     p->next=s;p=p->next;
2 P: }/ \5 G" U* f6 p    }
/ `3 h1 |! h: A    p=head;9 [4 [8 o9 V0 a; |. [
   for(;;)
) N! }2 L; m- }9 B7 v. p" }    {if(p->flag==1)
' Q: X9 i# \; Y' b" t       count++;
( k; l- b+ i& h     if(count==N)" p3 @; ?8 @$ f+ H) u9 q
        {p->flag=0;
, |9 K5 R. C- N* ^) m& ~% w' u1 }         count=0;
/ c) D: B. b* o) V1 S         sum++;}
. J, S' d0 u! W+ S) _" n9 d# O; |8 U, \     if(sum==M-1): b5 i+ e" i" {2 z
        break;
7 f/ c: b6 t: C$ U4 Z) o3 R/ y     p=p->next;
% ~6 g/ c" V, o9 G: C2 R    }
7 U/ n1 [+ s& C  P6 _6 r    p=; e6 W- p/ v5 Q# @) }
    head;3 `5 D. ]7 z$ ~) g2 b' E" W3 a
    for(i=1;i<=M;i++)
" [) W) J3 B3 i    { if(p->flag==1)0 F7 T9 v: j" _6 ]: m, u$ ~1 F
        printf("\t%d",p->number);' @% b/ V8 ]  @! ]3 \/ C! n
      p=p->next;1 J+ [/ x, F! j# m- o. U
    }# j5 [5 ]  |  g0 x& W0 l1 y4 }

3 o) N8 u, l; }& ^* t% }; {& `7 I, }$ T* L3 ]: m! O$ U. N5 g
3 L% I- G& [! N3 p5 G5 e
}

8 F, @1 m5 ~2 l' W2 i第二种方法:数组0 z2 `  t; `3 s  L8 S2 V3 Y' r5 U2 o# F
#include<stdio.h>8 u0 S& t1 X2 U5 C& }, r
#define M 8
9 P6 t6 m- W! t) X! d; xstruct monkey& W5 f) P; l1 j( O
{int number;
+ h& x; c5 x4 Y7 O5 M; V9 Z, u5 ~int nextp;& S( C3 P, n  g
}link[M+1];
8 b8 F: u% S* @+ Z
+ L# J8 ?8 H8 qvoid main()
( D# l, o- t( j+ x8 [/ i1 W{int i,count,h;8 v4 R. I. C0 W  s5 h
for(i=1;i<=M;i++)
0 N! \7 p0 H/ Q{  if(i==M); p+ c& L3 d) |( F4 _3 s& x
   link[i].nextp=1;! d: C, v) p4 A- ^& f7 U7 p# r4 ?0 c
   else
4 Q& v8 P9 `- D5 i   link[i].nextp=i+1;
7 Q7 t2 p) R9 f9 j6 O) a  link[i].number=i;
  h% O! u% B* ^3 s}
+ ]7 h1 S' j* L# D9 g! g6 H! eprintf("\n");
, Y3 {4 `9 a' P+ y, y" Acount=0;" V6 `8 p3 V' s; _
h=M;
1 n3 a6 {* Z& E9 Y- ^' pprintf("依次退出的猴子: \n");0 p" g  H+ @' ^7 [5 H9 u
while(count<M-1): \/ i4 Z8 i; w9 U$ u* O: B+ b
{i=0;% z' ]% d5 l: v  ]
while(i!=3). P) R3 j8 q" o3 D$ _& f  ?
{ h=link[h].nextp;/ ?8 P* Z7 L) e, ?  _
   if(link[h].number)* O" A$ c! ?1 Z( ^# I
     i++;}
1 R( F) c9 N5 T+ K' w3 u; [
" B" ?1 }# H2 b1 Z5 wprintf("%4d",link[h].number);- K/ H; H$ d  s. N
link[h].number=0;
0 o8 H+ T! m0 e7 }0 W/ ^+ rcount++;4 H* y$ o  _0 [- [# z' w% N# d
}
9 n& J. M1 J9 H7 h, [* a
# ]& [! q- {. bprintf("\n大王是:");
' v" P0 k2 }5 _+ J& N) ^8 g% Z& n  for(i=1;i<=M;i++)
5 e4 g% p2 p6 o. B6 Z5 T  if(link[i].number)( t% M+ ^8 {0 ?' g6 b1 j
    printf("%3d\n",link[i].number);
  A4 x' O) M; f9 x( j1 ~; k
6 W. o& H- r5 V& B' F1 @5 F9 Z# @- a8 {
}

% w( `) j6 k+ f第三种是普通方法for循环
# m/ f/ J" |* [( d- n
#include<stdio.h>/ S/ O4 O8 W% o  K& `5 e+ w
void main()
" Z% q3 P4 w$ ~, s6 h{ int i,k,m,n,num[50],q,*p;
& m2 P. s8 G' v- ]# X5 n0 Q    clrscr();
9 z. n6 Z3 L+ z   printf("input number of person: n=");) [# i, d. \. u, ?) z$ O
    scanf("%d",&n);
$ Z7 x6 ]7 o; y. N9 s8 [; Hprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
% M9 F2 t8 V, D  N0 S    scanf("%d",&q);: J1 d8 D6 t# C4 k$ b2 Z( j6 j* x
   p=num;
0 ~, a' ^% g, Z/ ^  for(i=0;i<n;i++)
8 }! E2 c9 e0 p    *(p+i)=i+1;$ w0 ?/ q7 ~* Z$ T: V
   i=0;8 p, X2 F3 H' ~9 E2 w
   k=0;
; b6 L) M2 o6 f8 ~   m=0;- P* a. X- H, Q5 k# X4 V6 D0 b
  while(m<n-1)  Y- j5 x6 g+ {- H
   {if(*(p+i)!=0) k++;' C" c# y( y7 j. K+ U6 `; U5 ^5 e2 @
     if(k==q)
1 u5 g1 Y7 k7 P6 m, z: H      { *(p+i)=0;% F! ^$ Y6 @* p9 j$ t/ O3 {# |
        k=0;1 u* ^+ ~0 z$ f- ?3 J8 W
        m++;
$ ~) q5 V1 o! d) e: h+ v; X      }" U, M! _2 n% B$ G$ x. m6 @
    i++;
6 C0 i& w3 `9 c4 t  ?! h) Y    if(i==n)i=0;# L" j9 ^( V6 c6 i
   }
! ~8 A; u3 n3 N- o' t  while(*p==0)p++;
& @/ S3 y5 @6 v; ?% L& F8 J    printf("The last one is NO:%d\n",*p);
6 l8 [) v! T: m2 f% |+ V' p6 g- I5 j     getch();) d! E/ C% {' L, z2 ]" f6 _+ P# V$ S
$ j! b3 w1 B. g, `; N' }+ {
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
& a9 H2 W3 g3 R/ Jnamespace 又费马达又费电
( I, q( B8 b- S7 J$ j2 D: l{
7 o* w3 J/ E4 q8 {# b+ W3 O2 u5 p    class Program" O: ~1 R0 o8 w" t% m
    {4 r: o# q. ^1 J: J3 S; b) Y# r, x
        static void Main(string[] args)& s. z- E# K' ?6 }1 E/ E: z
        {
% p  i$ ^, C( {            int m, n;
7 |' M* Q) j" B0 y" v7 [            Console.WriteLine("请输入数组长度");
) V6 h% @2 [6 M. v6 [; u            m = int.Parse(Console.ReadLine());//m为数组的大小6 e: t/ i* g7 H, U
            Console.WriteLine("请输入要截取数字的大小");! Q( t# I8 I! N3 D) m
            n = int.Parse(Console.ReadLine());
' f1 K% e( ]* r" M+ p% }. @            int [] numw=new int
9 f* N: A" w( x: N5 F: T7 n* w" I! H/ r8 F: F1 g9 A5 n4 N
&shy;&shy;&shy;;
# P5 [. u' u. l' e8 d- K& X            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
) y/ b5 V( D+ ^+ S            {
5 d( ^3 o# F5 \! |; U6 n4 j                numw[j - 1] = j;3 R- E- q) H+ w! P& D! u
            }
, Z. k) b! r, u' I            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
: \, H7 C9 I* |9 W5 j1 Y- o6 e2 `9 ^            while (d != m - 1)
! W/ ^% l! l" u! D# i7 y0 ~7 X2 K            {) i# Y& i5 X7 b6 b. ^; V: v
                if (i == m && d != m - 1)& u' h3 }& n3 {2 I! Y5 w2 J
                {- C3 w" v9 w9 w. A5 v3 }1 l
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
2 ~0 B6 y# J+ p& W                    continue;
+ U5 u( J- ~5 H4 m" m+ [7 R0 r+ @                }
# M3 g1 ]( T; K9 j                else
, i( s' N$ V! y8 J8 I0 `' l                {
, K2 o  |6 v% G, _6 [+ f" A                    if (numw[i] != 0): x( e3 ^  T4 A6 ]/ ]
                    {& r5 h2 x& S7 G% T* `
                        i++;- Y4 m1 j; _! v, N0 r, Y
                        k++;
1 G: z* v  M% {: p; _9 X7 ^# _) W. i                        if (k == n)7 A% V! V( X) s8 a0 w! B0 ?" J$ e
                        {. k$ N- K5 a5 K( [" t+ [3 a! F5 ?; ]
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了" H! z9 ^6 T( C* f
                            k = 0;; j2 Z0 e- M  S- X: h/ @1 B
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
3 ^* R3 @+ v) L8 j" X                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);1 Y! K7 s$ ]  H4 p+ b- ]
                        }" C; M$ t. }- x; b, t" `
                        else//输出暂时还没有改变数组元素的值
, M0 o7 W4 |+ n6 o+ b                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);! [: g6 t4 t8 q: `- [6 N7 W
                    }* @9 C5 E& g2 Q# |8 H& h: k
                    else/ a5 K5 M" E; |- ?
                        i++;//数组元素为0,直接跳过,不计数。。。# Z, C4 ~6 Z: e
                }1 f$ Z8 ~: j8 o
" }- z5 ^0 |! v0 s$ k
/ X: b' c! ~4 D. [# h# B9 ^
            }//结束while循环3 B  E# L. v4 Z# `
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
% q" G) L4 d! h4 }           
3 h9 |! u  V0 A, N) v+ U                if (numw[i] != 0)
# T6 ~3 Y, p8 L: V! L- c                    Console.WriteLine(numw[i]);7 f+ k6 S" V5 Z; i
           
) l; P2 P9 v9 n6 V( L            Console.ReadLine();6 F7 }8 T. k/ f  n; P1 g
        }
- |: {7 W$ t% X5 G3 i  E    }2 l) |3 S& [$ Q- u: X  H
}
1 X. K+ Z% L9 D2 n
小甲鱼最新课程 -> 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-15 06:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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