鱼C论坛

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

猴子问题

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

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

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

x
大家好!
9 K, P* b& q1 @+ }  ]1 y这几天我在忙着编一个问题,我用了一种方法编出来!
5 v' o, T6 M* _9 x9 @但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!1 Q3 Y1 Q6 B! f' K
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
1 y  V* m& |6 _; `! U) ]2 |6 {: J/ @5 }- A$ a

) L- W! }9 T& R; B9 {
                            题目# z. }) o# T  I7 E( S% t
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
4 ]( R3 v! I1 x& Y( c. x% S第一种方法:利用循环链表
2 s# p4 `' @, s8 n#include<stdio.h>
( u9 `9 m: q( e2 W+ h#include<malloc.h>
& z8 `5 S) A$ r( c# b#define M 8            //共有8只猴子
4 X2 w) J# |2 W+ o8 l" {7 m#define N 3            //数到3只时退出第三只6 x# m! D3 r1 j- m( i6 q; X2 Y
typedef struct monkey
0 I+ F2 d/ ?) ^# K* f2 j{int number;
) b5 |1 u4 c) G( i) `" x& v" dint flag;
2 g+ U8 u$ L# ~/ `5 F9 U$ Kstruct monkey* next;
* b$ n* ]- H5 H}MONKEY;
9 ~3 q. @( I  v# kmain()
6 ~6 s+ Y( D; I) b- O4 i{ MONKEY *head=NULL,*p,*s;
, [2 G4 i6 a6 F. ]0 `" c. I$ ]  int i,sum=0,count=0;& c' _. j+ M' x, U
  clrscr();              //清屏2 _/ ?, h) s/ J. b4 s+ _
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
3 ^& y3 o) G8 \8 b5 A- y: d  p->number=1;p->flag=1;
$ y8 z8 D8 _$ I* f7 X, z9 [  p->next=head;( V, x8 A/ E9 X
  head=p;
) ?" J- }3 T" b8 i  for(i=2;i<=M;i++): u* f. L; m; g* B8 X% R+ V, A
    { s=(MONKEY *)malloc(sizeof(MONKEY));
) }% `% A5 o3 W: Q     s->number=i;s->flag=1;& M, ^4 T; c# g, h. ?* g% o
     s->next=head;# B- l6 m7 i1 k  b; Z: z
     p->next=s;p=p->next;1 y9 F1 N! N$ y) [( U
    }  y* i& [2 }, o! S7 ]
    p=head;1 T& B$ _/ h1 d; j: b& Q! ]! B# O2 i5 D  F
   for(;;)) V) R5 M) ~3 r/ Q
    {if(p->flag==1)8 t" J' o1 m$ ^8 c! L1 ^
       count++;
4 B# S$ V- @! z' ^& |* C; h     if(count==N)
9 h/ l0 Y% B7 l3 R. i+ l4 D3 i        {p->flag=0;7 U) o- W) K! g) E3 D( P; ^
         count=0;6 D+ B0 ^5 g3 R) a
         sum++;}
/ U% n6 ^. \- M, [, U     if(sum==M-1)
6 f" t/ C2 Y  e4 t        break;( b0 W& k/ b- `# f( l5 b2 f0 Z
     p=p->next;, s  ?: x& ~2 S: G# P
    }
