鱼C论坛

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

猴子问题

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

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

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

x
大家好!
# U$ O0 }4 g4 ~7 [0 C这几天我在忙着编一个问题,我用了一种方法编出来!* L$ ^$ L& V  F+ S7 w& B* ]
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
  c$ k; H/ L( E& e5 y! p注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
- ~& {+ ~  A" t5 f6 B' j8 K4 q
8 H3 [: {2 t6 Y5 m/ u/ Q5 V# N: z: t) C( B" x3 x# K6 M
                            题目8 l) W! r8 c: d, y4 E6 L* V: U
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。: X8 b- }$ I3 F: Q& [, Q% B2 h
第一种方法:利用循环链表
! r+ [$ @8 h5 b2 {#include<stdio.h>
9 e6 E6 q. ]; s: N6 ^. @! ?1 n7 }$ u#include<malloc.h>
( M) ]7 W8 k. |  t1 S0 Q#define M 8            //共有8只猴子: T0 ~7 k& s3 M$ Y8 m
#define N 3            //数到3只时退出第三只
8 B2 {/ _2 Q. V; G8 C. E& Atypedef struct monkey
4 N  c$ ]' G6 _) M9 h{int number;7 y) C/ v, @% a3 D5 b( [
int flag;
2 {, ?: r$ e8 f6 b* Astruct monkey* next;
9 M- q. z: X- D# X0 j}MONKEY;
  M' E3 f5 o4 V: Jmain()3 t) N# S, ^: u- S4 h( H! R' c
{ MONKEY *head=NULL,*p,*s;
$ o  e6 j4 O% Z  int i,sum=0,count=0;
, e* v* X- ]. \3 ?  clrscr();              //清屏
4 M, a5 ]" p) p  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
& W' J$ n- q, b( s! V: \  p->number=1;p->flag=1;7 ~( x! G+ `: }& y
  p->next=head;
- ~! f5 Q4 I; ~3 ?- {8 H  S0 g$ u5 h  head=p;
" K  k. i0 P  `; j6 W: V5 U- i7 L  for(i=2;i<=M;i++)
# F7 O0 D0 z$ c, b    { s=(MONKEY *)malloc(sizeof(MONKEY));
: R* ?$ h" r( h' j& N     s->number=i;s->flag=1;7 @7 x7 G- `+ c+ ~: ?5 k! ]
     s->next=head;
5 m: a/ k9 _/ {! y     p->next=s;p=p->next;
& {  i" Q6 K6 a    }
' m) l! O& w+ M    p=head;
% B; r  n/ a" v% r6 d   for(;;)2 _4 `1 R' Y  y( j0 @1 Q
    {if(p->flag==1)6 {0 M1 ~. ^/ O' ^$ T# D+ i* d
       count++;
5 S" ]- t. c! r( D% z! a! @     if(count==N)
. [9 F$ a& U$ z- b        {p->flag=0;
) @% i5 H. Z8 o, T% D1 r0 g         count=0;( L0 Y# V- w5 h, m" O
         sum++;}* P# z4 t; q8 y. _" h$ O
     if(sum==M-1)$ N! t* L7 D5 A$ N. v
        break;; c( E7 r' q1 y4 H
     p=p->next;7 G- k( _- A: |* Z
    }
9 T' p  P, t% B, g& N0 g- o    p=: s7 \; m* @1 F1 b2 B2 a
    head;
4 s. s& C( ]. G% w# F; v6 }" G    for(i=1;i<=M;i++)
; ^, z0 ^9 ^; u& E! Y& H    { if(p->flag==1)
& N' h  u# M6 ~- K2 v' E. j, ^        printf("\t%d",p->number);# F  M* j8 ?* H3 ~5 @! O
      p=p->next;" u( e. p  K9 Z" P% b- a) X
    }
  h" R$ t9 t$ q. m) w8 {- b4 }* }1 y4 e* D3 I& s

) n9 v, N! M# y  P* j- p5 y/ d/ Q! S7 Z& ]5 G$ b. y
}
6 `3 m0 \$ h- g$ j
第二种方法:数组8 V3 C% L# B' E3 }$ V( |
#include<stdio.h>2 Q& r- j2 F4 n6 u7 {1 v
#define M 8
1 D" {( a& o' V3 B2 F; |9 G2 m# p; Astruct monkey; b8 `# g( I$ P+ R- J; I
{int number;
8 I" H- h7 w3 ^3 L9 n; }int nextp;( T, p3 S1 M9 ]! E& m; \
}link[M+1];, m9 @' n% U4 f4 u6 b5 ]
; n& n4 K* T1 O( r: Q0 D( ]: o
void main()5 z4 X2 [$ s2 g9 ~
{int i,count,h;
8 J. q% j: H  r  J8 E: Z9 N! p, h2 sfor(i=1;i<=M;i++)
, u  F# Q; S- e, i" t9 n% h$ m; U! u{  if(i==M)8 x- V3 c9 f, Q, I- d
   link[i].nextp=1;
' C/ }  \1 U) F" o( Y" F' w9 ~; }   else) g  |7 \( ^6 S' A% z9 v
   link[i].nextp=i+1;
& h# e; K9 q0 |" H$ R  link[i].number=i;
* n0 l$ C" e5 K1 R, f6 j: c0 S}9 W  K6 |$ w  d2 N6 h9 I6 C
printf("\n");6 T3 T* s% q2 C7 H
count=0;) E) |; g% b% f
h=M;
( q- Q! H8 O8 y7 L# H$ a" tprintf("依次退出的猴子: \n");
% n# }& O1 T# w" Zwhile(count<M-1)
, I' h3 h- X/ `1 e  n3 E{i=0;5 a2 @6 b9 ~( U& [  O
while(i!=3)
, e; B+ q5 ^4 }# d$ _3 t4 B{ h=link[h].nextp;
& _  Y2 d% w3 ]7 A   if(link[h].number)& T$ }- i' W8 D; W- w
     i++;}9 e8 u' d7 F" W; [, _; `# h

4 y" b. f6 s4 W7 N% C& W) c( Fprintf("%4d",link[h].number);$ o; K1 z7 m5 Y; n. n
link[h].number=0;
5 I$ |5 V4 p) T" _9 qcount++;7 n' ?! A) p: G  Q3 B8 X2 h
}6 I; o- B$ z" X4 Z, l5 E. ?

6 a; B5 }4 _  O0 w+ |printf("\n大王是:");' l. N4 K5 i0 e4 T/ ^
  for(i=1;i<=M;i++)* Y$ F& o" S4 ^. z& L" A
  if(link[i].number)5 K( L; Y" X  `9 ?4 r: I+ X
    printf("%3d\n",link[i].number);7 @( O/ ^; _% M9 i  I" E3 x& \
& q8 B/ @. e/ C# s! j, m
1 c8 J/ A" i9 y$ ~2 k2 L
}
2 x6 J2 N/ x6 n4 H% Z
第三种是普通方法for循环
8 d) [6 f, O/ S; H) I  h% {
#include<stdio.h>" g9 N# [. k% Y. N: ~* ~% [
void main(): Z: {0 i6 e0 z7 m  M: l
{ int i,k,m,n,num[50],q,*p;  H; Q. s2 V) F! P/ s* Y
    clrscr();% |' Q% G  D' t
   printf("input number of person: n=");/ U$ T3 k! X% Q! d3 @5 G& T
    scanf("%d",&n);6 P7 M8 r6 o( r- R
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只  R( G4 m/ |' l$ Y7 x  h
    scanf("%d",&q);
, c# o+ l. m! b) U3 a4 u- ]   p=num;; e6 n$ W) R& q9 F( J  j+ C
  for(i=0;i<n;i++)
/ S7 `- N5 Z2 }; v$ ?3 j    *(p+i)=i+1;3 ^0 \/ D& a4 I1 c6 O0 ?+ Y8 v
   i=0;
. B% o+ l! {1 b% E3 M- B% _   k=0;
* `# ?5 |8 q. y  V  X) H) L   m=0;6 S9 p% u6 Q( _" a: L. r+ a
  while(m<n-1)
1 t3 R: r  V  M2 i8 }   {if(*(p+i)!=0) k++;
. z8 j& C% J! I. a/ A7 m, r     if(k==q)
# i6 h) ?8 @- \9 ]7 n      { *(p+i)=0;: h) O3 m, n8 Z5 _8 ?3 C
        k=0;
, f8 a4 V' M7 r" \4 t        m++;
( e/ h% H$ l4 ]3 K- W% k' N' v- g5 C      }
2 h( ~; f, y; O  U( P    i++;
6 U/ }: y9 h: S0 ]# l) K1 [2 n9 n    if(i==n)i=0;8 [# p1 X. w+ D' F  t
   }
5 v. R! B% Q: ~/ O  while(*p==0)p++;* M0 |& l/ J4 }* T# f
    printf("The last one is NO:%d\n",*p);& w0 P  D8 }+ K4 k3 B
     getch();
; O' P5 v- N. T: n  p: Y
) p8 S: q: ~8 h2 @7 |5 F}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
' d& i4 P  D2 r4 K+ j3 Znamespace 又费马达又费电
7 c0 h% q  p1 z2 K{3 _2 b7 q& J$ H8 u
    class Program
$ {. w2 b9 |% Y: B  D2 a; P    {3 D# q4 T, V' s7 \
        static void Main(string[] args)+ N7 F) g* z, S: `
        {. Z& f9 l- y, {7 Y, ~! B7 P+ K
            int m, n;6 {$ `# ~' `# X: s
            Console.WriteLine("请输入数组长度");
# v/ s7 V6 a; }            m = int.Parse(Console.ReadLine());//m为数组的大小2 c/ l( |6 l3 V4 ]$ a! K
            Console.WriteLine("请输入要截取数字的大小");
4 t0 b# [5 A: ]  M) ^            n = int.Parse(Console.ReadLine());
4 y8 T- o8 @- w& D, L! t            int [] numw=new int( N& p8 n* D8 Y/ ~0 U
8 d  d. d1 `# F4 Y( `* H
&shy;&shy;&shy;;% y* }* ]/ C* d, a, X
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
6 ~" P" M" S% H5 o% b8 r! o            {& |/ r+ r1 q1 M% U
                numw[j - 1] = j;. Q) t" ^' L3 M7 I* D
            }
