鱼C论坛

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

猴子问题

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

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

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

x
大家好!
+ S- y0 ?9 i. M这几天我在忙着编一个问题,我用了一种方法编出来!
  ~2 `: q+ E$ V; G, A. }但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!+ C/ v6 f0 j3 J! U( u9 |
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
% B  p4 ^8 `" K: c, K$ {# a: @# C4 Z1 @( w3 H3 \
5 w9 @# }) c; [! v/ A
                            题目! \5 L! F7 M$ l& m; v
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。9 Q1 A5 O* g2 F4 d
第一种方法:利用循环链表
: y3 W7 N& z+ q& z! z! p% J#include<stdio.h>
  w( X6 ?6 x! \5 I6 G# K, S- y#include<malloc.h>
% E  h5 e* B( L; y  j- c$ H- ?#define M 8            //共有8只猴子
5 s8 t( E6 z9 d- ]( P8 o, H3 B#define N 3            //数到3只时退出第三只. H9 H  Y: U2 i' ?4 F( M  e: s
typedef struct monkey" m0 g2 q/ b( D* W. L' U
{int number;
5 a1 {  R1 y. M! F9 G! k' [int flag;
9 I$ {" r- k" y& Q+ i8 Z% q# Wstruct monkey* next;- S0 f! i5 X( o
}MONKEY;
, w" x7 @) @0 S1 P* t$ pmain()
' }3 {8 e$ U% w3 r( f{ MONKEY *head=NULL,*p,*s;+ J, U7 N- ~: j; P
  int i,sum=0,count=0;
. c7 v  I; b- h; e  z2 s3 M  clrscr();              //清屏8 {6 B9 e% `" j1 E) c
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
5 |, n4 U6 K8 N5 O, f9 T4 \( W. H  p->number=1;p->flag=1;/ j3 c, F2 h; y6 U; Q
  p->next=head;0 }, }) E  o" n0 y
  head=p;
, T0 ]2 ?, Q$ h2 }. E  for(i=2;i<=M;i++)
" ^6 `) D8 v5 g0 @  m: R  `    { s=(MONKEY *)malloc(sizeof(MONKEY));
( S/ r1 j: |% r1 s     s->number=i;s->flag=1;
! N# y: V6 E9 m" T4 c3 [, v     s->next=head;
, r# n) {7 |0 m% x! {; w. I     p->next=s;p=p->next;
. v, S. b! Y! s/ V. [    }
6 m6 v# K6 H' z    p=head;
5 f; O$ k, p7 L: |   for(;;)
! ^  N, t& }0 r4 w& U& G    {if(p->flag==1)
. M% j+ N9 m3 T' C' Y+ |) z! X* h# g       count++;  t$ v  r5 l3 _3 h
     if(count==N)5 [: v: ?# I8 o4 O- r# i+ N9 T' j
        {p->flag=0;
9 {1 v% t; s0 {         count=0;
& D  `$ s* g  z6 `, f' }& W+ g         sum++;}- w' T  b$ r# ~
     if(sum==M-1)
: N, `) z% ?$ u) @* f; r3 e        break;* f% J0 s* ?9 Y& ]* ]
     p=p->next;
3 q: K& o: h' Y3 _    }
3 |: ^5 @# \! V) J, {    p=) T6 k2 g4 E- R9 j
    head;' s7 y5 h# n$ G
    for(i=1;i<=M;i++)! X" U  U0 F7 C: X
    { if(p->flag==1)
& L# x, _. l6 }! R        printf("\t%d",p->number);- E: D4 O* i4 @- b
      p=p->next;
; d; a3 a+ q. z9 Y! `    }( Y, W# n# B$ l3 T( G# L3 L2 j

. p' _# M% b: u# e& X' ~
; L  C8 R% g- s% N
2 p7 {% L/ x0 N$ V( X. o; z/ r}

* D+ A$ ~# f9 O第二种方法:数组
: v- m# X- r% ?( f! J6 f# N) n#include<stdio.h>8 |8 }5 L) n) W& X, N' G# F
#define M 8
# }3 e6 f: _7 p. h9 istruct monkey' [6 P) K1 t% O5 M
{int number;4 t4 D* p- [" Z. ?
int nextp;
* G, q3 N- M% \}link[M+1];! F+ _& L5 ~# R

; M/ G5 ~, B8 ~void main()$ y) y/ |+ t& k1 B8 D* P  l8 Q; C
{int i,count,h;
2 S' \3 Q7 T  Z6 A( E: z  dfor(i=1;i<=M;i++)
) ^2 v! u/ S" P; q{  if(i==M)
, q* s3 W  {9 c0 v( p* `   link[i].nextp=1;
$ b, s, R/ d3 o3 O- g   else
) Z( m+ k! g. z   link[i].nextp=i+1;  X* ]+ o6 [% u1 `$ c2 v+ W6 M$ ?
  link[i].number=i;
- I$ R$ G9 l4 y1 e9 \/ d( t}
8 \$ \; c' p% Y5 x0 ^' lprintf("\n");% M$ o( ?- c& I; u$ z+ _
count=0;
6 J) X0 c5 m5 W) Oh=M;- L9 ?) @: c+ S- B3 q- `" H
printf("依次退出的猴子: \n");* {( m' I# Q* i1 v( p+ z
while(count<M-1)$ f. Q2 `& F7 e! G0 k% T
{i=0;
& d! ^4 g" \! `, M9 P- O+ xwhile(i!=3)5 x% W" M" C' o  v' u
{ h=link[h].nextp;
, ~  y4 v7 @5 h+ L   if(link[h].number)
6 k  E; B$ S9 ?% A     i++;}# z! A6 _% C0 B

' E, d. M7 H1 e; [) O& Kprintf("%4d",link[h].number);
- G1 @* |# ?) @3 elink[h].number=0;
. Y. o5 q/ o" s8 F9 W- Ucount++;
6 J: a# J7 _0 z0 a* ^* a}3 l, O4 ~, s% q& f9 b

, z# _; I* V1 V9 O2 U: @/ D% xprintf("\n大王是:");) b/ ^% U& _7 @9 l4 w
  for(i=1;i<=M;i++)
3 c* H5 `4 n' z/ w: s8 a, h  if(link[i].number), o( W2 t# |' f
    printf("%3d\n",link[i].number);) Q' r* d! g4 J8 n+ T2 w( T

# X0 l$ u; _4 Q$ o' N) t0 n9 ^7 W6 \5 E: D
}

% }! R$ |2 z# k3 y: I/ \+ s  d第三种是普通方法for循环

) f9 U) d% f2 V' h- w" t#include<stdio.h>
9 n- M' i: W. a2 q; z3 r  Zvoid main()
+ F* i9 z8 G9 N7 s# ?# R{ int i,k,m,n,num[50],q,*p;
2 `$ x3 E, F  P. T9 z    clrscr();
3 k  A5 }" {+ T9 n+ m" O   printf("input number of person: n=");
( H& r% }8 e- C' `4 s7 S) U+ N, p8 A    scanf("%d",&n);* n1 f8 O; B; C: C3 z) U! a
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只; o- [1 Q$ X) K& s; `
    scanf("%d",&q);
8 I& Q" N% n! C   p=num;
4 p2 V" i; O; T2 r" p7 K  for(i=0;i<n;i++)
- n) v; {- b& C/ v3 T- d7 }    *(p+i)=i+1;
- {+ T* g: o. ]! W( ]* \0 i; L3 Y   i=0;0 ~. p% D! H  G5 o1 o
   k=0;- j' Z* N$ A8 ~2 ^/ L, N# P+ h+ K
   m=0;
" Q1 h/ N" W$ N1 U: W( y+ t' b/ G0 W  while(m<n-1)  _. i4 \' b% K+ n8 u2 o
   {if(*(p+i)!=0) k++;
& Z$ s; P/ D! a     if(k==q)
- {9 C/ o* }/ @3 s9 d6 @      { *(p+i)=0;
' _% j+ c; D2 r' y        k=0;, ~4 L& W  F& `
        m++;
/ c) G+ B9 W& c/ B      }
) ~3 S7 Y6 n% g9 y    i++;
& b4 d; T, ]+ R7 {) g6 n1 z8 \    if(i==n)i=0;/ f" D2 R  l# T) q
   }* ~) T( ~( e$ O/ a: \
  while(*p==0)p++;& U! L$ e4 O. C0 y; U  G
    printf("The last one is NO:%d\n",*p);, Z7 |. G; y0 W, ~, Q
     getch();
& Z4 F' S# x+ `, P
; b1 J4 a' n' N7 o/ j}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
' ~$ H6 |: X& Z9 O* _. S1 anamespace 又费马达又费电
$ ~; i: s% h+ z4 N; F2 T5 @{7 u8 @. h. ], }- @  f
    class Program