1 A# q0 ]1 r. N# P7 W: Q    p=1 C7 {$ k3 D- h
    head;% {- A; n. X  E
    for(i=1;i<=M;i++)
+ s* j, _" q( y' l6 |    { if(p->flag==1)
+ R5 p  M2 Q. `2 N        printf("\t%d",p->number);
% t0 I- J! P. }      p=p->next;0 a* G0 h' g" S9 D) I$ M  o
    }: ]+ E0 D9 O- s4 e* ]; O; l
, |0 T: V4 V& f2 m

6 }8 T; z& G# \* r3 J
( \& C- |  A  B$ f/ u6 A0 J}

/ B$ q/ L! X6 c. G第二种方法:数组
, }7 C# t  ~( A. q) m2 P/ L#include<stdio.h>
7 s& C8 u( b2 C7 B9 D4 V* Y4 W#define M 8
6 E9 h( O6 |( u/ n" L) H0 Dstruct monkey
# U4 o% A+ }' E" }4 g5 s* r{int number;
$ |+ d& G- a4 e' K( xint nextp;
: H' r) }! X' {2 C}link[M+1];) A" j& ^/ Z3 [4 C9 n
, {4 C" B, k, }  J$ g
void main()1 c9 Y2 Y, L) H
{int i,count,h;/ S3 E/ U: i6 o6 Q4 D
for(i=1;i<=M;i++)' h2 x3 S' d" z, ^: U9 w
{  if(i==M), y# k" P5 `4 H0 P9 |
   link[i].nextp=1;
! q# P" L6 o' s( y8 c   else; E" E- o. {  `. O: X. C
   link[i].nextp=i+1;
0 @4 o" K5 h9 i+ w  link[i].number=i;& ~- n% G9 {; s* I
}& Z* `- T9 M7 o. Q9 N& X' S4 ]
printf("\n");
! [1 V, ^# J4 g. E3 l4 r6 ?: Scount=0;" T7 j" o7 l' u  Z, `* T' p
h=M;0 S2 k* I) {' V5 Y
printf("依次退出的猴子: \n");
5 S! F3 u) `1 O' u6 {" pwhile(count<M-1)
; S. C* R3 \7 q/ z7 F" d( R{i=0;# E8 _  p7 i/ a8 d- ?" _
while(i!=3)$ H+ m7 ?8 @4 C% K/ F9 ?
{ h=link[h].nextp;0 u3 m, J1 P. ]2 w, |
   if(link[h].number)
: G# [" p4 |- L& d4 h     i++;}) V2 k8 H! b* ?, R

2 S7 ]7 {  ]8 s! w2 d* Jprintf("%4d",link[h].number);
3 u" n4 I1 Y9 M' D4 ]: O% l3 j# r3 alink[h].number=0;
0 V: o+ g+ f3 \5 f6 C0 ^count++;$ f9 V* _" I3 i  c6 n# q& b) D- B, r- g
}9 V0 e; I0 Z  I; \+ N
2 W$ C' Z  p( q% j' r/ c
printf("\n大王是:");& O* J1 \$ h4 Q
  for(i=1;i<=M;i++)9 |2 a: @6 e* n7 U& D7 \  M
  if(link[i].number)
5 n) o) g1 x- |    printf("%3d\n",link[i].number);
, t& b- g2 V; H, \, G/ o, E8 _6 F  L( P* O+ g3 W

9 U0 ~* q* p* n' ^! p/ H+ |: E, T}

2 f* Y( k, u. H4 t第三种是普通方法for循环
+ ~- ], _* Q# H
#include<stdio.h>
+ L; T2 o, Z5 I* i) F7 S$ nvoid main()
2 F3 M( i( @+ T$ M- |2 e7 W{ int i,k,m,n,num[50],q,*p;
, G7 ^' ]' \* R# S* d& s    clrscr();! V; q& r1 Q/ ^3 \3 L
   printf("input number of person: n=");
  e5 d3 b& L  ~    scanf("%d",&n);& X. l5 U3 I' I
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
9 m% K) V5 r& @' T1 y* P    scanf("%d",&q);
: _9 i% Y% c) t   p=num;) D+ H$ B) Z+ ~2 V( N0 m# n0 T
  for(i=0;i<n;i++)
7 D* u! l& M/ q$ v% f& u    *(p+i)=i+1;
: z: z1 i* h5 s& h, k   i=0;& R/ j' Y! E, O" X- L6 u5 J: g* r
   k=0;
( \, G. L, p; ?+ ~4 ~) G   m=0;; W) b: B6 w% @) n* Q' N- G. H
  while(m<n-1)! Z& `+ U' U5 u7 z# f* q
   {if(*(p+i)!=0) k++;
# A$ L3 r3 o4 \! O! J4 `     if(k==q)
2 f+ i) m7 p- d" C# H) y9 X      { *(p+i)=0;
& S  O* G) R$ Z; t) {7 N        k=0;) j% ~8 k1 L, s0 n
        m++;
' h$ n/ D6 e% B2 u2 k# Q5 I      }) d* t$ p4 M& Q- \
    i++;: S1 g3 O3 {! j3 B( a6 N2 F% x
    if(i==n)i=0;4 Y2 I9 G- x7 X' _' @1 N  f
   }  v) R) e" s3 _& l$ }
  while(*p==0)p++;
