鱼C论坛

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

猴子问题

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

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

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

x
大家好!
4 ]# m3 u* P. S" v; v这几天我在忙着编一个问题,我用了一种方法编出来!
  ~- a3 y9 U7 v但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!) ]( L% J! _2 G. Z, U# Q
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ! i$ k( Q5 _, Q
0 f6 R1 Y5 N$ o0 w0 s; U

+ Y+ h: b/ W+ g; A( j: c
                            题目
1 H5 x- e5 h: O$ k; x  z! C山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。' e+ Q0 T1 d; S+ K
第一种方法:利用循环链表6 D# R' b& l9 {7 Z" D0 ]6 h
#include<stdio.h>
- e: D) ~' R# W#include<malloc.h>- X' R& O9 X; v: @* M; W
#define M 8            //共有8只猴子4 W# K% s5 N5 m/ z$ o: d
#define N 3            //数到3只时退出第三只& R3 i6 R+ t/ i4 A
typedef struct monkey
" ^$ R5 o: H' }0 ]) {- s" s{int number;
8 @- d6 v2 V  d' h# K& T* W! @/ yint flag;
! U* D, V- g' p+ i+ Gstruct monkey* next;  k& x4 _7 d8 R; |$ Z
}MONKEY;% p  R0 g; H! Y7 [6 o, k! z& \: e
main()
( I. P) x" d  Z$ x{ MONKEY *head=NULL,*p,*s;
( g! L, v# @0 Q; l" Z* E! |" A  int i,sum=0,count=0;
% B0 I5 E1 C$ l1 \' h  clrscr();              //清屏
& |. K: ^: L/ B* ]+ I* Q# F8 c% S$ m  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
1 t1 q2 i& K; p5 l, k+ H5 p4 i  p->number=1;p->flag=1;1 ^% Y% D% D3 B* G# [
  p->next=head;8 f$ P* S  i& e$ w% _3 T9 o
  head=p;- [; g1 T( t7 I/ @$ ~. M- l5 g
  for(i=2;i<=M;i++)* i) {  X$ t0 T% M
    { s=(MONKEY *)malloc(sizeof(MONKEY));
# f( D5 f1 E, h$ M     s->number=i;s->flag=1;
1 J9 d5 z1 o: h! `" `     s->next=head;
  v; i$ u5 U  G* I4 H     p->next=s;p=p->next;7 h8 B; V6 r7 }! l9 I8 F
    }
& [( E2 b7 c+ D' D5 e1 y    p=head;; q2 ~: e6 _- {5 n! n
   for(;;)
0 o2 k3 V: ^! Y; R2 h; w4 x: E    {if(p->flag==1)
5 G8 h: w" S  l0 r! T' Q0 S       count++;5 ~0 Z7 q; `  p
     if(count==N)
3 B/ D! L) \, ^0 o/ B        {p->flag=0;* }" J- z8 L5 `
         count=0;
/ E5 W' X, @3 m         sum++;}
. D$ w1 h2 y1 _  W. W     if(sum==M-1)0 d. X6 Z( g) a9 X% R. H
        break;
7 i+ d: L9 a$ ~" ~* Y" [     p=p->next;
" m4 p; X, x% x- C    }& Q" H, }8 o1 Z1 {
    p=/ |) A& z& `" F5 P; u
    head;
" L2 P; B9 x3 i! E$ c1 d3 \    for(i=1;i<=M;i++)
, [/ ~' H5 X; S: A8 M( J# K7 ?    { if(p->flag==1)& X/ `( J% N- l2 [
        printf("\t%d",p->number);( T3 u- s( v; O& D$ `
      p=p->next;
- L4 C: I. ^6 {: b) f3 s    }1 T# r: |3 a$ g* Y) t

' @" }3 A! ?+ J7 b- W+ k5 @& K4 ?
/ \6 K) u. |6 a) Y6 _- j8 l
8 x; I* F9 d4 v. i}

+ Z  z! h* P$ n! B0 V4 t, P: P第二种方法:数组
1 R! ?; I- E2 u* Y- g/ w. k2 F8 x6 X#include<stdio.h>, R+ r" _; ]2 g
#define M 8, a+ f7 @5 o# m- j; Z- m
struct monkey
3 @! A& G- g5 u8 g8 n* X{int number;3 D0 y) V" I( ?
int nextp;& D% B2 |# g4 Z% E, d
}link[M+1];
# J, H; [5 u7 Z1 o! c- b2 X3 V: |9 b
void main()7 w/ }+ T( z* c+ \  s
{int i,count,h;3 ]3 D" }/ c: w4 w# Z" B! s
for(i=1;i<=M;i++)8 H$ ]) E" Q' j+ f1 I
{  if(i==M)
3 c3 y" B5 v7 l, M7 [5 e, e   link[i].nextp=1;4 t/ M; m- L5 H% d
   else
7 v3 k+ y2 o( e9 q* X: {" y   link[i].nextp=i+1;
3 R% p4 h4 t3 P  link[i].number=i;
1 k; U6 A" Z, I$ I}  A! s+ F0 \  Q, Z' m8 g5 |
printf("\n");
. \2 B+ L% g  H+ _: g& k/ Rcount=0;
$ S# z* @  L8 S2 b" hh=M;: S7 e3 `8 O4 v8 y* g4 W$ U
printf("依次退出的猴子: \n");
% j- c. z) t* g( f7 iwhile(count<M-1)1 g+ t; s' K" Z! ~* f3 v
{i=0;
, i( D& d! ~% P  m& \, Rwhile(i!=3)
& K# |- X9 D+ @8 B{ h=link[h].nextp;7 \5 ?+ k( w/ ^& r" O
   if(link[h].number)
8 o' C! z: v/ O! d9 D     i++;}& [+ B1 q- V) j9 x! @4 o- f

# T' r& L: R7 B) W) k& Hprintf("%4d",link[h].number);1 o, s* [  R& [2 p4 T- o
link[h].number=0;+ H) R4 P0 S  H8 r' F; E
count++;* m0 a7 N+ \8 W+ h+ b8 [
}
0 `  y- ?" Z, Y4 j. }; H" u
% T. ?! s! G9 Lprintf("\n大王是:");
' n) V2 w# W1 F/ }9 t# T0 J2 a2 `  for(i=1;i<=M;i++)
' \7 P( a9 u; ]3 O+ n  if(link[i].number)8 ^8 }# g  j7 u9 e' Z1 Z% V, O
    printf("%3d\n",link[i].number);
7 X3 @4 s& a! B+ R+ h$ f& b  p! a$ y' G# M1 d4 A% a1 ]

' ^$ q' ~1 x' g& G0 m* C}
* D, m: T: i( K' ^7 ^6 P& H
第三种是普通方法for循环
2 R1 V7 w2 ~) l: U6 O: x& K9 S2 }
#include<stdio.h>
1 A9 c# P1 V% O' ovoid main()
* h* F  w% p( X  m0 A$ E9 C6 c' D  q{ int i,k,m,n,num[50],q,*p;( ^- J) b/ L! K5 w% ]% e
    clrscr();9 B9 c- f/ W# Z. [& t
   printf("input number of person: n=");
0 N- Q* W! |* N0 w1 a) D    scanf("%d",&n);
, L4 H% _4 M  mprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
2 A2 M! M  Z$ C* y, K% r    scanf("%d",&q);
: a: @5 U  {+ i: U   p=num;- Y5 ]7 T3 B4 g; |+ T( d+ F0 Y) w& A
  for(i=0;i<n;i++)! K- W( K; e0 C% p% T7 H- c
    *(p+i)=i+1;( p, |7 o, L+ o' ~% K1 F# A5 B
   i=0;
$ S9 M  ~2 c2 x$ \3 @% i7 p   k=0;8 o/ Q2 \, `3 H  d) J; p/ L: f9 ^
   m=0;& m+ H* }' g; b8 V+ N* K
  while(m<n-1)
! E( R& x) p" S   {if(*(p+i)!=0) k++;
& x; M4 L" w9 K/ }" J     if(k==q)  y) l* L' j1 @
      { *(p+i)=0;5 ?4 L7 M5 Y6 P) i9 h4 Q3 n+ w
        k=0;2 o$ N& e% o0 ]- z* m
        m++;
0 x& J: G* ?+ j      }! U/ O2 J1 E) C& V0 Z; V# j% Q) |
    i++;' W. \( a8 e. E1 [# A4 ]
    if(i==n)i=0;* b- T6 G, v0 u6 I  e% g, k* J
   }+ \; P3 K) N3 R
  while(*p==0)p++;
  j6 f2 j$ |5 `" W6 |7 `    printf("The last one is NO:%d\n",*p);
7 ]7 ~$ G4 M/ ~) L) a     getch();0 D7 i0 O5 ?: i7 k2 `
, Q* k- h% u) f! G2 g& Q9 M
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;6 H" b+ {  M+ ?* d# x- S& i
namespace 又费马达又费电
5 s5 y4 j) V5 x* R7 M{
& ^. e8 s8 ?8 O& u8 V$ c' a    class Program
9 e9 {, I( }( A    {* b1 U7 q0 C$ `$ q* K$ i* G5 i
        static void Main(string[] args)) h. T9 W2 Y. r6 Z
        {
* j$ X" x7 q" J& ]! E/ R            int m, n;5 u2 k! Z3 G" y3 V" I( V
            Console.WriteLine("请输入数组长度");7 Z/ U/ i/ a0 t1 A
            m = int.Parse(Console.ReadLine());//m为数组的大小8 m3 R; X0 S. o9 j
            Console.WriteLine("请输入要截取数字的大小");
$ S7 P. `( b* _* J1 y' D4 F: p            n = int.Parse(Console.ReadLine());
$ s5 L- b2 ?6 v1 D. R+ M+ h" R( ^            int [] numw=new int! ^& Q6 M% E9 W) a
7 i3 t* K# H+ R% e
&shy;&shy;&shy;;
( Z* m/ W7 U4 k( p: _. N8 j            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数& H& d% o2 ?3 x
            {
/ J3 l3 m% \  u5 f5 K1 w* C8 v                numw[j - 1] = j;- F# m; e0 Z' ~# L) W
            }
9 z9 `- l( P5 ~            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!6 N+ V  d1 B. v0 P1 z+ Q: [# k7 J
            while (d != m - 1)
1 L) a# K4 g% ?            {% q1 K1 i: n3 U3 C# e; _  U; f* s5 D
                if (i == m && d != m - 1): H# d2 Y7 b/ I! P
                {
0 z, O% B, N6 N9 m" D  B" X                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!: g+ ]7 E1 b7 ]/ R( T
                    continue;
0 K: R5 z' U, s6 I                }
" g3 E7 U0 `" j# J                else! m- h9 T; m, j% a; A
                {' A& }4 s5 k# p6 V- W
                    if (numw[i] != 0); h6 Q6 K  t0 R" B- Y
                    {
! M7 K) I: u, n1 Y) Y2 l                        i++;  X$ q9 U7 J2 U2 ~' W) S$ y" z
                        k++;
( i1 F( P2 t2 X' y  E/ h4 n                        if (k == n)
" W+ c/ N$ O$ ~8 ], n                        {
, H( N6 M% \( A6 a# w0 d, S                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
' Q* V# A: z# j3 k                            k = 0;" x5 h, d- M, ~# G3 i6 K
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
4 F+ Z) K! Q8 K3 `                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
+ G# T1 H7 h4 z  a2 h9 _                        }
+ z' O1 C" q) L: ~/ ^                        else//输出暂时还没有改变数组元素的值
  b) ]% k1 ^- _8 t2 M& J! p                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);6 N1 @" F- e% Z9 d, _
                    }3 M6 [/ _5 A; C5 i8 i8 ?
                    else
' R2 d+ a3 |$ M* f, j* _+ F* q                        i++;//数组元素为0,直接跳过,不计数。。。
( K2 A- s) S9 U) E5 @                }0 g. ~2 P- y2 H( s& O7 D, m  W
1 m  B( Y, _+ v! q1 s9 S

+ e# \% s. m, D4 q+ s0 {            }//结束while循环
4 f# c) t9 a0 [% e. M, }! u/ k            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
/ x8 J- Z& u% ?0 U           ; H$ U. \0 f) y3 H' z# w
                if (numw[i] != 0)3 |* ~# s  u$ S& s% h/ t# V
                    Console.WriteLine(numw[i]);
0 a1 P4 y4 a! e5 `6 c$ m  E           7 Q+ A, W9 y- K3 d& _+ L( Q
            Console.ReadLine();) s- o/ \, j8 [  S. i3 C3 G
        }
+ ~( [& E8 O/ o) V: K* `% E    }
3 w  J. T+ G1 y* W# M0 |1 |}
9 Q# E. q2 J3 A/ G0 j. m6 |
小甲鱼最新课程 -> 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-3-13 01:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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