鱼C论坛

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

猴子问题

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

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

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

x
大家好!
6 E# m: ~: J' g$ }! G! Q这几天我在忙着编一个问题,我用了一种方法编出来!  c+ r; l/ I4 l1 X, e& X+ f
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
9 w. [* O4 u7 E+ \注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 " H  S& N5 |6 s2 g0 D6 T

' j( B3 d- |9 a- c" A+ r! m5 \4 A" i! \4 M+ X+ n, V! t. c# ]1 N
                            题目$ ]9 x* I$ C# J- M2 _# f
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。/ d% {& ^1 j1 A. \; r
第一种方法:利用循环链表$ n  a; r: d+ B8 Z7 K
#include<stdio.h>
3 U0 d5 M5 w3 d7 a+ R6 W- m5 v* @#include<malloc.h>
0 @- e9 U( ?/ Y% n7 X* ~# v#define M 8            //共有8只猴子$ U) i: Y% w& v. B
#define N 3            //数到3只时退出第三只
$ p3 u/ F" O) ?$ Vtypedef struct monkey
. O7 K8 O1 y# T2 @, D2 r{int number;
, l- T+ \: ?/ O9 X. t7 W8 cint flag;2 s* j$ U( R, e
struct monkey* next;+ T* s/ r  ?4 ~- w* J: ]  a
}MONKEY;
, V% N# K# N3 D- H& n2 |! Z( tmain()/ d- q4 o2 H" b! U( T* [3 j
{ MONKEY *head=NULL,*p,*s;2 k$ _4 V/ H) ]) I$ F  [8 j- R
  int i,sum=0,count=0;
4 u; {9 p" @2 b! w) ?  clrscr();              //清屏
  T" B( b5 t4 J) ^  N$ G( m  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
, L7 v. F+ E5 {* J6 R( ~6 T. E7 ?  p->number=1;p->flag=1;
# L2 u+ r7 ^& a0 b3 ^& [) {/ h3 S  p->next=head;2 W; n% b; l3 e; i% ]7 i# b5 X, I7 h, M
  head=p;$ s) S* p9 q7 q8 _" g6 x. o
  for(i=2;i<=M;i++)7 w: f' [% n" O8 \
    { s=(MONKEY *)malloc(sizeof(MONKEY));  Z6 @! K- l1 B; u. E* ~) c% N
     s->number=i;s->flag=1;
( L: S6 m, Q5 U1 @; M3 X     s->next=head;
1 d0 O% e& {5 D  H1 C9 b) j     p->next=s;p=p->next;) }6 n. Z. N& R, S* r
    }
" E3 K' R# s2 U, O  N; i    p=head;& C  k6 E8 J6 p8 H. i) |
   for(;;)
* W- v6 ]- D8 _5 f    {if(p->flag==1)* g+ u5 E- J( s9 D7 U/ X
       count++;
2 }) y; F$ C; l1 h. v, l6 q     if(count==N)
8 A2 N  U9 i+ N0 L        {p->flag=0;; s8 \: v" Q3 B$ f
         count=0;4 {. l7 \3 j" m5 c
         sum++;}+ s( `: T0 c# G; X1 J* d; Z
     if(sum==M-1)
& ^- q  b+ b0 R8 S        break;
+ c5 q: f: X4 O" R! y0 t: ?( o     p=p->next;
: N0 _% j4 z3 x, O; T7 H* B. T1 Z8 A0 D    }0 M, p& c8 Q* N/ m% \. O* I
    p=
: N, a* M6 b: s# X; N6 }2 N    head;
8 d* [0 I% p, J7 _- k6 Z    for(i=1;i<=M;i++): D: q) p# \% Q6 b: V% W
    { if(p->flag==1)3 C8 N# c6 |* }
        printf("\t%d",p->number);! P8 Y- V& Q0 ?9 O
      p=p->next;
( s8 Q, G8 c7 [: {+ G+ z. P    }
: X  v4 y4 V2 \) A/ _% ]3 D
3 ~9 Z! `3 E2 }& {' I4 l8 ]
* ?: T( T9 q/ ^# U- s7 c# e) s. K" K
}
5 ]0 o2 t) w) J2 D; h0 Q% D
第二种方法:数组5 u4 x' P% m, W* S9 N  b4 h' h6 O
#include<stdio.h>
1 X# `$ K  H; q' a0 I/ k4 k7 m- k% ^#define M 88 A* r$ W* }) l: H2 n" e
struct monkey1 S9 b4 i4 [7 A: X
{int number;9 U0 l( o% `1 S5 c' i2 t1 f
int nextp;2 p) a9 p- a; x
}link[M+1];) |! a& _- b# X/ i

' K$ u; F7 [6 |void main()
9 i; F  H5 E+ b{int i,count,h;2 ~% {/ E* D  ?1 V' G. Q& ]) v# b
for(i=1;i<=M;i++)/ ?+ u9 W4 C2 b; O  W
{  if(i==M)' ^5 Q* U- [4 h3 k$ x. R* ]
   link[i].nextp=1;
3 j& a1 P+ M0 n: T' A2 f/ v   else1 Z" S- P6 v! h. k
   link[i].nextp=i+1;
  v5 c: o9 _: z# H; a7 o4 k  q: m  link[i].number=i;& J& \9 A1 v; F, \- S" L8 P5 }2 D6 y
}  Y9 m8 w( P+ h+ `
printf("\n");
# I: \9 N' ]" V5 Acount=0;
4 G& v6 b6 a) Z! H9 m8 Vh=M;0 P; ?% ~" X4 r0 X" D* R
printf("依次退出的猴子: \n");" M" Y2 \& s0 l2 N! o9 l9 \
while(count<M-1)
4 e4 m7 a4 z9 ?{i=0;: ]  T9 Z$ I4 I! e2 {
while(i!=3)* s3 l: U& ^: Q/ E! U' F$ g
{ h=link[h].nextp;
2 e5 T" t) U0 y" Y  f* ~   if(link[h].number)
3 P) O% {& V: f& x5 i, `     i++;}
9 P# z* ?: R+ I0 ?9 z3 w  Y: [- R+ F9 w- f$ v' ^6 @4 G4 E. q7 |* R9 K0 G
printf("%4d",link[h].number);
5 b8 v& E, y* Mlink[h].number=0;
! L1 Z& Z5 z' E1 F/ a. t& z. b8 E6 ycount++;
" {& {$ y! G) V; P}
4 O7 X* [0 @" `  I0 B* O+ }# G$ ]2 Z3 C; H2 I. j# i+ H
printf("\n大王是:");$ _% G! `' P! s3 d3 {: X+ ^
  for(i=1;i<=M;i++)0 P6 w8 l* Y, O2 L7 V0 R& H
  if(link[i].number)  e, U- L; d/ `4 i' ~
    printf("%3d\n",link[i].number);
. j6 F( u6 V" K0 z7 T2 T- |1 P) R- R1 ?9 R& k
1 u/ u7 S" F% Z! d! z( C
}

' O( M9 I& {2 {3 H% W, o第三种是普通方法for循环

+ G0 K+ Y+ W& s) Q2 x' ?" q#include<stdio.h>
; w+ H" N) v, U8 N" avoid main()6 u# M# Y, T* u5 K1 n
{ int i,k,m,n,num[50],q,*p;
) v0 P  ?* v9 ~! j# F    clrscr();
5 q9 [1 D8 l  I/ y   printf("input number of person: n=");
# ~5 q% d7 f9 {( j    scanf("%d",&n);
$ i: @* z7 s' ^# j; }printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
) b% @# Y. g7 B: E5 o, {    scanf("%d",&q);7 R8 {0 v, v0 U- T$ ?, R+ A" ~- t
   p=num;
: [2 _  _3 |) K& M; n0 N3 B  for(i=0;i<n;i++)
5 l5 q* t0 Q% f1 X& Y) }    *(p+i)=i+1;) J4 F7 K6 P& d, E0 `' _9 O
   i=0;( n: V: Y: c/ Y6 u) S# r: `
   k=0;5 @8 f9 A) x0 X% }/ c
   m=0;5 U; E7 N8 E+ i7 w# X3 B, n
  while(m<n-1)
