鱼C论坛

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

猴子问题

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

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

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

x
大家好!1 Y; C! g# {1 n5 I  N# z
这几天我在忙着编一个问题,我用了一种方法编出来!
5 e6 K: _) j4 `1 l但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
9 c: a5 l6 h& l/ l注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 " n9 {- i3 f, N# `' T  p. h" B0 Z

4 M& J- |. F, e/ U& ?
; ^2 Z8 m9 W# U
                            题目
- v$ K. L. a9 v" }5 F/ i( z山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
0 c( J6 g3 c" X1 P" a第一种方法:利用循环链表
8 \, A) F  l( ]. P0 q( Q% s#include<stdio.h>
1 m, f8 r4 Y- X) ^1 P5 q8 V$ }5 F#include<malloc.h>
9 I, X% r% s( n( o#define M 8            //共有8只猴子
4 Y6 C$ [, h- q) N# o- b. i#define N 3            //数到3只时退出第三只
9 ?+ ^3 R% E3 o5 |typedef struct monkey
. T) Q- o! A$ F( a, s; O6 i{int number;
. T) X5 |7 I4 e  D+ dint flag;
' n+ q, M$ I/ Z. Wstruct monkey* next;
+ i0 o! J% E$ m}MONKEY;' m' b9 V; o7 K# K
main()
* s# u% n! I+ U# f) C/ I' c4 t{ MONKEY *head=NULL,*p,*s;
$ T; N- p+ _# `1 q0 K  int i,sum=0,count=0;- w& {- ?8 z" M1 |) [" h9 R! f) A* y, G
  clrscr();              //清屏
2 |- I% ?) ?  p' K3 E% K/ p% B" @: T0 S8 f  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存1 q, n/ R1 a& X, w2 H- G
  p->number=1;p->flag=1;8 `, ?+ k' X3 C% |: d: n  x
  p->next=head;
: h( @5 Z  w# Z3 E- j9 n# [  head=p;
( J& P7 G! J, g6 I  for(i=2;i<=M;i++)! E# z. f8 T5 w% S* B5 ?
    { s=(MONKEY *)malloc(sizeof(MONKEY));
: f1 `% @3 B% P& W3 Q     s->number=i;s->flag=1;+ X/ G& J3 U5 N& T: K
     s->next=head;. F# K: Q, v; E
     p->next=s;p=p->next;
/ N1 I& O) o% V1 U    }2 ~; ]4 Z6 |$ _, `4 Y3 L
    p=head;' Y1 e9 f2 s' L; H
   for(;;)! j! j3 R: d* x  b8 {
    {if(p->flag==1)
2 @0 o) ~7 I& ?- S1 h) R       count++;3 Q: b; ?  `6 D3 Y* n% t
     if(count==N): ?! T8 L, S9 B* ^
        {p->flag=0;5 \( ]: |& u/ v, B  y
         count=0;+ U9 V$ V* v! n' u2 I6 v' L
         sum++;}: B3 `* G. H/ S1 e
     if(sum==M-1)1 d6 u( A! r# X) [
        break;9 o9 D1 D: K1 r
     p=p->next;# d4 E8 E' C# y
    }
7 w3 F0 H' X- o' E    p=
. L$ `! Z8 d! _: o# P8 z# D    head;9 A# c7 ]. e& `8 I* C/ N& q
    for(i=1;i<=M;i++)- |; ~9 E, J# i. F1 {& v/ }* l
    { if(p->flag==1)3 I4 C# ?, V7 ^0 N1 z/ L
        printf("\t%d",p->number);
3 E+ E! m+ j; F: R2 X$ X' N1 b& k      p=p->next;
0 W! D9 r6 f, z! u    }
' M( B1 x" u7 Z" P5 s* X7 R% V& H7 O! c7 q- c

$ e5 A* D) S; ?# S. m4 m# A) Z* [4 M) R7 n
}