+ b; F% H* V0 d. O( ~  i5 l! @) i            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
) H$ Q0 x( V& U9 b' z            while (d != m - 1)
, g/ X" Z+ S6 T4 h            {
+ B7 b' ?7 ^: n                if (i == m && d != m - 1): k( @, a% z4 C- `1 Q
                {7 x) w$ t& Z) V0 h
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
0 o! w. S) |$ \" }                    continue;
* m7 J6 R# y) z5 Z) P+ g% ?                }
. Q8 m  A6 r) K7 [8 W+ h" M1 s4 }                else
! ?, x0 h% ^$ x. Y4 f/ d                {
) R/ s/ ^* V. W0 _. }% R                    if (numw[i] != 0)' x3 \# z! t& g$ o
                    {& I; Q' k9 N* v& U
                        i++;
# ~2 |) R" e, F; o" V* z+ a                        k++;
1 n) ?' l5 e# [& @0 N; q7 V9 O                        if (k == n), \# E+ K$ p, t& D, u3 i: K
                        {( g  t7 g& R' n9 \
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
- Y% S# ~# h) }/ E6 u                            k = 0;
3 k& i- w9 B& e, M$ f6 N              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
4 S0 x! L6 s" a/ [; }                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);& v+ f5 ~8 l( [, I7 K9 X  t& x4 u
                        }' [$ r0 A: e: ^+ G5 x7 L  {
                        else//输出暂时还没有改变数组元素的值2 C5 k$ O( C; H8 k$ W" C
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
' ^. g7 d5 U( U. u5 q                    }
, M, [+ J5 t8 r# n                    else; N6 u" J  W. a9 s  R& y2 U
                        i++;//数组元素为0,直接跳过,不计数。。。
1 a! S$ W9 |' V2 }" D  }3 {  T% Y9 s- b0 r                }; i* D. f7 @2 y  y" X
6 w9 O4 ^, z8 ?  f" |
9 [' H) F7 \' z2 Y
            }//结束while循环/ f' ^8 N: h6 P9 c0 W- l
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
, v& ?! ?4 e- A4 H% V" o' b5 x           ) o- K7 H5 g$ S- P" ~  ?, l4 E) g
                if (numw[i] != 0)
6 d' m' R3 f( v" ?                    Console.WriteLine(numw[i]);
& \1 e1 H5 a& w2 [' S8 F           
0 Y8 X+ m) {* p  Q            Console.ReadLine();0 c( I/ O1 g; m; q! X
        }* e7 O( Z# H: b3 e: d* w) B1 M
    }
( |* `) ~% E7 s. j' k5 y}6 K) G, I" w7 R/ [9 h* `7 i
小甲鱼最新课程 -> 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-22 02:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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