鱼C论坛

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

猴子问题

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

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

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

x
大家好!& S1 w  q$ q; j* I: A  ~( H& U# J. i
这几天我在忙着编一个问题,我用了一种方法编出来!& N! [. N/ w8 P8 S* |$ `& w+ x, B. j
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
6 n& S+ z9 s. {' ^注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 * @3 a& j# x* M# K3 J

+ L# V  E+ g7 C. P5 D" d6 v/ U) a
                            题目
0 c6 ]2 P+ Q, |+ X' M1 e山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。0 p$ O9 J9 X7 q: v1 L; w: B2 Z0 k
第一种方法:利用循环链表
$ q% c: @5 F' f5 ~8 m, p#include<stdio.h>
/ D% k6 x6 A5 k% `' N#include<malloc.h>+ C# _+ F; [4 m) F, p. U
#define M 8            //共有8只猴子/ u2 f% W1 F4 B0 O% h
#define N 3            //数到3只时退出第三只
& b! u6 ?$ `& {: L( @typedef struct monkey+ t* c% C1 w6 h- [4 q  p  P# z0 i
{int number;! L( y" j! X) s. C# F! M
int flag;- }6 V7 v. h7 w- R
struct monkey* next;
: J0 f+ }! r  O+ I5 g( R- a}MONKEY;
$ ]- s. P" c" f9 O+ X; mmain()6 l) w0 h! G( ^# ?
{ MONKEY *head=NULL,*p,*s;
, ~/ d% U) B& `  int i,sum=0,count=0;# x: g+ U- [  W8 n( u
  clrscr();              //清屏
: t! Y* w# [( U5 _1 u2 S  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
  c5 \1 g# G0 q  p->number=1;p->flag=1;
* i; E4 h. H* _" x  C  p->next=head;
' f" k# z, z7 a, o' `  head=p;* I, M: t4 d) I" \1 x8 L
  for(i=2;i<=M;i++)
( Z: B* E1 N: ?# d    { s=(MONKEY *)malloc(sizeof(MONKEY));0 _- ]. v7 m5 x8 X3 W% `
     s->number=i;s->flag=1;
- ~  u* m7 I# y. V     s->next=head;$ L- s0 `/ E# [3 B  T, Q1 b, C8 \
     p->next=s;p=p->next;. o' H! v0 r& ~) f: P9 l3 R
    }
' V0 E) b8 `. @% V    p=head;
. {' O. \3 A; l4 j# }& n( p   for(;;)
! T/ j5 ^& e7 P  S    {if(p->flag==1)
7 E4 R. x3 u, Z. \1 }* U0 c       count++;
4 b2 ~# r( ~8 _0 Q$ j     if(count==N)
+ Q" O' U# |) k, U        {p->flag=0;
) B7 u% J( X8 {$ |  n: L) x         count=0;- J: H6 U9 R9 }8 t% X
         sum++;}$ K2 [( Z1 ]* K0 [1 I" @' i. D
     if(sum==M-1)( J+ p4 W, y! F1 e2 p( {6 v
        break;
6 Z$ W( e6 W+ z& Y6 F; Q/ \# h     p=p->next;2 l. }0 `7 @' a- Z$ c) i( _
    }" a# F9 [+ Z. A( X& W+ G+ d
    p=7 s, y* |) o, n
    head;( f3 b8 S+ ?; k8 U5 i
    for(i=1;i<=M;i++); m/ a- Z* o( Q+ j: U3 Z2 M4 l# K
    { if(p->flag==1)
* A; }; f2 _: ]5 g" E        printf("\t%d",p->number);5 Q5 [# I" R! N7 w0 @8 C
      p=p->next;; B$ q" x( N3 X2 p* |2 c+ R
    }5 _) L: t- l9 G5 r5 e3 ?
& P; b% @/ B8 n1 e! D3 H1 U
+ V( F# ~4 d- T  S9 H2 h
) ~/ }8 [( q: i" k
}

; _# d/ u; [; g7 E第二种方法:数组: L0 w1 U  J; b( m9 y2 Z6 h
#include<stdio.h>
: o- g! G: L: f: L#define M 8
2 G; F4 l' \: g- W6 @4 k9 Zstruct monkey- y  h0 F7 V: g
{int number;
! a* c2 w. [! {8 U- i" uint nextp;$ Y& K% A; P6 |. C/ \8 y+ U
}link[M+1];0 H7 A% [' X' T, ?1 R8 M( H* d6 w

$ ^- L7 t, |0 f6 V% p: G3 z/ T% ovoid main()
$ N' Z5 W* {& ~# E8 x& x{int i,count,h;
! ~3 Z. }- E' a* m, r$ [for(i=1;i<=M;i++)
+ P+ ?. X4 x6 F, O1 [  ^5 N{  if(i==M)+ `) [) X4 n( h- j: C
   link[i].nextp=1;
" b" E. h6 t' S2 n6 t   else4 A( |' d; k5 Y6 ~
   link[i].nextp=i+1;1 r; o% t% X+ U2 A3 r2 P/ [
  link[i].number=i;- B4 A  I# b9 @
}# ]0 |4 d, R8 |4 w5 Q7 g
printf("\n");" W+ q1 i# B! ?3 }1 e
count=0;
' e9 w0 J- z8 xh=M;: J& @4 m* z3 N
printf("依次退出的猴子: \n");
' F2 d& O7 O( v' f2 q! Jwhile(count<M-1)
; b( Y6 m+ K3 c{i=0;
8 r" n' c/ \* k5 T" E0 C- @# ]while(i!=3)
- l/ o% w2 k) _7 K4 B{ h=link[h].nextp;
% Z' M- f8 i" j, v7 b   if(link[h].number)# U$ B" z8 f0 a0 ~' W5 @
     i++;}" w1 O# C# u* g" W! b9 s4 a

2 @' u8 C) p3 R  c& G0 z6 [printf("%4d",link[h].number);
* D5 G+ i+ p1 }$ a2 s" U/ Flink[h].number=0;+ Q; I& Q* `+ w. a  X) L
count++;# ~; M( S. l1 ]$ W  N
}- K- s& z$ f4 u
+ ]" d2 `, ?$ ^  J# n3 c
printf("\n大王是:");2 r0 Y/ m* b) J3 A: i, q3 i( H
  for(i=1;i<=M;i++)
3 D3 o4 x% z  h' R9 b. r- b  if(link[i].number)0 y& ?& ]+ S' H+ @
    printf("%3d\n",link[i].number);" @+ n/ b) Q4 i4 g& j& b
+ z9 D4 D8 b3 \1 z, a
3 d8 L8 U3 M% i
}

# x4 J! Q; ~8 X! t  C第三种是普通方法for循环
) ?) e, i4 }9 A; b& _
#include<stdio.h>1 U) d8 l; ^  c+ z0 P) n
void main()5 G3 V" m2 H6 {- m
{ int i,k,m,n,num[50],q,*p;
5 `$ _9 E2 }: B; D+ L    clrscr();
' v: c1 d* w6 f5 V# t   printf("input number of person: n=");
5 U6 N) B! M* ?+ c! n/ J    scanf("%d",&n);7 K- f/ y6 M3 p, Q% }
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
& d6 O1 ~1 [0 W' \: B0 ^8 M$ m    scanf("%d",&q);
, s, T- d& O% _   p=num;
; x  {: r  J7 w% d- I! p  for(i=0;i<n;i++)& I* C2 b9 m# [
    *(p+i)=i+1;
- Z. U7 b% i  w* ^6 C   i=0;6 k; L5 A3 j" n% t+ B+ ?) f' s
   k=0;) f9 A# d8 n  h$ r
   m=0;
9 o# P  O2 ]) s" ^* a5 y8 y  while(m<n-1)
. N$ x7 ]" v$ p: o( @4 \9 h   {if(*(p+i)!=0) k++;
- K8 M+ i( `6 E2 ?( R* r6 E9 ^     if(k==q)" [4 R8 o+ V* m
      { *(p+i)=0;
+ u, e0 ~1 Q# s6 H3 ^& Y" i; v( N9 `1 p        k=0;3 U( z' U3 F- a% W- n2 _* g5 e
        m++;
& y. I4 k3 S! ]( d* M1 o      }( o* ~  p0 X6 E* \
    i++;
% \: R' O: i% D+ m' O/ \8 g6 A    if(i==n)i=0;6 k/ ^$ ~$ Z0 C+ M' {  l
   }
- b. ~  l( B. ]1 Q$ y  while(*p==0)p++;
6 V; M  j- }) B* n2 ~; G( E    printf("The last one is NO:%d\n",*p);
0 X" V% U$ k# {9 }2 \1 d     getch();
. D0 I) i! m0 g1 `4 B0 C2 H
! R) b/ @8 W9 t) E}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;: p/ E* R- N! B9 J6 Z
namespace 又费马达又费电" n- ^: z9 p7 R
{% N/ S9 ]" {  y( m7 l
    class Program
* e" w/ Y# F' g3 Q    {1 G0 J3 V% Q4 R( i
        static void Main(string[] args)0 m! P: r. p, y8 n3 H" E. p+ G
        {( G3 z  f8 m# G/ r- m0 _) K
            int m, n;4 k5 U: I  H4 A8 K: Q/ r5 n
            Console.WriteLine("请输入数组长度");& {9 _0 p8 u+ ~. H& P& z
            m = int.Parse(Console.ReadLine());//m为数组的大小! [( K9 G4 h' O0 T8 f3 S5 \% l
            Console.WriteLine("请输入要截取数字的大小");
: O* e" K+ d3 n& [- ^/ W            n = int.Parse(Console.ReadLine());' d- a) \" S  A' L
            int [] numw=new int
) H' P( O1 L* o7 P0 C5 p+ `! v
+ r% {- D7 w) P' z- S&shy;&shy;&shy;;
, F7 _) G7 s7 T/ N- Y            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数0 N/ X4 P$ N8 q1 G+ h( q
            {
) n( d+ {0 }: j1 L) k  K                numw[j - 1] = j;
+ z# m- H* W9 g            }
6 b! G; t) D# I, x            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
, v5 ^; P/ w$ P7 K            while (d != m - 1)- z  \% N( v/ e! o- ~9 n" i% ?
            {
5 {& B$ f- S% v& D: R: b5 {4 b                if (i == m && d != m - 1)
2 A  k$ i% [& D8 A( W                {/ h+ z8 a1 y: _1 ^, i
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!0 C5 K* y9 k! `1 A
                    continue;/ p/ F( U0 J! S( l
                }9 p- W2 ~1 V' U& N
                else
5 V; w! e2 J5 a: q% D& ~                {( k; }/ T+ H' ~- W2 F( p" ^
                    if (numw[i] != 0); |4 P7 z" \9 _, B2 L; P- K
                    {
3 y* x! E1 O$ o; ~5 d. T8 ]" z  ?! C9 v                        i++;& _: t! |' |8 c' ^' ]8 S+ K
                        k++;
' J. {* t8 u4 \0 u/ m/ D8 e                        if (k == n)
+ d4 B# A& K) t$ x) Z                        {
; G# O- u0 n& M5 Q                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
. W4 V- v  G& e' o6 W  t) @                            k = 0;/ U' K/ L7 s! [. i* D0 Y1 J: T
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1$ N! U# Z! \  t3 v% e/ y1 ?
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
, A9 B; w- U  N! M- E                        }
( h2 f6 h. a5 j- _                        else//输出暂时还没有改变数组元素的值) u) U2 Z+ r) p, Z
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);8 @$ x; p- b3 j$ T% x/ w: m/ j) w
                    }
; Z# d0 l% u+ g) P' q# V! C* g                    else
) i0 r! v; F+ O( D5 y  O& s                        i++;//数组元素为0,直接跳过,不计数。。。4 H/ Q+ ?$ {9 p+ h& h. s+ u
                }7 ?* |2 a& _% `( `% r

$ M) \! Z, }$ E$ j# D8 r: P3 k* W0 V5 M
            }//结束while循环. b( {! S5 |. J* }
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
& ?& `- w) D" |8 J+ G0 S           
  |* A- @% ]& o& L8 V/ j- s                if (numw[i] != 0)
! P* |5 r( D. C                    Console.WriteLine(numw[i]);8 Z2 S& W; P" g  Y0 w( [3 V, o
           
9 Y3 x% {8 g: h& E( h) Q6 ^            Console.ReadLine();$ T; Q2 |: H# o; O2 l& [2 \& p: g. q
        }
1 p1 p; v. C6 j$ @" Q% h( }    }: B. ]8 g! o& b2 b
}2 C8 z1 m  k/ @* ~/ Z7 N0 v
小甲鱼最新课程 -> 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, 2025-7-6 10:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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