鱼C论坛

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

猴子问题

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

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

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

x
大家好!! C# t9 Z& y1 r7 F8 r' v" n
这几天我在忙着编一个问题,我用了一种方法编出来!7 d3 W, ]' X+ {9 q
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
1 B5 P0 @3 [. ]$ j. e注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
- ^1 V' n( k1 z9 u, `5 s) b3 ^, `1 T9 @2 p
7 [7 ~. i& F7 U+ ]8 a5 L; x
                            题目
: N: X! T6 f) c山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。0 ~3 l5 F' W! G
第一种方法:利用循环链表' I! k6 h, C3 d
#include<stdio.h>( Z3 W- G! x, }* m, \: @6 ]8 W1 C1 x9 ]# {
#include<malloc.h>
7 o; W0 |0 z" J! N#define M 8            //共有8只猴子' z* q7 ^5 S, J5 z: l5 y' H
#define N 3            //数到3只时退出第三只
& b3 q" g# V& f, q8 Q' itypedef struct monkey4 c: D5 y% c& W: E" l
{int number;% N( h/ I7 P: \6 S; X' Q
int flag;8 q- `1 f5 a: n$ z( E
struct monkey* next;
5 h" K# ~: @' Q, m}MONKEY;
. E) q$ g4 A5 ~: _. C( pmain()5 d' g  i, `0 w) V/ M$ W  M% V: G) D4 G* h
{ MONKEY *head=NULL,*p,*s;: W. n" ^, W! t/ _9 k
  int i,sum=0,count=0;
  I7 S5 Q9 r* [1 f  clrscr();              //清屏9 }6 n- Q' R+ T# u* E
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存! `0 c. |2 R" r3 {3 H+ |  h
  p->number=1;p->flag=1;* s, [  H+ H8 g4 a- Z9 a
  p->next=head;8 q" P7 r$ H/ c, T4 o* c
  head=p;" O. X# W) j7 [# l# `1 t3 F/ ^
  for(i=2;i<=M;i++), `& c7 l/ j' v3 m, V. ?) l
    { s=(MONKEY *)malloc(sizeof(MONKEY));
$ Q4 h% U& ?4 G6 h8 z: _     s->number=i;s->flag=1;
3 E" \' w, S1 |% L* a& D     s->next=head;
% A6 k' ?& t, c. P( ?" |7 L' M  z+ g     p->next=s;p=p->next;
" a. F  I6 m( _* ?! v# ]' ?    }: a" Y* {" u' w
    p=head;
6 \+ H, R. u& s* a: x   for(;;)$ v# a9 Y6 g  \8 J% A- ]! J3 q& C
    {if(p->flag==1)
8 p( g) r2 W# C8 n       count++;0 k; y% w0 q% M" j. O8 L, g. D
     if(count==N)
% S3 s4 p( ]# _& i9 V  O+ i2 W6 N7 B        {p->flag=0;
8 }! i1 X  {' q* ?5 z- x         count=0;
# I  B( O9 q/ d0 j         sum++;}
# u) x6 E3 d9 o3 d# }2 B6 {     if(sum==M-1)) z' h! |' G( v
        break;( u+ e/ r$ o2 [- N) z3 n
     p=p->next;5 r+ d. V3 P: V' j) |# B0 W
    }  c( o* [5 v( F( V
    p=3 V. [" C( ?$ n9 e6 o0 F. }) N
    head;
( M1 a" l5 g! `. p* `    for(i=1;i<=M;i++)
6 b( U! O" a# q$ \  M( [) n. b    { if(p->flag==1), M! ]; |  x3 n7 m- u4 k$ [
        printf("\t%d",p->number);
) H0 B0 D1 |; ^! a' K      p=p->next;5 @8 U: h, z9 D& B" A) a0 |
    }- W2 Y; R4 [  I5 P. Q; G( o8 S

& d' [" P  F4 a9 {1 V$ h/ K" X) S# h' V6 E
  z7 x& ]7 P( ]' g3 y% Y' X: J
}
( _# K) T" g4 Z; @4 d1 R
第二种方法:数组) I) T+ k' ^: U1 g1 W
#include<stdio.h>
6 p! ^8 J  r% h3 k#define M 8
2 J' _- [" ~# S0 r! w; ^struct monkey
/ y* ~& ?, |7 k3 X: K{int number;
, {- F& i$ B1 I4 j( eint nextp;" g4 L1 [$ n* C# f+ ?8 r# i
}link[M+1];. [) m) R3 f. a1 R/ `6 }
0 k- _5 x  t: n; w% y
void main()
) K" R6 Y, v6 o$ Y/ P8 C{int i,count,h;! a- d% x% V: E* a
for(i=1;i<=M;i++)
  j. n% W0 U& [- A! D# t7 Z{  if(i==M)
  X8 V. V- d3 z5 Z/ R. I7 f1 V1 g- @   link[i].nextp=1;% ]6 n5 s  w3 T; D
   else! C6 \" K' V" u
   link[i].nextp=i+1;: @6 K: T$ k+ a: v
  link[i].number=i;( w! r$ R9 d$ `  r
}
: Z9 ~- R/ G  n7 _' A5 [0 nprintf("\n");
. u: h: f9 N5 h$ ]# m) ^count=0;
$ ~; r' w: ^3 e" jh=M;
7 C( m8 b9 v6 }/ _printf("依次退出的猴子: \n");7 u  C. ^# G/ X; w
while(count<M-1)
! h& H' \" @8 ?$ n9 }{i=0;
  q/ ~, b( n. N8 Z. u' h  hwhile(i!=3)
) h' {* G; \7 N; R; c2 u. P, p. D9 Y2 F{ h=link[h].nextp;2 U7 B! e) x( `  a7 r' P2 u' s* X
   if(link[h].number)
8 H( H6 h, d+ W# F9 x     i++;}
' F! w5 r, [' m# q- I( o: M' _. q. f8 }
% j' J7 W# A. i) Rprintf("%4d",link[h].number);
# m, P; F8 a5 `; r# q" Y. M3 Ilink[h].number=0;1 O- W" f5 ~* s  Q6 O8 M
count++;% |3 t$ J2 f& [0 b! i0 C! J
}2 M5 c& r5 q  \/ f( M( {

* ?; F) A& B# i: iprintf("\n大王是:");
; E2 p8 d9 O; S" l  for(i=1;i<=M;i++)+ q# B) N+ f+ \# L
  if(link[i].number)$ K! G2 Q) h* w# ]( u& r8 w* R
    printf("%3d\n",link[i].number);% @# K  k5 ]; ^

4 @1 u# z7 T8 w2 v/ r* \. L) Z8 G* A- l
}
4 [- B  {! _7 A/ t0 V; U" L
第三种是普通方法for循环

, Y1 Z( S* S% }7 @4 S  ]. ]#include<stdio.h>
$ j+ ]9 c/ M0 v7 ]+ |void main(); C* j) n! `# x, m7 T2 p! c
{ int i,k,m,n,num[50],q,*p;
2 S# A1 L% O# e$ n    clrscr();- ~8 L& t( j% `) l' N' t
   printf("input number of person: n=");