# c5 P& o. I6 \, x* g   {if(*(p+i)!=0) k++;
% ?! T% X7 v# [+ b  l     if(k==q)
$ i  `0 ]( E/ |      { *(p+i)=0;/ r/ W  l( Y. o6 K/ ?, j. U
        k=0;
- y9 \/ x6 ^( ]0 L* j        m++;
( g8 n. q1 m7 t      }, F% h0 J- w9 Q
    i++;0 x" f0 ~/ L% U
    if(i==n)i=0;
: c* C) e% C/ y   }
& A8 z3 o$ u# |  while(*p==0)p++;
( |+ b8 z- F% N' m7 h; e    printf("The last one is NO:%d\n",*p);
" B. B% D; D, k5 H; d1 x     getch();
- [! W6 U7 i- x! v: M
' Z) d- ], O  p0 C" G}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;% G9 e3 I0 |4 A% x6 {( L" w5 c( T+ L
namespace 又费马达又费电
& M( Z5 x; H7 U' L9 o1 w{
7 R8 T, i, G. H0 p4 V+ }& h0 {    class Program4 E% _* _2 d3 b8 r, R
    {
; t% H  q6 Y( r1 a        static void Main(string[] args)
% A" e6 Q' T' P- e( Q' C7 u        {; S5 _/ |2 J' r: R
            int m, n;$ y% a$ i+ r4 i. o
            Console.WriteLine("请输入数组长度");
: {* K) h  u7 u            m = int.Parse(Console.ReadLine());//m为数组的大小
7 f) A' [) o; n9 e            Console.WriteLine("请输入要截取数字的大小");7 {1 }3 P' ^. y* H! x. ~
            n = int.Parse(Console.ReadLine());
2 k5 y# I, _0 f( ]4 g$ [/ b' s            int [] numw=new int* w+ _4 F4 `' z