6 c; J& Y$ K7 W3 P第二种方法:数组
6 f+ y. Y" i! C0 y6 |1 t8 _5 o#include<stdio.h>  F5 V' `  ]' f. _. W
#define M 8% Y) Y% M. j! O8 |: z2 q) s
struct monkey
. h" X8 o9 j) _{int number;
0 [) }( i- q% b; s4 A* m; f  \int nextp;9 F" S* }4 g2 m7 Y" C7 v" v
}link[M+1];
% @* f3 E" O0 \/ o( c% K& }
+ `; I5 W& c( |7 [void main()$ F/ @# P7 v# F1 J- H) d
{int i,count,h;4 F( M* I( w3 Y2 m+ |( `3 p
for(i=1;i<=M;i++)* N; |0 j/ \( j7 g$ x+ o
{  if(i==M)5 s7 y7 |: U5 q' f0 {* A* S- \
   link[i].nextp=1;
; j9 U6 k/ I4 J8 m5 d6 B   else
' `4 r) ~+ }% c% T! W) ^   link[i].nextp=i+1;% ^' f' u' ~/ B- y& H6 M+ a
  link[i].number=i;
# ^% z3 n# }; Q6 I0 p! @}
+ `, V5 j1 {% H" z+ u! n8 ~" pprintf("\n");6 H6 J7 i3 M+ r
count=0;
! f4 X8 Z/ E; U0 E+ s" sh=M;
' e3 N2 \7 B! f8 x# K) t! Eprintf("依次退出的猴子: \n");1 p1 S! x  m" ?+ A. ]9 K# [; m
while(count<M-1)
( @0 C- \/ Z) t6 ^{i=0;
' F9 W2 R$ h; V3 O' Mwhile(i!=3)
! K+ H! [7 H/ A! e{ h=link[h].nextp;: j/ X6 C! G( [0 U9 H8 c
   if(link[h].number)9 _/ [; {& Z/ y: W/ r. E, D$ t
     i++;}
- T) O( R3 N5 S/ b3 d2 M. I5 c
: ]8 H- k" E. O! O) s! @" Y, aprintf("%4d",link[h].number);, v2 ]* l8 a1 ~2 @8 s
link[h].number=0;
5 p+ A' ]% ^4 g- s/ wcount++;0 ]; p4 s$ Y5 L! k1 }
}
/ @. N. o. ~! O2 L) X" A
- Y. z7 K# m2 v3 W1 P  qprintf("\n大王是:");
9 ^  `) K: T+ |2 H- p4 r# Z0 x  for(i=1;i<=M;i++)
  R% y& P4 r( D, a; v: i  if(link[i].number)' X1 ?1 E( [. x9 G5 f: Z% P9 E
    printf("%3d\n",link[i].number);# W0 X) v5 v5 d1 L3 e4 r( D

! O1 [9 s4 j  y( _& g
5 w6 A! f, s$ u+ g! o3 J}
$ _: a7 l- s% L# i# U
第三种是普通方法for循环
$ l6 k: N  r2 Q* A) c: x# ?
#include<stdio.h>* t0 M: j. j4 O1 o! l: }
void main()$ ^# O+ d0 ?# K" f
{ int i,k,m,n,num[50],q,*p;
# k: ?. r8 o  A! F    clrscr();
& Z8 Y, l2 z" h& i. a( M$ V1 w   printf("input number of person: n=");
6 z$ h+ O  \& t' S6 S9 j8 N    scanf("%d",&n);
. l0 H# L! i% R4 o0 r4 b: c: T3 Fprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
0 K; z: J5 o3 c$ x' [- v    scanf("%d",&q);
# {  o! K; n1 h  T9 g( d   p=num;
  h2 H+ ^( n" H2 b2 h1 Z2 v6 p0 [# V  for(i=0;i<n;i++)
, i: h+ R" h7 `1 r. T; t  a6 I    *(p+i)=i+1;  n+ b. ^0 c3 M
   i=0;
) \; [: U4 B  n   k=0;7 Y& ?; R6 f! X
   m=0;
' s% Z! v4 D. P& ~3 e  while(m<n-1)
% Z) S, U. c5 Y0 [   {if(*(p+i)!=0) k++;
# I( f' A+ w0 W0 F8 @+ l6 M4 |     if(k==q)
) b- Q2 o9 R5 A  X+ Q8 k0 d) H6 y8 N! B0 H      { *(p+i)=0;5 P# U% X5 K, B2 J
        k=0;
+ G* V% X3 {" k        m++;
! Y: L  T$ X& i9 T- ^      }
( f: h/ t+ w. e3 G; T    i++;( a5 S" H& k# @0 K) |
    if(i==n)i=0;, d* x# Q0 q! H% w
   }! e) W# s9 g  @# ^/ }3 ?, y
  while(*p==0)p++;
2 m9 V* ?- c& W2 G# q    printf("The last one is NO:%d\n",*p);7 \7 L3 |3 K( _6 g$ z
     getch();
& C* f7 b. b9 w* D1 k4 N: H* o5 A- j) p, N  q" r
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;8 J" B+ l  C+ j& |3 P. b2 Q
namespace 又费马达又费电
% q8 e5 Z! A& B6 e8 A" U  \{0 {+ p( ^1 I( R2 \. {8 v% S1 G
    class Program
9 j( S( S* b  o0 ]0 I2 o$ i    {
7 U* U: T+ H" p        static void Main(string[] args)# ^+ e: [+ ]+ @$ Q$ Q' b8 A
        {! f  q, G0 N7 ~& n1 g6 n
            int m, n;
) b. ^4 M6 O2 |4 i8 Y            Console.WriteLine("请输入数组长度");
. g* p  T4 h. N+ L* |            m = int.Parse(Console.ReadLine());//m为数组的大小2 m/ N2 t8 I  N. U4 [6 H: R
            Console.WriteLine("请输入要截取数字的大小");* ^# w# I4 [4 e7 n
            n = int.Parse(Console.ReadLine());5 e8 H$ b  _/ ]5 V, B2 ^
            int [] numw=new int
) x" i. p) a/ z1 `. }, K. l" \7 X7 l7 a6 R) T
&shy;&shy;&shy;;
" Q. H% J- {* N" W# ~- u5 a/ N            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
. ], e( @* R' w- A/ ^7 P. @            {" j5 F+ a; _. h' j% h+ O
                numw[j - 1] = j;, s" t* X: Y8 ]9 @: _; X6 _! [3 x
            }
& o: K: R7 T) x- Z7 K! `3 Y: l) o            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
! L6 w" [9 X5 B1 M            while (d != m - 1)7 ~/ e. K4 J, O2 w2 p
            {  p  [7 v5 n0 o) L# G- p9 ~
                if (i == m && d != m - 1). v1 x+ W& x6 J: u5 e2 a7 w
                {
/ _: J  L+ R4 G0 |2 U0 o                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!% ]7 _( z' P7 M* }% X
                    continue;
! x8 a3 q+ ?/ Q                }
' U8 Z1 @' W4 j3 D                else( [  B# `: c) k8 {# \
                {
3 A4 y! x) p8 w& C                    if (numw[i] != 0)
3 N2 Q( O. \9 p8 b                    {3 Q, ~7 h+ a8 T
                        i++;
& `0 @. H7 V4 K7 H6 Z) `                        k++;) H7 P4 ^; X2 ?" K
                        if (k == n). M% |% Q4 I9 Q6 A
                        {
! ?, M9 r+ E7 J& W                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
, D3 o  z$ r' t8 P; C( ^                            k = 0;6 m# G0 p. _5 H1 T  c5 f
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1) A2 |3 S3 P" J& s' y4 J* H
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
/ ?# \, J! H( W                        }
" ~' D/ `8 o, P5 |                        else//输出暂时还没有改变数组元素的值8 W, W% D  U* v: f' W9 m/ d3 i
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
1 y4 {9 z* P' U/ z9 n  {( P8 {, s                    }* D9 e& [  @4 U* A! U% o* [6 o$ a! e' P
                    else
1 W* u- E$ U1 N% N6 \; b- w4 {                        i++;//数组元素为0,直接跳过,不计数。。。. g- y9 U% T, H
                }9 }7 g1 g) S, C, m

7 L2 v0 J, X2 }
8 J- N0 @& \) O$ f9 b  b$ s9 X, N            }//结束while循环; I1 q6 ]6 z8 u- d
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦3 h3 \; Y; q) v7 K! {8 ]% d# l& n
           
: ]: |- p% _9 F9 n7 M                if (numw[i] != 0)
1 }: f8 G4 i8 y0 H                    Console.WriteLine(numw[i]);3 }9 V" @: [4 F# _
           ) u+ _  w- H5 [: T( X
            Console.ReadLine();
( I. d/ t8 t* V: x& s) H# g        }
4 B5 h" D! _- c0 o+ q6 B3 s2 D    }
' i4 W8 P$ O. b! _" d% F/ a7 _}
3 _6 ]$ ^/ P8 _. h  V' o
小甲鱼最新课程 -> 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-6-27 18:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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