3 R, D7 Z, g" A. k7 J% V3 S& U    scanf("%d",&n);
; u, k3 h3 V- {  b& sprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
/ B7 S5 F' J5 j4 [8 V: J    scanf("%d",&q);$ z2 F3 U2 v4 B$ e( Q  M4 ]3 e1 V
   p=num;" q7 N4 F: l& a; w& l% ^9 C; K; V" w+ E
  for(i=0;i<n;i++)( u0 X5 e" \) p" q
    *(p+i)=i+1;
" `: T, c2 _. S0 B   i=0;
5 k# B; a4 E% S' m! W; ~" z& I   k=0;
5 ^  v% T$ }. M4 i3 \, u   m=0;
' A1 X. E5 `9 J1 O. Q( \) v: O: W; `4 L  while(m<n-1)
$ ~7 r6 Q$ b' J1 ~& W   {if(*(p+i)!=0) k++;
  N( h' M1 X) D" I     if(k==q)
0 ?/ T, [- h4 }8 j0 {6 h3 Y. i) {      { *(p+i)=0;" z6 c) H# B' {
        k=0;* P5 \& u9 m: i
        m++;
) k$ J) l" m  l  \* R/ Q- T      }
* k% g) P$ U1 s3 _  H: w; J    i++;: L- O/ {0 v3 ^3 t% V- e9 T* E* _1 X$ H
    if(i==n)i=0;3 D$ X) L7 J6 |  [/ M- b4 V! D
   }" A7 o8 D& c+ L1 B/ K6 _
  while(*p==0)p++;
) }" k( J! O$ C    printf("The last one is NO:%d\n",*p);
, X6 V$ K! s$ g7 _0 J' D     getch();
0 b9 S' |* X8 Q( ^* \4 c( W$ ^' F0 e/ n
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;3 o( W* H5 M0 M! {. Q' a) p7 H
namespace 又费马达又费电8 z# D5 [9 R- `
{
$ k) T, {/ x% a5 u9 f    class Program
5 z# T6 _; Q, s$ c- d2 t% F% [- A    {: R" \8 ^1 L9 }) u2 n4 z6 C
        static void Main(string[] args)
7 b5 S: s- f' a- X1 L7 h9 b        {* @3 }5 A; a  z
            int m, n;+ t1 R  p- F# g
            Console.WriteLine("请输入数组长度");
7 Y9 M; |' W9 c            m = int.Parse(Console.ReadLine());//m为数组的大小" e7 T) H) n( T
            Console.WriteLine("请输入要截取数字的大小");
8 E4 f% U( i2 I" `7 R! C            n = int.Parse(Console.ReadLine());% y# R4 [# e0 e% i  s+ {
            int [] numw=new int, c5 j# z0 z3 s4 X# U& V

; K" w. C2 m- L8 S* ~3 A&shy;&shy;&shy;;
1 F' h# {! N, a( |* z# ?9 \& Z2 s+ x! k            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数. g  v; f( z; G0 N5 X4 H7 \
            {
. Y- \5 N9 T& k$ @6 _( z, \( J                numw[j - 1] = j;! D& x7 U2 q* `/ C) l- L- ?. [8 r
            }
" t6 z& P, A, h  s' w' Y            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
4 {3 ?: Q% p. z* _" {2 J! F            while (d != m - 1)! ^; \' c9 L# f- b# G
            {- B" U& e7 ]3 @6 R$ `. T) C  E/ t- |  X
                if (i == m && d != m - 1); k4 n: o7 k' r
                {
* `$ ^! S% T( c# S5 ~! D                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
8 e+ x# G$ _$ z$ [+ Y7 y- T3 e                    continue;
/ w  E) r! E% m                }
; d; I$ D  b0 o8 J% X                else
. C# m7 T# S% O. y" e( Y0 J: N$ Q                {
6 p& |# D# A2 @6 m' r7 {5 n                    if (numw[i] != 0)- P1 y+ I+ \8 m6 q6 J- C" b
                    {3 z7 R1 Q; E" _; G4 }
                        i++;) p# |: r. [$ i9 G" w
                        k++;
7 g* k" A2 `0 s2 Q- B                        if (k == n)
' m# M3 v! M5 x7 v( n: E                        {
% G8 W+ l# v: [! b% h: x, L                            numw[i - 1] = 0;//把在n位置数组元素的值改变了  F+ h+ q( b- v+ S* m  \
                            k = 0;; b& b/ |  ~2 u9 _, N5 r
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
  ~6 ?% p3 u' y/ I; o, M! ?                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);* l6 h# }: A! W* R# |+ W
                        }
% P) _& m+ G8 O" C( R6 V+ @7 o                        else//输出暂时还没有改变数组元素的值% g1 X/ `* h( Q! {- M4 S
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
6 k- S! `  r& }! H$ m  _                    }+ y$ {" A. G+ \+ [0 p
                    else  B: U4 f, A4 F$ s
                        i++;//数组元素为0,直接跳过,不计数。。。# l. y' o- x. `" P) E0 _# D( Q
                }
! Z! ?; d# u3 o& S: x9 d
1 c, c/ |' j4 Q  S4 A
7 g0 u8 u% V- x( Q" R! _4 E            }//结束while循环
% g7 i. R. L2 x4 q' o, A            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
% o  i' M& L7 e" Z& _, M           
! `) O, u$ m; u/ A3 J: G                if (numw[i] != 0)
: P4 B8 F) i6 y  G3 Q  [0 O3 F                    Console.WriteLine(numw[i]);
% U( A7 h* o4 G" t- d           & o2 ?8 J' @# R; ^
            Console.ReadLine();) f* W8 K9 q: m6 g9 m* x. o
        }1 v  K, z' U5 P* P
    }/ F+ t5 a3 A! a* {
}
+ p1 t% n+ q! }5 }4 S  d
小甲鱼最新课程 -> 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-2-16 01:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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