8 B1 y0 k2 W5 x    printf("The last one is NO:%d\n",*p);
' ?& ]: G: Q) V1 }     getch();/ F' N- R- T( A  e. o/ {

9 F% k) S  b0 g; C1 E& @& P}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
# {, |1 m5 }$ \namespace 又费马达又费电2 h3 W$ S* K+ W2 {) W( g
{
3 v$ m" {! ]. p. y0 ?* a    class Program7 T) G$ }$ Q2 `4 H
    {
+ h# |3 I( |5 A+ G" E        static void Main(string[] args)8 ]* q+ y& t: Y1 q$ F/ O
        {9 R: m$ L) V( R# K2 ?) W( j& C
            int m, n;
' |6 e" E4 t& J" U* Q            Console.WriteLine("请输入数组长度");
/ {) G1 q0 Z, g1 L% |5 |/ V0 a            m = int.Parse(Console.ReadLine());//m为数组的大小7 Q9 [1 y+ A! P# z) _; @  v
            Console.WriteLine("请输入要截取数字的大小");7 C! C# x# ~+ V
            n = int.Parse(Console.ReadLine());
" c  C: V1 a* g4 @" K( C/ e            int [] numw=new int% S. o; |5 u9 \. i7 @; R2 \- C& d
/ ~# `! b% p3 a  q1 b: U+ C
&shy;&shy;&shy;;
/ g2 Y3 y- i0 B2 Y            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
( |4 j+ a2 J, g3 o7 [; a            {
7 [% K( y. s. X( M. u                numw[j - 1] = j;
% N+ Q+ e4 A7 N& I: d- I  p9 a            }
* M0 `6 U+ ?$ Z% j  p2 [2 d            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!1 r% H% ]" X3 R4 m0 O
            while (d != m - 1)
. n3 k0 ?) ?. b            {) ~( E1 h# W7 \2 f
                if (i == m && d != m - 1)
1 \. R% |+ P6 @- ?/ u; p2 J                {
, L9 |& P* C' a# O                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
0 T  Y9 a3 h6 R- B% z                    continue;3 i- N) g9 i- Z( Z/ U. C, D
                }- T2 l6 V" [* Y( b) v9 y
                else; S1 M. V7 c( E" T( z- C
                {
  A" i3 c( o3 g- u# ]! W                    if (numw[i] != 0)0 E6 M8 [3 p* W* V
                    {
5 J7 N4 i/ Q9 F# g4 N2 D                        i++;
6 D) i! O% T+ h, g5 M! t' A                        k++;
  x( A! `0 N/ U. f- }                        if (k == n)
3 w9 \: A+ r+ I; L8 j" P                        {
/ q6 n- ~5 e7 Z/ L& S1 \                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
$ x3 ~7 B  `9 R                            k = 0;
  R9 w- |& \) b7 ]+ _5 I) _              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1' v- `, c: S+ {/ {; B% p. e7 h
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; l+ Q  E6 _3 y0 {0 Q6 B! B, v* {                        }  t) a7 X: \! @7 ]' L: ?% X
                        else//输出暂时还没有改变数组元素的值% I* o, d, ]9 R
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
$ D  d% u7 C6 Z1 f0 p1 n                    }0 u' M6 b" ?3 t1 j
                    else& ^1 K: \; R4 A5 v9 Q' O: r9 j
                        i++;//数组元素为0,直接跳过,不计数。。。
0 j: p' y. c0 a7 q5 }6 Y9 z8 X                }: h/ _6 z" x6 m  d( \4 W- m
% A/ h3 O3 l4 y/ i+ V: d  q
& l' T; R+ z; C3 g' K# e
            }//结束while循环9 i8 d+ a' y/ X% G1 Q7 ^" k) \& S+ m
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦8 M) ?: u9 F3 T' L4 v7 N# t
           5 `8 [" j# Z. O. M& q
                if (numw[i] != 0), ?4 M6 E6 G0 U7 c! Z- {1 E$ Q
                    Console.WriteLine(numw[i]);( Z& {# K& D3 |
           
6 L4 ?1 r2 c- s- \/ z            Console.ReadLine();( V% F& l4 Z4 U1 Q$ _5 G( j
        }
+ k2 B; x& K2 }. X9 x- T: ~    }
5 T* j5 ~% y' I; m: J0 N}
5 R. u; Q3 x$ |0 K4 z
小甲鱼最新课程 -> 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-7-27 01:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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