鱼C论坛

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

猴子问题

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

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

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

x
大家好!
( P6 a* d- l, Q" X3 m  d这几天我在忙着编一个问题,我用了一种方法编出来!7 J: E5 O" @, p8 {: {! x
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
. N5 B( B$ N2 u5 C5 j, U注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
. |/ z8 v/ I. S. Y
8 ?* N& |* t# @" H
, z4 X7 i# H6 _' U1 R4 {; o. o
                            题目. z  P9 p3 W/ ^& x* J
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。9 Y1 R9 v; B! a  a2 T
第一种方法:利用循环链表
. B! M( C& I+ U: Z#include<stdio.h>3 {3 B" h5 \& R4 n
#include<malloc.h>8 E9 D. R+ \+ Z+ y
#define M 8            //共有8只猴子
6 Q9 v  T8 i/ h6 @8 J#define N 3            //数到3只时退出第三只
: \/ r5 X. i( q) Z& B# s% Xtypedef struct monkey
- x8 l5 A* Q' A; `; g! b{int number;
5 p0 B1 P1 \) K- }) W# Yint flag;
; E* s& a- E& ]7 Q* V  Nstruct monkey* next;- j7 X& I0 j$ b% L
}MONKEY;
6 ~7 T- V$ C" A3 x5 U# g9 B$ \: Dmain()
, R: j, x8 y9 T- d{ MONKEY *head=NULL,*p,*s;! A- |& U- u- H2 w2 e" O
  int i,sum=0,count=0;* r9 b' P/ w, G; @' T- v! W
  clrscr();              //清屏
. s! O& J2 X5 C3 S5 I  o  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存& f* d9 y& C0 b" y) \2 E/ C
  p->number=1;p->flag=1;
- z+ C% m1 W1 c% S  p->next=head;
4 S5 E" b9 g2 ^5 d! I0 U  head=p;: ~( O+ X" _3 F
  for(i=2;i<=M;i++)
* J6 {( g+ D9 T" K; J    { s=(MONKEY *)malloc(sizeof(MONKEY));
; c# E% i& n) Z, O     s->number=i;s->flag=1;
6 `5 b! t, S! C' x  D+ A     s->next=head;' k0 |- m( s* k9 B6 ?( w. f
     p->next=s;p=p->next;
6 Q/ J" Z' a( S4 U! [    }: x% |+ I! F  ~) s. t. P( r
    p=head;" ^) |& t% ?! h5 P1 x! b+ y. `
   for(;;)/ a9 q- R0 S# l" f8 p. q, L
    {if(p->flag==1). C% A) B5 u" k: i% _
       count++;$ H9 a9 C9 f$ S$ k0 {2 G5 n
     if(count==N). u6 j* s' U! R) D
        {p->flag=0;
% f$ b4 A0 q7 o+ B         count=0;! U! v. K/ `# X# o
         sum++;}
% u: h& b# l9 ~2 y$ i     if(sum==M-1)
  s& i: X" I; i- i, H( g        break;' n4 C& x% x9 ?- B" N" W; P; p
     p=p->next;' A" ^$ X% [. ]4 r, e
    }& F, Q; m9 Q/ @6 ]' q
    p=
4 e& p4 _8 V, J9 o; J# c; u    head;' k" G# |( T4 ]4 @
    for(i=1;i<=M;i++)3 a5 I* l/ j2 C$ i
    { if(p->flag==1)
# T6 f. ?& ~3 n. Q9 V        printf("\t%d",p->number);( D$ O. m, Y2 k& z& n
      p=p->next;
# j8 D6 X5 l8 G& \! n: O+ N    }
: e6 ?6 d5 r7 j7 k
, T$ ^! W! _6 m9 E3 H) B* `1 L" e4 W
8 c$ Q+ a0 ~) q; V/ B3 b) M8 h, S! t! ^7 K4 B
}

* |+ W) Y# J! D0 w9 r第二种方法:数组
  K1 J" E7 w' z: a* W. s+ R#include<stdio.h>
. ^8 s- T  ]. I, g2 Q/ w#define M 8
2 P! e. H! i, a9 l3 R& I/ xstruct monkey
  l# X$ P) F7 x; b; K* y( q* Z{int number;
