鱼C论坛

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

猴子问题

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

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

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

x
大家好!
8 F% H/ F$ r; z5 U: u这几天我在忙着编一个问题,我用了一种方法编出来!" J+ Q! r# ~( t- P9 c
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!& U* Y7 W, R! {6 B$ O2 Z
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
: M' f1 U( R5 ?' h% l' W1 E' M/ |7 g1 n2 D; l; r  o
% ^, c2 D) o" L
                            题目6 i7 S" D/ v: @* o0 `
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
  j- Q7 I9 V1 p; y第一种方法:利用循环链表/ L' D) m3 l4 D
#include<stdio.h>8 o0 p0 l- l* k) M- |
#include<malloc.h>- u8 h/ ?9 a& \( Z9 l3 M6 `
#define M 8            //共有8只猴子
; |+ J' W" k! k#define N 3            //数到3只时退出第三只
( i4 i+ d, N8 S8 b* ~typedef struct monkey
$ n, i/ u' |4 z3 {- c8 {) `! \" j{int number;
6 T& \% g$ v: {5 c& Tint flag;
: n7 `- ^  |/ d6 m) v0 w! G5 Zstruct monkey* next;
) q4 U- i" B! @( v}MONKEY;
* `+ n; ^5 [/ i& `main()
! K3 l3 @% U' J. j+ ~3 a" K% v0 q7 h, t{ MONKEY *head=NULL,*p,*s;4 _, z# N( j* C
  int i,sum=0,count=0;
" |  f! s: V) L4 |0 H: M* p  clrscr();              //清屏# n5 t5 e# t' r. k& I4 {
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
" E1 V  c  H3 C6 p4 ]  p->number=1;p->flag=1;. @0 @: g$ C2 H( \2 l; C% v1 w
  p->next=head;
& m2 X" E' W2 T, }  head=p;
( {  k" \: e# F5 }' R  for(i=2;i<=M;i++)$ y" ]- X, o1 w( ^- A
    { s=(MONKEY *)malloc(sizeof(MONKEY));$ i# |% e0 A- U% V6 P8 y
     s->number=i;s->flag=1;2 O7 x# x  P' H& F: L
     s->next=head;3 g# b7 Q) i$ _( \3 y/ [. P: `! W5 [
     p->next=s;p=p->next;
4 `5 {' A& n/ X& N) _    }" U- {% U; v  v
    p=head;. B& F6 B% [  o! H
   for(;;)
/ q6 z* x) f# h7 {0 |+ A    {if(p->flag==1)2 t4 p: W( b0 `6 B  M
       count++;0 h9 ]8 L% m1 ~! M8 O
     if(count==N)6 {6 b: ]; I7 {
        {p->flag=0;
( a9 e; j& u+ ]* J2 ^         count=0;
- Z$ M4 c" [% _  @0 D         sum++;}
3 u2 y; i- ^8 n3 J# |3 F* D3 Z     if(sum==M-1)
: \) l/ A; w0 B) A" z- w        break;
0 @. s6 s( w* Q+ [6 p8 ~     p=p->next;
  a/ f. O! h* _; G, e7 d5 N  g9 n    }
: h. M7 X# E& B  x/ y7 x$ B; m+ y    p=
4 [- E# p! d! v- ~* m$ o( u    head;: I7 k" ?7 k7 w2 {
    for(i=1;i<=M;i++)2 \4 J9 E! m) n
    { if(p->flag==1)" }: A" e9 I7 G3 X
        printf("\t%d",p->number);
8 g. {7 V5 M0 ]  T; C/ Z" a      p=p->next;/ W! C( Y/ b" @- G5 ^: V. |
    }
7 h. o" U- c6 `" B* J3 o& N, ~
; t8 U& y7 ~5 j5 ]( C  c5 @
7 {3 X+ r/ [1 c' d& q  V8 a# W, i5 @: B6 n
}
* r! q2 S& m2 k! W# e
第二种方法:数组
+ t! b$ D* I4 w4 }! K0 R3 Q' g9 f#include<stdio.h>
8 e& e5 h0 A- _0 q#define M 8. c4 b( a; z3 V! j/ A
struct monkey0 E: ^1 V& F/ Q0 S
{int number;$ h' A1 c( [* j, R
int nextp;8 [9 u7 L1 O5 u% t6 O' X% O
}link[M+1];8 y' S6 ~8 e3 d
2 R8 |6 s9 \; @; U/ U) g9 n, H
void main()
  p9 j2 V0 h2 m4 W/ R{int i,count,h;
. t6 M4 x6 z3 w- Rfor(i=1;i<=M;i++)
( b4 j3 A9 @) B! p/ y{  if(i==M)( o. s" A# s6 E1 _* Y- A
   link[i].nextp=1;" ^9 k  K: w# P! W
   else5 f- U9 L; S: r; d, @! M
   link[i].nextp=i+1;
2 r! H* D- O2 o. Q0 K( L  link[i].number=i;" n' l% b' d, p8 F7 }
}
0 n4 l& a  L$ O% k9 G) i2 Wprintf("\n");
" O: Y- W, V. c6 t( |count=0;3 X( t% Y& |" C0 e! s
h=M;0 f9 @' I7 U' C$ B) d2 Z3 g
printf("依次退出的猴子: \n");- g3 v& X. e1 N, p' b6 D; I
while(count<M-1)
! D: f' ?0 J; s$ ^6 Z' j{i=0;
+ @' u. O, p4 C9 z" |1 ]5 W8 Ewhile(i!=3)
0 P, S( ]% M% I; j9 H/ z" D+ w{ h=link[h].nextp;
% C% k- h: h8 |2 b$ h& {6 E   if(link[h].number)
1 Q, o' p8 }& `6 o0 e; Z     i++;}% q, H, O8 {$ O) I0 l

- \( F( F6 E. [0 X/ F% tprintf("%4d",link[h].number);( ~% `- q2 ^/ V8 H+ Q$ O, g
link[h].number=0;% @& h; S9 w9 f% ?
count++;
& S2 f, L8 n4 q/ Y/ B" c}5 ~8 C' E0 c0 D1 F$ D
& Z; r' P  d" ^& b  j% e
printf("\n大王是:");' k* {) a8 M6 S$ Q1 I' [5 Y
  for(i=1;i<=M;i++)
, `. J$ d* E1 k$ k& o  if(link[i].number)3 S% w+ R# k! y- Y
    printf("%3d\n",link[i].number);5 N( [1 ~  S) H' q7 ~
. T$ F8 C% @2 Y! Z; c3 g

8 _% W6 D4 `  z. K2 \}

; K, x5 s, ~# A2 {1 X第三种是普通方法for循环
% y2 U+ ?' k5 l" t
#include<stdio.h>
( [0 \1 j" u; x5 }void main()
6 G& R0 Q1 w3 a% c. L{ int i,k,m,n,num[50],q,*p;, b. M, I  A* z
    clrscr();: O, z( @% s  q) F
   printf("input number of person: n=");
2 C5 W2 @. T) O8 u; s5 R3 [- J    scanf("%d",&n);# `& U+ w2 j) D: r. T( c" |
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
2 K3 U1 @/ e9 u& F5 Z5 v7 V5 Y    scanf("%d",&q);
" H+ `3 ~, t& J0 S, k   p=num;% \; t+ I. [7 u6 C
  for(i=0;i<n;i++)
/ e$ u9 j9 K; d8 A  Z* \+ a    *(p+i)=i+1;
9 g, M9 v, Q! Q' V4 L8 t   i=0;
# a  e# A' i- F4 S) U   k=0;
1 L0 N4 F9 R: ^: j9 L! y   m=0;
  w8 `4 N, F. s+ |6 k* N* w  while(m<n-1)
( u3 J  ~* O( B) j( n- N   {if(*(p+i)!=0) k++;
, C9 y3 r+ S# Q     if(k==q)
- g1 u+ r7 L- d, y( q      { *(p+i)=0;
2 I" g0 [( K# y. g- R8 ?        k=0;# w. S4 K5 J  y4 v  D
        m++;4 i5 u) k* W# K: c: h5 h0 T" Q$ T
      }4 b$ n% Q0 o- Q2 N
    i++;7 F( J% y, D0 e  F
    if(i==n)i=0;
" W. l9 n5 T: R1 h1 m; {8 p* n   }
% l# `/ h  P9 A5 n- k0 ]  while(*p==0)p++;  n/ p  N) x2 \) p" X! B2 X
    printf("The last one is NO:%d\n",*p);
: `. J# p5 U2 ?/ ~$ z6 S" C8 G' r     getch();8 a# |. s, n3 \* v2 x& x

, k: I+ g# b* C" a: f}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;" [9 v5 F+ I& p% ?* {7 t" `  v: f
namespace 又费马达又费电
" }2 p$ r9 b1 n  T% K{
7 p2 \$ W% e! J8 p8 Y4 i, J  E9 G' }    class Program
9 j& L% ~. m' s! o& g2 Q    {
+ w2 y: P+ n. Q        static void Main(string[] args)  g: Z! g5 O2 K2 b, i$ S
        {! |4 n& _7 {( y8 V6 r. E
            int m, n;( R) b2 Q% u7 ~4 C/ Y. h( }
            Console.WriteLine("请输入数组长度");  U2 V  o2 M! L
            m = int.Parse(Console.ReadLine());//m为数组的大小& C8 `- {3 U9 D6 r' @
            Console.WriteLine("请输入要截取数字的大小");
4 \0 F6 u+ q' D; T- m; x4 J            n = int.Parse(Console.ReadLine());
7 {8 u) B) k, }. ]+ s2 P            int [] numw=new int
+ A* K( ]# y/ M; j
# D# N: t" f1 [- S- g9 u&shy;&shy;&shy;;
9 u, Q& N8 d# H  [: ?- I            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数' s0 g& |8 Z2 T5 ~& i" H( ^7 m# @
            {
5 V& P: o) T9 ]3 `2 Z4 d2 R                numw[j - 1] = j;
  W7 p9 o  p* s4 m            }
6 }" C  o2 N  s9 c5 _) H5 l            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
" k; B" C. h9 k            while (d != m - 1)
' C% t: a( d5 _- y2 ~            {' P' B  \) z8 b4 Z0 I( U
                if (i == m && d != m - 1)
6 ]5 ^) j3 @: B/ X8 E5 x% O                {
4 Q+ O; r  S. x                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
1 O: X* b/ e% y                    continue;& d6 P1 M, }5 l. e6 n( o
                }. a- m$ d& o: l9 p" f2 V7 x% j
                else
+ g2 C0 P! V( X7 b                {2 [) d( w3 D% X. z
                    if (numw[i] != 0)
! R1 n1 @2 _( B. _) V                    {
  K! S) J5 x" l( x& |, q1 _                        i++;
5 E  u5 F% P# d% k; L                        k++;
* f  _7 L- F5 ?/ g" N/ r: Z                        if (k == n)7 }1 A1 A/ D- K' o  c  D
                        {
: b# L1 u$ E5 O% w2 |                            numw[i - 1] = 0;//把在n位置数组元素的值改变了! K7 {( e$ g; \! L
                            k = 0;
; d: a4 t3 U1 J. }              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
2 X' J% ?0 o5 t. G8 l8 o6 B/ z4 d$ m1 k                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
. D2 w$ I  s7 T" K- K1 g% L                        }
. w) j; F: v/ X; \+ g5 f* F0 `                        else//输出暂时还没有改变数组元素的值4 }2 M7 C/ A( i* H2 o
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
/ s. `3 N, f  I) D6 p! y                    }
3 T: J. [0 g  T# P                    else3 G/ A! ]5 y. W4 v3 c
                        i++;//数组元素为0,直接跳过,不计数。。。% Y/ }' E$ y+ O  S7 |+ D; f& Y- ^
                }& {, T# t* }4 H: y/ B, W& N  Z

$ B1 F; O$ j: T, Y2 w( |. U9 @* w$ b. D
            }//结束while循环3 h9 z; V  E4 Z
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
, K5 `4 j8 w0 R) }, A           
. ^4 l) S4 @$ J, S2 |% Q8 P+ n                if (numw[i] != 0)4 E6 L5 A; p% v4 [
                    Console.WriteLine(numw[i]);$ H: H5 }4 x6 R, q6 t
           
/ S% l: Y+ S: g9 I, @* r            Console.ReadLine();
! c; f/ U* c  B" N% c7 J) O        }
+ X7 `6 y0 O0 W& |0 K    }# E- n& c, x' P# x
}6 c, `6 W  V' i7 f/ w' F( n
小甲鱼最新课程 -> 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-6-2 23:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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