鱼C论坛

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

猴子问题

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

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

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

x
大家好!- {0 c+ g4 G- ?7 @. p4 |6 U, u0 T
这几天我在忙着编一个问题,我用了一种方法编出来!; }6 a, L8 l( V1 V/ |
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
: E% Q4 K6 E. G2 @% J注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 9 _% q0 G, s0 l+ q

; U, D' G% ]! Q. j$ d& U$ {* ]1 j
& k7 U  j. R& k' U! `$ N; N
                            题目/ j6 u; H7 Z, r$ P" m
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。! R, E* O8 s) ~- p7 T! y
第一种方法:利用循环链表) D" S' m1 D; h7 R7 a& c
#include<stdio.h>) v' `& U8 D' m  l" y4 ^4 r
#include<malloc.h>
; t) c1 P% ?7 x7 o. |% ^#define M 8            //共有8只猴子
5 @8 q: d$ m$ [- c7 J#define N 3            //数到3只时退出第三只8 D# J! d- M$ ?0 {) O2 \  g$ [2 Z& B8 S
typedef struct monkey" z+ \" T3 r' g: ]3 j/ b
{int number;/ t) R2 L9 ]- a8 z6 w
int flag;& U! J6 a5 A, \' N' A: S7 q
struct monkey* next;
' k- Y: z7 D. w1 v( v}MONKEY;
4 p& ]7 z1 C& c) H+ Y- }3 ?% z  j( @main()
' b9 \3 [. o8 d{ MONKEY *head=NULL,*p,*s;
- h. [4 q& F# o% m3 R2 p2 ~" Y  int i,sum=0,count=0;
8 B" T5 B8 f8 F  S6 o4 b3 c  clrscr();              //清屏
) `, I0 _  F# `  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存( v- n- T) V0 A& ~
  p->number=1;p->flag=1;
. B7 |5 x  L0 O1 v$ T  p->next=head;
' A- j' {) p7 K# f% W  h' f  head=p;
+ a& y. u3 o+ D" I* ]  for(i=2;i<=M;i++)* h1 u) s0 D/ Q! J5 I; Q6 C" T
    { s=(MONKEY *)malloc(sizeof(MONKEY));! J, u( R7 Y8 i+ Q  {. a9 b
     s->number=i;s->flag=1;
& F* x# Q7 K2 [3 d1 R     s->next=head;) y; d/ h! G; i- |7 U( y1 I
     p->next=s;p=p->next;1 ~5 s! ^( Z. C' @
    }
( p/ l/ J6 k1 t4 R% X, o7 A1 H    p=head;
9 h" T" l( e3 t) U   for(;;)
1 Z& v+ _# r) |3 W2 Z6 o3 r" z    {if(p->flag==1)
0 `) ?+ r9 b- {  d  D       count++;! n+ I9 Z6 _4 ]* j# L/ H
     if(count==N); v. _5 I, {2 T/ Z! v$ g* r
        {p->flag=0;
, Y6 C) Y( Q  S6 x: F; a! ]         count=0;6 _1 P2 \# F& e! A2 J  l
         sum++;}
) C7 L+ g/ |4 U/ I     if(sum==M-1)" N0 R. o: m0 Y9 n( n
        break;* d  t4 j0 u( K5 S' D
     p=p->next;3 l4 L; G$ W+ B# g* ?
    }) s7 ^. b% L7 h+ |, ~! H% {
    p=& i8 Z4 m8 B! f3 Y4 d; F8 S
    head;" f1 p' E  r* r5 K& z7 A
    for(i=1;i<=M;i++)
. C  D2 q( h( `3 S/ _7 c/ M. N    { if(p->flag==1)
: {# T3 u' n6 k! p# ~# w/ b+ @! C3 \        printf("\t%d",p->number);
( j: e0 p4 ]: C7 O; o4 L$ X5 W      p=p->next;0 A/ X2 ~5 [9 ]# T6 C( z9 Q9 z: G, {
    }5 G/ B7 H- z3 A9 }8 A. G5 ?5 x: o
! U$ [2 q3 w  x% R5 p$ O

$ F$ V+ T3 W4 {# }7 x1 m9 A( u! E2 T) x( k( `& `* P
}
2 B  y/ f2 `- `% y8 k3 D$ D
第二种方法:数组6 }; w& }( c5 p/ C' [  |
#include<stdio.h>
5 G; r' D* g  g- F0 f& d& z+ l9 D1 ~#define M 8, l1 q/ j' J* Y4 N; V9 f# {
struct monkey3 @+ u1 _9 _4 E  w. k7 h+ g( A" o
{int number;
0 t. {- c2 d+ \5 O, o! Wint nextp;
) ?6 F! b. ^/ s}link[M+1];- X! _9 W. V2 N2 [

, c% I8 q1 n6 s+ v9 Jvoid main()
3 H& k+ \. d+ j2 e3 {& Z{int i,count,h;
: c5 t' h" o, B' q3 P: i' K0 jfor(i=1;i<=M;i++)
! }$ V( s1 W8 k{  if(i==M)
! j9 u2 b& G2 w- U; \  `   link[i].nextp=1;
4 P  n. }& K( K, S   else
! u: J9 R) ?" D# W; q   link[i].nextp=i+1;6 ?) f  _6 V1 k9 N' C( L
  link[i].number=i;
# r+ C& n5 F& @4 v}/ [( U+ y+ r6 G' }% }7 u
printf("\n");
  X- ~! Z- T. c& lcount=0;
/ x- \# s. A8 a# O' c3 L  Vh=M;
6 b+ \% m8 e, N3 V- V* {printf("依次退出的猴子: \n");! C( _) z  L+ G$ l
while(count<M-1)+ C% a$ @0 f# g+ x6 ]! I
{i=0;
. q0 }1 h9 b. k5 X1 e7 Vwhile(i!=3)# E. b; g, ~* I5 A0 H( J
{ h=link[h].nextp;9 [" D% Z3 e$ q3 H! t' V8 g
   if(link[h].number)# X  ?9 c6 ]' I
     i++;}3 Y( d0 {- x* Q9 B9 X

- l/ A* v! v1 }0 {# R/ Lprintf("%4d",link[h].number);& t9 \* @# [4 z( |, k; r" r0 z
link[h].number=0;+ v8 G& Q# }6 F7 x
count++;) W1 @) F; s; d7 b( l0 a
}
5 `- N8 O- ^7 t% T0 h( p
1 H6 L1 n# q4 E! {; Y( Nprintf("\n大王是:");9 S$ A- Y& n8 e( p& j, H$ l+ A
  for(i=1;i<=M;i++)
$ e& ~' k- i9 l/ q7 ]5 [  if(link[i].number)
; E& q9 z0 [( [# u' e4 |    printf("%3d\n",link[i].number);! X* k1 p. P# u" @

: K( O7 E) h" u
. N' u7 X  I+ w: M* B; H8 n}
( z) i2 X; G6 r+ t: r
第三种是普通方法for循环
# x! h1 j# G9 @2 `1 D9 z
#include<stdio.h>
0 d( p* U% f" m3 O2 R4 [6 svoid main()
* u7 p+ S4 }, W{ int i,k,m,n,num[50],q,*p;
- X# l0 m& l" c' P# g: B7 G3 u    clrscr();
- L8 b% C4 ?- E5 O8 I6 M% d& y   printf("input number of person: n=");
" e# K( k7 o5 R, J  H, ?3 E/ m! b    scanf("%d",&n);* v# C0 \. F% W
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
4 m3 k6 b4 t  Y2 o# Z    scanf("%d",&q);! M, `' d# m- i1 B& F/ T  R
   p=num;
" m  R" p5 {1 n; u4 {  for(i=0;i<n;i++)9 _, Q) f9 c: m. I' g: w: _. B" H
    *(p+i)=i+1;3 Y. u1 n5 r9 z, f) L% r1 r: H
   i=0;2 q1 J0 E% |5 A4 N; ^5 @* y' o
   k=0;! h, Q; s; R/ k3 O4 |
   m=0;
, `% \  V2 m0 |  g% N; X* ]  while(m<n-1)
3 @' m4 N  i- F$ I   {if(*(p+i)!=0) k++;! b. ^4 p& k! \( x/ n& b
     if(k==q)
  o; j9 k  ?* \: w/ N3 u+ n      { *(p+i)=0;
, @' Y4 ]5 O! U: y) o        k=0;
7 j/ ^/ E: l0 c# \3 o        m++;
( F) I0 @9 \3 {2 `      }
& e" x6 V' w; o! \2 V    i++;
) c) L. B& L$ O7 j" N    if(i==n)i=0;- D- \! d: l0 p- I" c% Y& J1 K
   }
: ]  N1 u- l. J. e- B" j  while(*p==0)p++;
- n2 |, V5 q0 T- D/ H3 X5 z    printf("The last one is NO:%d\n",*p);
9 t* ~$ c  {+ A4 r5 T! Y( A4 G; [     getch();
/ S! D) O% y2 s9 F/ _7 }) Z: Q, ]. P8 G# v
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;. l- g  @6 @) K- B9 H: ]
namespace 又费马达又费电5 S+ `& w, g% t
{
3 N, C8 w' \2 m) p3 ?5 C    class Program! s+ Z2 M- ]$ v9 |+ J4 |
    {1 H4 o8 r$ a" h4 h: a
        static void Main(string[] args)
0 X- n5 e" p9 n7 S        {3 v/ h! Y! R/ Y
            int m, n;8 L8 Y  G5 k1 A) ~
            Console.WriteLine("请输入数组长度");
" V$ }+ U% H2 \3 ^' O& r  e            m = int.Parse(Console.ReadLine());//m为数组的大小
) f+ {0 S0 Y% n+ M$ x            Console.WriteLine("请输入要截取数字的大小");
! ], W5 d6 i2 d" x: q' J            n = int.Parse(Console.ReadLine());
- }3 Q3 L! a/ Y8 T            int [] numw=new int1 M% i& @  ?6 \) i$ H1 K
5 q3 s. W* @0 O
&shy;&shy;&shy;;5 X* e5 x  y4 y( J% [( R8 y
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数0 f3 l1 b% W! J
            {. Q  Z( \: U& ?& P: ~& V
                numw[j - 1] = j;! E7 ^" L! U* S7 l6 s& {. l
            }
% O3 w3 f, Q, I  n            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
6 O2 I0 P+ Q% P, [            while (d != m - 1)
7 Q# E4 g9 _5 {+ C$ p            {
3 r3 v" \$ q$ ]                if (i == m && d != m - 1)
. g  {  ]3 `" ^                {
$ ]8 \1 F  W9 a& J- L, X                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!, X& `6 t, L1 x# S1 c1 n) Q
                    continue;% q0 }9 b6 e$ M, Z+ [
                }
& P- M, y6 r2 t; [5 |0 B                else
! b. A4 D" I' E: e                {
. Z: K* ]- g: V; P2 G) k                    if (numw[i] != 0)" D+ ^/ K2 ~  ?
                    {
: a3 p& `6 l- @# |3 R                        i++;
/ Y4 b, d; D% L* e8 l; i                        k++;
. Z  {3 F3 H1 `: ^; ~" Q. @3 f4 e                        if (k == n)
9 C* _  {  y9 ^& }! H2 i$ J1 z- s8 Y                        {
/ `- S6 R! N' k                            numw[i - 1] = 0;//把在n位置数组元素的值改变了2 D1 W5 T+ ?$ K: h% F" N' w
                            k = 0;
# P8 ~1 x& g; M) u: R4 Z, }1 P3 f, w              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
9 E% ~$ z5 N+ N* y- S3 a1 |2 y                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
# H! v# R. U0 t5 H                        }3 N/ s( |6 Q4 r- E$ z' Z; Y& F5 a! m
                        else//输出暂时还没有改变数组元素的值: S9 @6 |' r) P% S+ Q+ R) Y% [
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);: p6 O+ n6 `/ D/ u" u
                    }
; C" k* [/ A! U' O% u                    else% q4 w8 x7 e6 L/ ^
                        i++;//数组元素为0,直接跳过,不计数。。。, P$ h( |5 K" |4 T0 O: ?
                }
4 [7 T+ t. ^- y, d! W4 o' C
7 q( ]: L; d& N4 M) I  V, j# t$ ^- Y* @! M5 U' D+ Z. ^
            }//结束while循环
# X7 d- Q2 \9 N% T4 I! @            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
8 Y  v4 T6 i& M% ^  n           ( E7 Y1 b! ~4 P# U
                if (numw[i] != 0)7 Z, j6 E1 k7 L4 ]# G
                    Console.WriteLine(numw[i]);( Q  {- q! P7 ]$ E4 `. v
           ' k- N$ [- l3 t4 t1 H  T, v) f' a# @
            Console.ReadLine();& V- B5 d* b8 a0 B* S. |
        }$ V9 `  t! A4 F  l
    }! M! y* V/ t. o* A; T: I+ r+ }
}+ c' k1 f9 Y3 C% R
小甲鱼最新课程 -> 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, 2025-11-10 01:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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