7 m( j* L1 g& j# X7 l, ~int nextp;/ M, j8 R: X+ s/ ~
}link[M+1];, O0 D+ a) e7 b6 i$ u3 H8 _6 ~6 s4 N
) g/ B! o; d9 ?# D# |, `
void main()
! b+ T" ^4 F. f5 M8 p0 P" S{int i,count,h;
+ f+ _3 a! R8 ifor(i=1;i<=M;i++)
2 b1 d. x6 k4 _6 g& \0 B{  if(i==M)" g9 ]6 R6 n! n. H- U
   link[i].nextp=1;
4 y  |2 ^  E2 h   else. [3 s+ g5 y7 c9 t6 |. X
   link[i].nextp=i+1;
: }3 M; i" Q9 Z! T2 U( o. q  link[i].number=i;2 W: U) E4 B; ~
}
2 Q4 r+ j& q% U. a( Z9 ~9 s2 \printf("\n");
- |% R2 k) t! r3 `/ @count=0;
6 D! r4 l& O0 M0 h% N1 q  r4 Z7 Mh=M;4 [2 ?, I* v4 P  E. _
printf("依次退出的猴子: \n");2 I, a: d# a6 _& N* K* T1 D" i
while(count<M-1)
8 h$ @3 A( O7 V# ]{i=0;# ^& E7 q2 `: y4 D6 u& i* t0 ~
while(i!=3)5 W3 m$ Y6 a' h1 r7 B% j% M9 O6 K8 Q
{ h=link[h].nextp;
: P# f8 ]7 L" K1 j1 r" c$ u   if(link[h].number)3 M$ W& K+ ?# z, F- R8 K" K
     i++;}7 {- x2 t! i, }1 H) ]- f0 m& t) ^3 H/ b
' T5 a& C  l+ b  a
printf("%4d",link[h].number);
5 h1 j: j1 ]" n9 n! b0 c1 Q6 Llink[h].number=0;, S' r3 L. d% E
count++;
% p% F" Z- g- G}, B! u7 U3 s7 J' I

