鱼C论坛

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

猴子问题

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

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

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

x
大家好!/ V6 {* w+ c+ g9 A: H/ x! ?% h) m
这几天我在忙着编一个问题,我用了一种方法编出来!
6 ?& G0 y4 ?# [但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!1 J2 G4 [. G7 l# y5 S
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 # w& `5 T' E  J  c& P. l

( ]5 T4 P$ k" F! g' ^) u3 k+ l0 [1 A7 q/ {7 K
                            题目
9 i. }% b) _( {' L; d山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。: ?. O% t3 z$ W
第一种方法:利用循环链表
1 F5 x+ a# O0 t0 O7 \" @! H0 \2 d#include<stdio.h>5 ?; A8 |  m" @- p  c
#include<malloc.h>8 ]3 x+ b. A, |( x$ m
#define M 8            //共有8只猴子+ S8 V9 `2 F  v! a
#define N 3            //数到3只时退出第三只
# c& H9 k0 E& x- z# t! F* l, `8 ntypedef struct monkey3 e4 ^% f- \7 X
{int number;9 X  K5 _6 Q) B8 {. g6 u
int flag;
$ h/ w5 X3 N8 k% sstruct monkey* next;! I. a- q% X4 h- W0 S( Q/ R; \
}MONKEY;
2 l1 ~! k; E% n- r+ ymain()8 [& g1 y# P% R3 w2 m( m8 P
{ MONKEY *head=NULL,*p,*s;
( @* V, F" a" V( ?8 w2 {/ I4 \  int i,sum=0,count=0;/ w2 {+ f8 c+ h9 q! ^
  clrscr();              //清屏$ {: w5 |" Q2 W8 R3 u. _) G6 r
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存1 Y5 v& }  q( N3 U& |$ x
  p->number=1;p->flag=1;0 S' L4 s3 R* V( i! W: L
  p->next=head;. D2 n& U2 v, G; V7 S
  head=p;
( s: y, \& e9 v* j8 W  for(i=2;i<=M;i++)3 E! l2 K# d; y* F3 W  O! ^6 f/ P% T
    { s=(MONKEY *)malloc(sizeof(MONKEY));& p! U- ?" _: c" A# I( U
     s->number=i;s->flag=1;
7 \6 e" X9 H4 W! r1 r' _+ X     s->next=head;
' t+ t! ^/ c, O, \     p->next=s;p=p->next;
$ ~6 M* P6 [' R1 g7 b* \( ~    }6 N5 m; O: ]% y  s; r
    p=head;
% K* s! f* W& S& z! N2 ?   for(;;)9 z+ Q% G' _& c4 w2 X# ^
    {if(p->flag==1)
, n/ D) d$ a3 v% U       count++;- N; f1 L) M- t  X4 ?
     if(count==N)+ z4 e0 h, Y1 G, l2 c% P
        {p->flag=0;5 q2 `+ e' w8 E  }' P
         count=0;
$ T% g1 y$ ]+ k( ]8 Y         sum++;}: O4 y" m" J, Y  z( J' t8 w
     if(sum==M-1)/ C) g; _' b1 f* a- p
        break;& O3 j" ?- e6 b2 p5 j8 }
     p=p->next;# T& U+ w! \* f5 m' |; Q+ O1 E
    }
: d8 r7 r& y6 V" `0 T6 }    p=0 e1 V9 U4 ?$ h! z; t  |$ t
    head;3 A" E, y# |* n7 k1 m/ J0 y& |  d
    for(i=1;i<=M;i++)
) Z$ s2 k1 U. \! Z; t    { if(p->flag==1)
  k/ r3 K% X6 E" q+ P* @, ?0 N        printf("\t%d",p->number);
; w8 I/ @/ P  w6 c* r2 {      p=p->next;: y2 k# T- L* |3 Q
    }
/ R! U( l3 n2 U) ]
5 L3 U* N' X" z
) P. p. D; N$ m% D% _* v" Q$ M
7 F$ c* t' x9 k4 g# H9 ?' c/ b2 h}
- \1 N2 E0 q+ V
第二种方法:数组
9 T7 e1 X5 d5 l) N" c; @' V# ^#include<stdio.h>
- H( {. q6 J+ m/ ?#define M 8
0 a5 R2 [% U( c2 A! e+ {9 Wstruct monkey  _* N, |5 P" O- }8 N) J  g
{int number;1 ]- V; q7 j. M8 t3 T
int nextp;
& ~! _* `8 P6 _; g1 v: z$ g}link[M+1];' Z$ e* t& g- \* F( h, j9 g: i" }1 P

' T1 |/ _( D; f( j5 a% k( Lvoid main()
/ O. o* q- Q! V3 N4 [2 h{int i,count,h;; h6 a6 M0 }6 |/ C2 \3 b9 V9 i# P
for(i=1;i<=M;i++)6 G' _9 v4 F: b
{  if(i==M)0 k% q# S7 P1 V) I* W4 P5 a2 E4 ^
   link[i].nextp=1;
; v" u- J6 H1 J   else
* y) ?" @' i! t0 b2 D& O1 ]   link[i].nextp=i+1;
2 |# Z7 _! L0 v: w. X3 T  link[i].number=i;
+ r# n- O9 j- X/ [6 X5 v1 a! Z: n}
+ I3 E' P: I* W7 u+ P, F. [+ Fprintf("\n");
" K( X) s- O# f. C0 ?count=0;
& P' d& a3 k# H- }" Y. qh=M;* N( P, d* i  A: u1 R
printf("依次退出的猴子: \n");
. `& Q1 a+ p) u2 i0 k7 owhile(count<M-1)
5 |) m  l3 V2 Q$ b) o( s" k{i=0;
. e% |0 Q0 ?" w( ~2 p4 J5 r# xwhile(i!=3)
$ [/ X1 N4 P! F) b* Q{ h=link[h].nextp;: o1 G. ?- `$ p; N
   if(link[h].number). L' \8 `7 ?" R1 g! I! c
     i++;}
- ]% q- o  {" G
1 C# f& b/ c# K7 z$ s1 ?printf("%4d",link[h].number);8 M8 a5 ^. u' m* ?4 r* D
link[h].number=0;
3 d; o+ \, ^2 O6 ccount++;
0 a+ M* e# x% `/ J}( v/ J2 n4 Y6 J; @$ x, |! ~) B+ o' s

4 V5 C+ Y) p1 C/ cprintf("\n大王是:");
! O- a3 S/ `$ t+ _  for(i=1;i<=M;i++)& T5 G6 }/ T" C6 M+ G/ ?- Y
  if(link[i].number)! z: Z. f4 v; w2 C: @! B, F$ V
    printf("%3d\n",link[i].number);( w1 o! w6 z9 Y, I9 I
1 Q6 i7 d  }5 k2 G; R; L7 p

# r1 U, l( ]* Y9 C% {9 W; y}
4 m8 G6 J0 A7 X
第三种是普通方法for循环
( C6 k( X+ `9 h( n$ T% W  g
#include<stdio.h>
, c  e) [( n9 U$ pvoid main(): M4 w6 P) F7 D
{ int i,k,m,n,num[50],q,*p;
) S; D0 P/ L2 M* v" c    clrscr();
" b6 J( W1 V' t   printf("input number of person: n=");: e6 j& M5 w) l- x' i* G8 g
    scanf("%d",&n);
: L0 ]$ z/ I7 }. ~2 Nprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只% L5 G: |0 H- l) p% S" t
    scanf("%d",&q);1 F7 y& j1 r2 r) \& w$ r" n
   p=num;/ g( K) c8 q- R, l
  for(i=0;i<n;i++)$ R) {" N" U, X9 h5 [- O
    *(p+i)=i+1;
4 a. q; K9 E0 O   i=0;
, F8 n) X- u  d4 z4 C- x4 P   k=0;4 Q# y9 v+ z  M, h+ Y% y' X2 y
   m=0;
( f' }) t; I; j/ n  while(m<n-1)' E- W5 M7 x( K4 U$ @, U6 j
   {if(*(p+i)!=0) k++;
8 Y( h5 F+ G$ \: l* f4 T     if(k==q)
3 Y8 B4 O; r: R5 h$ v3 P      { *(p+i)=0;- J8 h! y8 G: C4 O
        k=0;' }6 e  _8 V& V9 }# h+ c1 M% o2 v
        m++;
  l0 N" {- g; L: Y. W$ K6 A      }
! i. K7 H2 A# E) k    i++;
7 j, p5 [- c5 l0 u# G/ ]    if(i==n)i=0;
5 d+ U, R# s! |" F/ [   }
6 J' ]! x8 g4 r/ ~. `* ~  while(*p==0)p++;
8 s3 v8 X! \6 g  B: q5 R3 Z    printf("The last one is NO:%d\n",*p);
0 L( R$ {+ x' q( W6 R0 ]     getch();
: a; G3 |+ N( k% j& ]* R+ N# p7 y7 D( y. }" L" ^
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
* E; W3 \0 Q- K1 Y  j4 Z- Mnamespace 又费马达又费电
  [- T* t: T$ u* B{0 o6 @! H5 k; Z9 e
    class Program) p4 t! O! f, Y! w2 u8 r
    {
- L, ^% H; n8 h  v# g/ o( u        static void Main(string[] args)
% t4 q( N- x( }. [+ S: S        {
6 ~7 ]0 \5 P, d3 [1 z! c" N            int m, n;
* {2 |1 [% f* R0 O! v            Console.WriteLine("请输入数组长度");8 P# Z3 E' |8 A# m/ Y$ U
            m = int.Parse(Console.ReadLine());//m为数组的大小! n5 k2 K# a* f0 F
            Console.WriteLine("请输入要截取数字的大小");
$ g, Z8 y8 H  J. {' l5 d# ~6 x            n = int.Parse(Console.ReadLine());
) n; D# X# p4 c) d: S0 _            int [] numw=new int
7 `+ p$ _+ W/ y5 r' u$ P, V" h4 ~
/ v& a+ d/ H. H& y! E&shy;&shy;&shy;;
7 f8 d* `+ ^# q% U( e7 @$ Q- I            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数  c% A% o" ^# u6 B( m
            {
! M# l7 @. [3 T                numw[j - 1] = j;
# e; k; Q5 C; s9 Q1 E3 B2 ^            }
* v% y1 |$ T& }( d: _            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
3 ^1 C1 F- r3 M( F0 `            while (d != m - 1)
* c; G9 I) j( |3 v0 y  @            {
* C; K6 w0 A- v. C  H8 x' A0 Q                if (i == m && d != m - 1)
1 o* S8 ?2 _. G' h% }  J                {. O* a" K' r6 J3 ^% q' e+ Q
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!: F9 Q3 o4 e* T  N; c' l
                    continue;
+ x$ N% j# {4 I7 D: A7 q                }$ b! M5 L! z: C, Y# P9 X$ H
                else3 b- `6 e6 C7 _4 J9 D. O
                {
# z; l2 b0 x. J4 ~                    if (numw[i] != 0)
4 t4 N3 |6 U! a  x5 ~/ R- h                    {
/ ?: x( L3 \1 ~+ i                        i++;6 I' v$ E7 g# G2 a8 V% @8 S
                        k++;! q3 n% s0 s1 T7 P; K  q' m6 X# P- S
                        if (k == n)
9 _; Q) W- O% c+ j# b6 S! x                        {
- P7 Q3 a! W6 Q9 d1 ]& S                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
" \) U+ F& ?: y1 d6 X: }4 {3 A. f* i                            k = 0;
" S: X( u  J+ X& @3 \: S              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小11 {# y2 K! u( p, z; d3 o, u/ s
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);$ b5 R7 x+ Q2 V# U) f. Z
                        }
! X3 O9 F7 i8 w' U                        else//输出暂时还没有改变数组元素的值
4 \* }: H6 f/ T2 _1 m                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);  E: R/ f8 n: r, D8 V+ m' {
                    }
/ @+ X4 O, W/ E/ u6 C- ^4 ]                    else, B: w- u8 C9 W( ^* N* e
                        i++;//数组元素为0,直接跳过,不计数。。。
9 a" J4 M- h0 P% r+ o8 }                }
  m  z7 c/ H! N6 x 8 T4 K8 p$ t. o5 g

- D/ M8 B1 z, U( ?! u$ H: F            }//结束while循环
5 c, J$ H2 y. l; s4 T+ b            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦# Z$ N7 `+ Q" l6 Z3 V! o4 V9 ^
           
! J" {% S0 s( Z2 a. r% e6 o                if (numw[i] != 0)
7 Z2 K8 y  s/ ?7 v. q, U! e4 z                    Console.WriteLine(numw[i]);
% h$ R' F% \. v9 z. b           5 n2 m. r  U8 a0 D
            Console.ReadLine();
, p" D5 f; W+ l" c& N' ?5 X        }" j# |. B5 O6 \: f0 V" Q
    }
3 C) B+ h+ q5 L" S0 }/ a}
' p- @" o; p0 [5 m% t
小甲鱼最新课程 -> 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-5-27 06:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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