/ i% t3 }0 U' y  Z    {
+ ]6 b9 N& Y% x4 a/ Q& w        static void Main(string[] args)% E$ J4 B: R0 d. {3 q
        {
2 x1 b/ s$ k9 I+ B/ O            int m, n;! a3 b& B9 J# I, d% Z: S. Z6 {
            Console.WriteLine("请输入数组长度");- U' d$ w5 y7 Y1 F
            m = int.Parse(Console.ReadLine());//m为数组的大小- s5 Z0 r7 n4 g2 E- v) }) }+ ]; e4 L
            Console.WriteLine("请输入要截取数字的大小");
! ?9 I0 f+ L& U            n = int.Parse(Console.ReadLine());
7 \8 k( s+ k0 I8 g            int [] numw=new int* t' e$ o% o# Q
1 Y7 Y# ^. Z9 T( C2 I
&shy;&shy;&shy;;
+ [, }* Y, h+ _% L+ w, {) Y; p+ ~            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
$ N5 N$ f- a2 Q4 `) w) h; e. m) l            {2 i/ i7 ^5 |9 r0 \/ j2 ]
                numw[j - 1] = j;
; B- L- b0 B1 N" D+ P4 p            }' y$ O. a' e% z# h
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
8 H$ i% \# F: f. H0 D            while (d != m - 1)1 w1 }# x/ E/ U0 I
            {
7 Q1 Z" |$ H& e5 c                if (i == m && d != m - 1)
& z" N1 L) M& ^) C1 B0 P                {
$ M3 V' W. D/ s$ z4 j/ `/ q/ L: P                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!* |* _( m, [0 U% y8 S4 k
                    continue;
8 }/ c( ]' u& q! Y9 o                }
8 g) X& \  n4 F% F, W0 }                else
) H2 T- n1 q0 n) R4 w4 Z" M9 J                {
2 U& h' ~$ w& q3 q2 S2 s. n# p3 {                    if (numw[i] != 0)
3 ^2 k& ?! N; V* [0 e: m* {                    {) o: g! ~$ g; Q8 h( t
                        i++;# `8 j2 T  w) k* S# a" u
                        k++;+ k+ w( p. S8 F
                        if (k == n)- y0 z8 @9 o. S* ^# e% g) }
                        {
, q" v1 G( `. t5 }, p5 H9 Q                            numw[i - 1] = 0;//把在n位置数组元素的值改变了; x- w/ s7 F) B$ h# n: q% U; [
                            k = 0;
4 v! n: n6 m9 E' T              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
. u- R2 d% p0 N$ P                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
/ t8 u; L0 Q/ ~: |; A$ o                        }
3 B3 E  b6 ?- o                        else//输出暂时还没有改变数组元素的值; O( |+ ~4 F! z  I  j. A: j
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
: {# O6 l5 h' o$ r  a2 s                    }1 [3 E# i9 e7 a" w: z+ z. R# [/ N
                    else7 L% \  g5 f3 |: T
                        i++;//数组元素为0,直接跳过,不计数。。。+ R2 ]# `# G" _) R$ P+ Y
                }5 u+ E0 O; m$ I: ]/ ]
  d0 h4 E. z3 P

3 @+ e; Q5 B; `$ ]+ f# y7 H            }//结束while循环% F8 B1 n9 k& J: _7 e% {
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦4 s) S; \/ J/ y, M1 \
           
7 m- z4 }  V6 ^# i# A4 @1 y) K8 X                if (numw[i] != 0)
1 m% W; {, p- g- D" F                    Console.WriteLine(numw[i]);
; N! w, `" d# ~. V, S; ^           
" X* j- [" C" S# m6 q6 ]            Console.ReadLine();
5 D1 U: S$ \- k; n8 S( c6 g1 g        }) ~- b. }- k( p  W
    }
% L$ a3 h7 d) p2 W+ X5 S2 k}1 y9 f9 D1 _8 ?" q& }' g
小甲鱼最新课程 -> 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-21 02:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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