鱼C论坛

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

猴子问题

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

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

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

x
大家好!
7 M" \5 [+ ]1 g# a$ H; g& [这几天我在忙着编一个问题,我用了一种方法编出来!* p1 C8 x0 z3 s& q3 Q
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!) r  Y, w- R! Q8 Y
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
# n; ?. i6 z) _* j5 H: J0 N8 @
# [: [2 D5 K# Q# w: z+ {4 Y. j6 d; P! e  [( Z9 U$ H5 L! ?# M
                            题目/ \- ]% C* u, l
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。) u. f  O6 i. r4 d, Q
第一种方法:利用循环链表
" R/ J- T% t$ P0 ^8 X0 J9 Z#include<stdio.h>. [" Z2 @9 s8 s" i" b& Y+ K
#include<malloc.h>8 v; u# m9 g) \+ m1 w  K5 ?9 l
#define M 8            //共有8只猴子& S( r% u$ {. y) d+ m
#define N 3            //数到3只时退出第三只8 m" v8 l: I$ U! [3 }
typedef struct monkey
+ m, M- i  u6 A{int number;
$ s2 U9 N, ]! zint flag;
' N) s& F* F! T4 [# ~+ [struct monkey* next;
' O; s8 B8 Q% G7 g6 J}MONKEY;% R7 F4 d% E  B+ }$ w& g  h
main()
  K9 `5 d1 Y8 ~{ MONKEY *head=NULL,*p,*s;
/ t% [( Q. E4 f' b* z: j3 o7 b  int i,sum=0,count=0;& I- `. s% A4 S( Y
  clrscr();              //清屏' P$ e% b/ k' S1 n8 E
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
% ~" Q! e' P- c" P6 P* P  p->number=1;p->flag=1;1 {& I8 W- u$ W$ Z0 V" K: B6 \
  p->next=head;0 P% n2 e" A$ x/ t& Q4 [
  head=p;
8 ~2 ?8 c0 I. A. }4 ]- M: c  for(i=2;i<=M;i++)
* Y, k6 \# h8 ~' Z+ {    { s=(MONKEY *)malloc(sizeof(MONKEY));& g$ N* }( D6 H" {" p
     s->number=i;s->flag=1;9 z- E# K( g: L% r
     s->next=head;) r! R( G, W" V2 b( j0 s$ Q
     p->next=s;p=p->next;/ G3 R- v8 R8 ~7 b7 `: W8 T+ w! R
    }* z) ^. z( `2 E  S( R
    p=head;; Z0 W' s* m2 E
   for(;;)
4 u% s# w2 K: U# n3 ]% |    {if(p->flag==1)) d9 B8 X2 L! W/ u+ j6 j
       count++;% Y/ O" n9 M: k' d) T- N7 Z- p+ x+ h
     if(count==N)
& g( ^/ n( t) e        {p->flag=0;
8 h. M2 a  u* p4 T  f/ Y/ Q         count=0;2 h7 q; v' d( o5 o* K
         sum++;}
3 p/ M! C- U3 c, P, y6 D+ A$ l9 i     if(sum==M-1)
6 A( [/ g, O4 p5 L2 ^  e        break;" p) k0 H; F; w( @5 }7 @) ^
     p=p->next;
3 R8 @; q# s- L    }, `9 R  \9 w8 G! ]
    p=
. q7 w; u/ l( b& b2 u4 J    head;( ^" D) ?: l2 b+ f
    for(i=1;i<=M;i++)7 i; {/ L8 r+ F$ s( i# Y7 E
    { if(p->flag==1)
$ x# ~# R) A# c% u7 w) c        printf("\t%d",p->number);
& u) L/ A' c9 q8 C: M/ O      p=p->next;
2 T6 K( K# L7 ~: T  g% _/ @2 ~+ ?    }* _; J. y8 z  v3 f1 _8 b

) ?, p( c1 b$ |7 }  C1 J1 N- J. e

% u. u" K$ E; Y- `. o' d  H+ _* k}

, x, W7 P. L& n$ y9 t( M3 f第二种方法:数组
( |1 C9 N9 t. H  a" ]5 p#include<stdio.h>
) [. S5 C) T2 {! @5 C4 S#define M 8- u  a. k1 N0 D6 O/ S
struct monkey4 V! V  h' @' B% o$ P5 @3 R7 K. @
{int number;. b% B% c3 A0 ]2 |: W5 }
int nextp;0 a: i1 ^- ^* f, \( i5 V3 [  P8 X
}link[M+1];' `# D. }) P# W% }/ M! j
  @# p7 D! C; J7 X5 b5 d
void main()
0 I) J2 E" q$ [9 U/ @- c{int i,count,h;/ T' c- l2 C- z- B: z$ {
for(i=1;i<=M;i++)0 U/ m3 ~) X8 p9 v% v0 o! {2 C
{  if(i==M)2 s! Q+ Y% T. l& b. W# {  G' H6 U
   link[i].nextp=1;
* w6 P) K6 h& m# F$ G& t, _4 M4 p   else
6 ?7 Z8 @* q* o8 J# q6 [   link[i].nextp=i+1;
: P, g/ z" q- G) s9 H( p- c0 e: s# M  link[i].number=i;
" f2 H, R# N4 s, ~}/ T+ ]% B  H5 L6 u* ~# N
printf("\n");
# I7 \: I0 U$ r( Z; I% K, g7 @  ycount=0;
( j$ u( f, T  j+ V+ G9 K0 y! n0 kh=M;6 n0 w6 Z0 K3 a' {
printf("依次退出的猴子: \n");" q: X% A# w$ v
while(count<M-1)
% N7 I/ \2 y" {6 s& @{i=0;
. M. p7 ]& |" }  X/ V' X& Iwhile(i!=3)7 b* a7 k8 i: ^, A
{ h=link[h].nextp;7 k0 @& r- N/ K
   if(link[h].number)
% \. E- f% I, J7 T. N     i++;}. S' i# j) ]. P4 K( V$ l# {+ j2 w

6 i0 c5 K2 ]  zprintf("%4d",link[h].number);
' x. Q6 A# ?# ^3 U) jlink[h].number=0;4 K2 M, v8 I. e& n4 s# ]; ]
count++;
  T) Z- k: D8 l# ?1 U}' D7 }) \; L" M0 K( _2 G( g' @8 o

! a! W$ P( \) s! Y5 B: x' eprintf("\n大王是:");7 {# K5 Q; ~; H+ c; B  J! K
  for(i=1;i<=M;i++)3 g  t* k& G! p, F
  if(link[i].number)
/ r( B" H3 A) ]! C, s- X4 K    printf("%3d\n",link[i].number);" ~  S* E: }8 D9 D# o
- z9 u+ J; q" m

$ ]; b4 `" H4 k2 ^; t6 f}
- Y; Z/ \7 Q8 m* v
第三种是普通方法for循环
; ~, c: @1 _/ p8 Z3 H8 n/ C- h2 t* D
#include<stdio.h>* l; P; L* J/ @" F  W
void main()  ~5 S+ m1 r# i' L2 s9 x
{ int i,k,m,n,num[50],q,*p;) ~6 k! N. c+ R2 }6 d" M
    clrscr();: n( z' l7 d* g2 l6 _. z' R
   printf("input number of person: n=");
, z) d) s. w0 s& X4 {( q5 j; L  u    scanf("%d",&n);) E6 L( G  \. k& J  c2 ^. f6 P
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只) Y8 \+ f) M/ c  p, `
    scanf("%d",&q);
2 I' I7 y& h# U: w2 _   p=num;
5 v1 r+ j' w! @2 L7 N6 y  for(i=0;i<n;i++)+ N- S- l) |, p) ~9 x9 Z# F
    *(p+i)=i+1;
# `- |) _# b2 g1 e) h& o   i=0;+ z3 u; r/ g2 @& t6 s# l3 @
   k=0;0 F# B9 T% p9 m2 X/ m) V
   m=0;
7 A$ c3 U! D0 _$ D  while(m<n-1); `) S% P$ c3 s( E6 B4 }* r
   {if(*(p+i)!=0) k++;% k; _% P  K4 p- ^. H$ k
     if(k==q); O  f0 I# t$ W) G: R/ n5 r
      { *(p+i)=0;
5 b/ k2 `# W2 S5 I& P; p- J/ ]        k=0;4 ]  R0 _% w3 Q& X" s
        m++;
9 K$ u6 h# b6 w% a      }
7 v7 D7 P; C% {" r) K; k0 d4 N    i++;2 d' C- b. X4 ?  W3 t1 ?
    if(i==n)i=0;& D2 E4 Y0 R1 ^, b$ V" E' |
   }
: T. K$ [0 Q$ B8 w, k8 |- K  while(*p==0)p++;
; y1 m7 e4 T" I  A    printf("The last one is NO:%d\n",*p);, Z/ a; l; X, k
     getch();
% E! I1 x0 h# A( c
; V+ |2 z( g. E, F5 J; |* y}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;" o. t& |5 p7 K6 z5 e
namespace 又费马达又费电4 k) a1 ~' W2 }" K- [
{$ N1 w3 k* [3 m8 s
    class Program
  M' x* T; Z0 R) T    {8 w" {5 M3 W/ E! T$ x
        static void Main(string[] args): l" D" G& Q5 V# C# \; g8 C
        {
/ V: w' S& {0 B' V& z9 c, d4 K            int m, n;( |1 n" w- Q( p, _
            Console.WriteLine("请输入数组长度");
/ F: u$ N! R" A) Z2 C2 j- q            m = int.Parse(Console.ReadLine());//m为数组的大小
! T: W0 a  ~( |* m9 B            Console.WriteLine("请输入要截取数字的大小");
6 @1 P' W8 y" B9 J9 C            n = int.Parse(Console.ReadLine());  z/ G* R8 a0 r! ^8 U/ s
            int [] numw=new int
& B( F; }$ |+ j) W5 ~/ F4 D( d0 A7 J  J/ ]+ Q6 C- Z+ W5 X3 y" f4 q
&shy;&shy;&shy;;
: L7 r( t8 ^. Z( g. W( K) P            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数5 ~  X- Z. Q1 k+ n' V
            {
7 m* }) d( p, Z' C) V* e& c4 @8 L                numw[j - 1] = j;! e- ^/ U9 C; W2 Z3 A
            }% j$ {9 N2 t1 J
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!5 s: O$ j' |; M- |' L1 V" ^9 |
            while (d != m - 1)! p- m# P7 c) J  B( M0 [& A
            {: a* W& [' |3 @3 k( x; k+ R
                if (i == m && d != m - 1)" a2 [( I+ j" G4 ^
                {4 G4 u9 w7 c5 B/ P; |7 M
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
8 T1 q1 A) d2 B. I                    continue;
$ L' y0 y' l) v5 k' R& p' y3 a% m                }
' ?# J. \2 U. T& \/ R7 s1 |; Y, ], x                else
  F! ?, R% ?% T* ?( |8 i+ _; D                {" ]6 ^! J$ W8 G% F
                    if (numw[i] != 0)- v. i( G2 i/ l& |# Q
                    {
" s6 ^" S9 E' G1 i                        i++;. \: T: h- \. [
                        k++;) F+ }5 e% j* \9 e
                        if (k == n)3 N; L3 E4 a8 u+ T) g+ M( E
                        {/ U+ Y& S1 I1 `( ?1 q
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了" a) }4 c3 m! G2 S5 n7 s6 @1 T
                            k = 0;1 X' P5 t% l6 Y7 l! _
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
+ g; s+ f  l* u9 z% G7 P                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
" @! [. l; R) \                        }
# L5 x. L$ m% G                        else//输出暂时还没有改变数组元素的值7 T$ J& ~0 n# [7 u
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);; u& B" V+ q9 D2 U9 w
                    }
4 Z# v! b2 t& j# a+ v                    else, n# t4 Y; Q) L& T& p) z1 o
                        i++;//数组元素为0,直接跳过,不计数。。。- B$ ]7 y( m. ~0 a' ~
                }
# a4 H) j$ ^0 ]5 g% g9 ?
6 W. \& z/ H- _/ D- A  m% J7 T1 E  A( Y! E+ n6 O, k5 |0 q6 a9 K# Y
            }//结束while循环8 }' a! }% v$ \5 _; K
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦: X) ^- c- b0 m( c$ q
           / }0 s1 k4 i! k  o; S: w- e/ {+ v1 H
                if (numw[i] != 0)
( a5 t: J7 s0 Q5 b& L8 l. u                    Console.WriteLine(numw[i]);
; {. U$ W8 `; g# t. U& C' k           
( a( Y0 l$ c3 S# L            Console.ReadLine();
3 p5 }) a  z, u& N        }& i! _) f/ v6 p: q$ n
    }
9 W. _2 ?# v, X) M! E& A}; N$ S$ V# |! x7 Y( H
小甲鱼最新课程 -> 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-1 03:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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