& p6 Z9 V/ l3 c3 n0 o9 Z&shy;&shy;&shy;;1 F$ p" v/ E! M0 l* y9 D
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数8 N1 t7 r" g3 |7 [
            {: J# U& _# ^1 x6 Z- y
                numw[j - 1] = j;2 s0 b2 I' j. z' {5 I- s
            }
" t3 V! s0 h4 [            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
, p6 S9 X; `; A) X' t, ]) J            while (d != m - 1)
( Y) I% C1 ^# X$ r6 b- f# V4 z# R            {5 |3 `+ b& `' Q* F  N5 ]
                if (i == m && d != m - 1)
6 P8 D: L" `5 Q3 E6 Q. D  ^' n                {
4 g6 d4 M' {/ T, \                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!5 j& `7 i3 I+ N8 m' A( y
                    continue;
' P! k2 W1 z  ?9 q. a- x                }
: T! G; ~( h; l5 Q, P                else
3 o4 T3 ]) R( P$ k* u                {- E: ~) v# k0 Z- }* Y3 c* g6 w" s# O
                    if (numw[i] != 0)
3 b6 g5 D$ H. K5 r$ I/ S! F                    {
; c( @8 g/ O3 z/ y" [5 W: b% G                        i++;
4 y# \1 ?' Y' o  E" T0 k# F1 ^                        k++;
& P$ X' o2 p- T9 I; v8 D                        if (k == n)+ P) R9 x/ a1 v# n- [- E
                        {5 _- n! o: G2 H3 P# ^2 _. `
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了2 U% X4 @: L+ F
                            k = 0;6 [0 {) S% s% l( Q7 X( t
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1- G0 c7 C5 H  H! R8 w
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);5 U" H6 y: ^+ W- b& q
                        }
7 f& h' P+ v6 ]) b+ k: d# E) p# _/ S9 H                        else//输出暂时还没有改变数组元素的值
5 r$ \( @# s9 w3 e* o                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);1 R% ^, N% p- s" y! T8 {4 V
                    }
! S( H5 Z* [( ?: a                    else9 g' v3 p( k. a- ], @) [
                        i++;//数组元素为0,直接跳过,不计数。。。; s6 V4 ~3 d" w& r3 s& q3 s
                }3 l, e$ U# L$ u/ I) N# ?

7 m( u2 R+ X  f$ T/ W, U% ]4 A8 E* J4 Y# n3 K/ O- l
            }//结束while循环
: q2 n- v* w6 d' y+ r( B0 ~3 q            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
. S) ~9 y$ j* G' |4 I5 }& n( J2 N           
/ T6 S* X0 n% w7 T6 w2 K( k                if (numw[i] != 0), i, a' k3 u% z1 E0 r
                    Console.WriteLine(numw[i]);
2 i( u9 E' `' j" l! V: Q3 ]           
) k1 k) F" S! B8 y. U$ x            Console.ReadLine();1 s8 i3 L9 `) Q5 Z0 b( x
        }/ b: r/ j) N2 u; Z( y
    }
) k& h+ }5 u6 ^4 ~}
1 w% v2 V3 o5 L! [, B& v
小甲鱼最新课程 -> 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-11 18:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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