, M( Y0 H1 G  G2 L4 Jprintf("\n大王是:");, c& X, y0 Z$ U' u5 g
  for(i=1;i<=M;i++)6 L4 E! Y* f5 l3 t8 V$ z
  if(link[i].number)  I7 L9 P/ ]* A+ x6 Z! r& J( g( F
    printf("%3d\n",link[i].number);
3 J8 D6 ?- ^- v5 q7 i  a. J
, H0 q; L& ^5 [/ ~* u9 E( s0 v5 z; h0 w9 V0 a4 P( e/ J
}

2 V1 _8 Q+ b: l  I第三种是普通方法for循环

+ @) T. B4 P2 }$ {5 @#include<stdio.h>
9 ~) J/ j) {+ D! p% y! Yvoid main()
8 s8 u9 [2 v/ T) P{ int i,k,m,n,num[50],q,*p;9 Z/ s' ~% ~' f
    clrscr();- n' W4 o3 l: y5 `0 c
   printf("input number of person: n=");
! K/ }) v8 J* ?& G0 Y    scanf("%d",&n);
- t1 h1 f% a- v" _9 a7 kprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只. I3 d2 o: s9 ?. x
    scanf("%d",&q);% G; e3 E( }: n& C, B: |
   p=num;
/ U' T  H$ h/ E4 N3 u  for(i=0;i<n;i++)9 ^7 y" _. s% I+ b; Z" q$ E7 |# y! ]
    *(p+i)=i+1;
2 D% L4 N. y" [6 E1 w   i=0;
! @, V0 w+ `4 D6 E/ r! @8 y   k=0;6 \. ?6 P- O! Z! f0 J- q+ f# u( |0 E
   m=0;
) v. v- T7 p% K, d9 |2 l3 E' e- q  while(m<n-1)
5 X3 }* ?5 [" }0 M& s* v" h7 h   {if(*(p+i)!=0) k++;. t8 H, I' q5 [; @
     if(k==q); t2 u9 J) g  A3 m. E
      { *(p+i)=0;/ a! ?/ u: p, F4 P9 G
        k=0;
6 g, s. q' A( b        m++;
3 H" @. D0 m7 Y0 I( H% r9 E      }
( a$ L% r& M6 ?# Y% l5 y3 S    i++;" N) Q8 z  }; o. @( F1 E1 H2 W
    if(i==n)i=0;) E: T2 h! P# J  y6 ]
   }
* N3 `( k) L9 e0 C  while(*p==0)p++;  c, r9 i, N2 \' F8 y; B
    printf("The last one is NO:%d\n",*p);
7 [" I8 y; C! z, [     getch();
* p8 U% v+ j0 i3 D! J; P, Y7 k
7 K- {3 v9 \( K/ _& F4 \8 z: C}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
9 G0 Z2 Q; F0 [$ j  u  s5 M4 i- V/ ynamespace 又费马达又费电
/ D. W! s7 J& Q: s{
& \6 I6 t9 ?9 B7 h7 Y: x    class Program* ^/ G  l& P" K
    {
% h; v1 {1 N+ a3 k& Z        static void Main(string[] args)$ ^3 u; w) n' m+ R6 w6 c* d+ B* f
        {+ O1 x+ ^) v9 q' `8 u
            int m, n;
- P. P4 n' a6 M9 N0 `* c            Console.WriteLine("请输入数组长度");6 n7 R2 E/ q& ^0 `( c# i# x
            m = int.Parse(Console.ReadLine());//m为数组的大小! V' u& `$ W9 W, l. }3 M
            Console.WriteLine("请输入要截取数字的大小");" A- ^3 P/ B# b7 C0 O9 x. {6 t
            n = int.Parse(Console.ReadLine());* K0 {6 t& t. y9 n
            int [] numw=new int
& S5 b1 J2 ~+ G& b5 b' |/ c" h, I. d$ z- G; p
&shy;&shy;&shy;;7 o3 z) u5 R6 P6 d: _: b6 Z0 Q, Z
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数4 o$ W8 [0 q5 p! K: V' F
            {4 x+ S9 D. f' R
                numw[j - 1] = j;
. }3 G, Q5 l9 q& K            }
+ S! u/ N1 P5 U- i9 X            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!" t& F  p# C' q$ L: y3 V
            while (d != m - 1)/ f" p; F9 F) k/ ?7 W
            {
( w0 q+ p0 A- y% F: }                if (i == m && d != m - 1)
* V6 V% e2 ^; C8 `  a                {; {& I& u: v. Y
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!) M/ G8 ?. e& o  M- C
                    continue;
9 q# B, P" |/ d3 P) ~$ N8 Z                }
  y: C" s! W- R* z" Q                else0 Q+ A- X5 G$ ~5 K# ~; I1 A" H
                {
: W9 ^/ o0 B9 B                    if (numw[i] != 0)
$ P+ n: l6 O4 H, W- O' B                    {5 V" R! ^: _; e1 ]$ a9 N* J
                        i++;
$ g& k# K; B9 e0 L# Y                        k++;4 h3 G% Z$ n5 r
                        if (k == n)* t2 C* B3 ?  y7 d$ b; p# |
                        {
6 E( t; W. d( e* r" x1 ^7 b                            numw[i - 1] = 0;//把在n位置数组元素的值改变了+ ~$ H9 ?# `; @; {5 M' t; c
                            k = 0;6 k8 o2 J& Q4 {
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
+ S; V- B  c6 e* M3 ]. v                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
6 L5 N9 i& A! z% ~# n* e                        }" {% m" F8 o* u+ q3 ]
                        else//输出暂时还没有改变数组元素的值5 B. S. O% x# n! d4 c- w7 [
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);  I2 @' q0 d6 h1 q# V7 S
                    }
' E: O& d; F' q$ `  Q                    else
1 s; m: f8 R) C- C$ f4 N0 B                        i++;//数组元素为0,直接跳过,不计数。。。
; Z& F9 I% e" \! D0 P                }
9 E1 o9 E- G% j& U- v2 ~
9 C! E. c+ o  P- q9 K: _2 d( v% c& s1 u. X9 V
            }//结束while循环
2 w) c, I: Q) H$ ~2 S* f            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
( C, h) A. J# u6 @% n  w2 l           
  _/ q( V! F/ x1 M                if (numw[i] != 0)6 S8 Q2 q2 z, x  |$ k
                    Console.WriteLine(numw[i]);/ j  r6 J$ \' d) e" }+ Q" R) ~& }. @
           + U2 U9 G: v8 k
            Console.ReadLine();
8 Y, f9 V* {- V/ ^! |/ \) v        }
; S7 X% o! t  i+ y! c    }
2 d! r, M+ w# B/ \8 d4 q' f}6 c% @1 h  a4 c0 q
小甲鱼最新课程 -> 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-18 11:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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