鱼C论坛

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

猴子问题

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

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

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

x
大家好!) B* ~  U! U9 M, |) r$ w1 c
这几天我在忙着编一个问题,我用了一种方法编出来!
& _* i" |8 S2 q- B( ?0 f但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
7 C) p0 M7 |: i8 f注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 4 `4 B2 Z) [/ r! q
6 i  p' s; n; L0 l

- c; D5 \3 B9 r) a- }9 K% ^
                            题目. e; ?: P- D& W  {* n  V7 _: ~5 L0 d  d. k
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。" Z& I! T: c7 C5 R0 a
第一种方法:利用循环链表
* m6 R8 R4 R" h0 P% ^, g: ~#include<stdio.h>
  d, h( K& ~. E4 K5 }#include<malloc.h>% o2 u0 m. I' C6 |. T* v! \
#define M 8            //共有8只猴子
: S, n0 F, d3 M8 m#define N 3            //数到3只时退出第三只& Q% e( I. @# D0 q% ^  o- N: `
typedef struct monkey  Q! m$ t" @& Q' \0 i
{int number;
- N* k% h8 {; E: e: m9 w6 B( Xint flag;) k) z' x1 ^  V3 T" Z, u5 B! Q
struct monkey* next;) e! g  |( @/ }7 e
}MONKEY;; e& {9 E* [3 R' I* }
main()
5 B1 O0 X. ]: i% [0 H' E  c{ MONKEY *head=NULL,*p,*s;
3 x5 j. P% z) n% i2 a% V$ e( m& o  int i,sum=0,count=0;
6 Z! ^( y; Y" D& _! p' x7 e- S  clrscr();              //清屏
$ m0 [; q8 `8 a0 h  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
) ~  o/ f% B" N6 H4 C/ p: k9 K  p->number=1;p->flag=1;
8 U" O2 y. g9 T  p->next=head;3 p* T$ ?: |4 R1 x7 L. Y# D
  head=p;
3 y% L7 D3 l5 t" C6 _5 ~7 Q, t. `  for(i=2;i<=M;i++)
# O+ s- V) W4 @2 h5 G    { s=(MONKEY *)malloc(sizeof(MONKEY));- z1 y) O7 a5 H  H
     s->number=i;s->flag=1;
- B# q( u! n# X! {# x. k/ t( Y     s->next=head;
- l- H+ [& t0 h" L/ C! J     p->next=s;p=p->next;
* ^8 Z' D1 A* s4 m% _! ^    }
% I# N" [+ e: G2 A5 a* E% w    p=head;
) @0 ^2 |; B; m: z  V, z   for(;;)# |* z; {3 u; T( H: H
    {if(p->flag==1), w2 a' s6 d7 q- i5 i
       count++;
. v* c3 B1 K6 q2 Y" r7 @     if(count==N)
4 l+ l4 `0 V( e( a+ y7 j        {p->flag=0;; w/ _) m7 g; Q! k* l" _
         count=0;7 y( y+ G8 [8 L5 a! H* b+ j
         sum++;}" U' Q9 l+ z( b& v, {
     if(sum==M-1)/ m( n. \0 ?" F2 H7 e
        break;% ]  {1 y8 }3 N, W) O
     p=p->next;2 p; L) C$ h9 H& n# ^+ ~8 n) s
    }
/ M/ j3 t8 O4 E( a: B$ n    p=
! x  A4 k" ?: B/ P4 p9 A    head;1 J$ {# P4 Q6 B: W+ j$ l8 b
    for(i=1;i<=M;i++)" m. e9 N, V( V6 S5 Z% J: j# T
    { if(p->flag==1)
8 ^/ h' Q# q+ @! u  A        printf("\t%d",p->number);
& u1 c. n& k" J9 d$ {" Q      p=p->next;1 Q5 [' X, k' q+ l0 ~
    }+ v; `+ l, P# d. B7 M# c

, h5 i+ b: l# B  V8 A) J
# r' V; n. W2 D) ^; `& A- F! ?1 l& \& j% r3 }
}
; p; M6 u% X1 Q3 r/ ~2 U
第二种方法:数组" u" {2 a' u$ J+ m7 `0 l: A
#include<stdio.h>
& _2 i9 n, l( y2 a$ F! J% G$ T% T#define M 8
( n( m2 [7 O! ]( a& r  r- Ystruct monkey
4 J6 q; t- |+ q$ T& y{int number;6 D& J4 c" }* e3 b0 h
int nextp;0 Z! w  C. w7 W9 x, R
}link[M+1];
% v' H7 Y$ e( m: l/ H% v0 r9 Y6 y( T/ P  p: W2 q: r
void main()
8 S1 J1 F9 F) ~  @{int i,count,h;
) K2 ?( I, w9 i! I4 T/ e8 kfor(i=1;i<=M;i++)
7 ]3 B' Z3 U% [0 q5 \" `. h{  if(i==M)2 L4 L2 ?2 G$ ^3 V
   link[i].nextp=1;8 k6 ?$ ~* {0 ~2 V
   else7 A( S3 R& o) ~7 i  [/ C# q
   link[i].nextp=i+1;
7 u+ q4 ~# i4 w; l6 a0 r  link[i].number=i;5 S- g. J) H# G# _% W6 J8 ]
}
- s. E5 b) r. z" ^  [printf("\n");" q  g% Z2 {  \, M
count=0;0 Q7 I. b# f6 Q& I; f$ Y
h=M;
9 z- \( ]0 N* X6 A( Vprintf("依次退出的猴子: \n");( ^6 ^5 U6 {# f7 z2 I: g4 N
while(count<M-1)
' y" ^! m# U# f( s: O* F1 v5 i{i=0;
, p1 r# n  S3 k, y' N, xwhile(i!=3)
3 {" ]& P( G6 V$ U5 \* a{ h=link[h].nextp;
# A6 C! }- v5 O0 W   if(link[h].number)% N: [% y: h/ }" n9 d. K2 |2 c
     i++;}
' o, N1 ]+ S8 U# A
( F+ K: t, l' T8 Y& Cprintf("%4d",link[h].number);( H8 R( y# {. a' m+ M
link[h].number=0;
7 X6 P5 W/ V: W8 L8 J9 o1 m* Ncount++;
+ p! |) f" b0 ~- }5 I}. ?' `0 c! n2 w# V0 H( y' D
0 W9 K& y" o. w
printf("\n大王是:");
; m4 c8 K0 M9 H" Y& r  for(i=1;i<=M;i++)+ w$ Y2 k" m- E5 b3 w: R, Z7 D: `
  if(link[i].number)
$ E  \% o5 `$ W' L* I7 ~* J    printf("%3d\n",link[i].number);
( I3 ?, s' I& x: c, V8 Q% f- t
9 V9 h! b- Y: ?& e2 }, P: g% r" ~6 c4 ~0 O( V! x& n' N
}

+ y) X3 E' ]5 t& m/ a. d+ {2 ~* c第三种是普通方法for循环

- s* L0 Q& U% Q  C# A6 n+ V#include<stdio.h>+ a1 E  S& o+ X+ ~" \4 }
void main()
1 b4 \1 m# K7 B9 l/ f1 z% p0 c) w{ int i,k,m,n,num[50],q,*p;
: Z( J& }5 e) e6 i    clrscr();% p, V2 L1 H6 V  v8 U
   printf("input number of person: n=");
; F' m  b/ y3 J/ ~    scanf("%d",&n);
2 k/ ]. a! }1 zprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
& ~* o. t  _% _, B    scanf("%d",&q);
- F$ j2 d, V6 r3 A! Q   p=num;
) S. H) L+ J% ^. `, Z  for(i=0;i<n;i++)
" p; H2 c3 S2 i+ T; o( P( I    *(p+i)=i+1;2 e8 Q9 L0 U& U/ \6 I# |1 f& F
   i=0;* \9 [/ }  n0 ~" B  R3 {3 o- W  L) G" B
   k=0;0 m9 y. r! J; u4 B% b
   m=0;
; c  h, S% W5 M8 e, r5 Z  while(m<n-1)
; ~, s7 {0 ]0 l+ L' ^   {if(*(p+i)!=0) k++;% W  k+ \2 D/ l/ f4 v
     if(k==q)
, [: _( X. l5 x+ T/ c8 V# w      { *(p+i)=0;% _- y* M0 d" g  c2 F) T
        k=0;/ E  m/ y5 c7 j9 k# N
        m++;
; e/ ]4 h* @% D5 K& e+ c      }
% ]! b% U, ^% j$ v8 Y5 b* D; d    i++;
8 W/ Z) W; S9 Q: Y. V; L3 _    if(i==n)i=0;2 M7 h& p& G) r
   }
" L# ~) c1 ^; d  while(*p==0)p++;) V  D4 ^; s. e" }+ j
    printf("The last one is NO:%d\n",*p);
; W6 b8 t) V& Y- F+ \, l     getch();+ h& Z1 ~5 F2 @/ h
& p8 m5 ~. `* c0 f9 m
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;1 k; z. s- ^+ d1 J
namespace 又费马达又费电
& W$ u- E$ e% S9 f/ |7 p" G{
, r, R( G) [5 a9 Z    class Program. x  c/ t4 A$ C: j" ]7 E, k, O
    {
' _/ w' z% K' C        static void Main(string[] args)
/ @, S. |1 ^9 U. \- L* n        {
& B( x0 ?( O8 P% h            int m, n;
6 E. B6 E" p. `            Console.WriteLine("请输入数组长度");
3 z8 D0 I/ u; I2 a            m = int.Parse(Console.ReadLine());//m为数组的大小
9 p  D2 v" j$ V9 c4 N( @4 A& m            Console.WriteLine("请输入要截取数字的大小");
* p: n8 U4 h4 c- @  y            n = int.Parse(Console.ReadLine());
* }( w% i3 @- p) v# ^4 i            int [] numw=new int+ y* @- j0 V7 U* B1 O: s" D1 C
7 {% @3 W2 N, o: b8 b9 S. z7 }; ^
&shy;&shy;&shy;;
/ }1 B5 \. r, N: c& W  \! b            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
# u6 \; {, E7 a# w1 I4 L& E$ n            {5 {' L3 w! a3 b% Y. p) Y! [/ e
                numw[j - 1] = j;' A! b0 a0 Z' b/ c
            }8 G- Q' E( q2 h$ v1 [
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
, T( ?( D! |/ O* W1 f& s            while (d != m - 1)
9 c5 r/ u# q; `" E  m5 d# n            {
0 d- Z8 ^& X, f/ ~$ f                if (i == m && d != m - 1)
# r7 B8 Q' `# k$ B; o                {
. t1 U; f4 S8 p                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!0 h9 w6 h& p( L" N1 I$ Q
                    continue;
2 o7 e( I; \" m% q6 C                }
; P& k, _' k* c, U) [! M* x6 P                else& A7 c3 q7 }9 m% v+ d; O5 N/ \  b
                {
0 Y3 A' Y: F: l' k                    if (numw[i] != 0)$ s# F$ W( q# {3 g( `
                    {
4 H! \8 G' t1 Z3 e                        i++;
5 D3 f, j. y+ L! X2 ^8 q                        k++;" I$ `  ?0 o; V: C$ T. _
                        if (k == n)
) I. K& e& h8 j* l                        {
& g- z- m6 i, M# T8 Y( \7 G                            numw[i - 1] = 0;//把在n位置数组元素的值改变了3 X% V% ]7 d3 d( f& x, Z7 K
                            k = 0;5 K: a! Q% T9 \0 b+ y8 B
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小15 _7 D8 |1 M; ^/ [4 e
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
7 Y8 W# T3 y  ]; I/ r) ]                        }
7 y' X  S' O9 g                        else//输出暂时还没有改变数组元素的值9 j0 s# t9 B+ D' U3 E" v& s
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
- Y8 V# I2 {9 \+ U                    }$ n2 D2 m- _9 H: c0 h; n5 {
                    else- }$ Q: t& k  V8 m. t4 j
                        i++;//数组元素为0,直接跳过,不计数。。。5 S. L& ?7 \* I; d: b
                }5 o/ b1 B# Y* K. l: d% W
% [" P. V- p! i1 r9 n

/ D9 H2 y7 B# y3 c' {3 F            }//结束while循环1 A/ ]% n6 [& H; I1 {" x
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦% ?2 z& i1 U; h( r% D4 G" C
           # ^" f4 ~3 v# \4 v" D2 g4 |  F) |
                if (numw[i] != 0)
- q* G+ i6 p9 E, G  r; X& e                    Console.WriteLine(numw[i]);
/ L% g, d; J" ~! t$ {3 [! T           6 l; {1 E7 ~6 p$ M; h3 G
            Console.ReadLine();
3 {7 w4 S! S5 G3 B& G5 J! s        }
* u& b2 O; b7 r& q. H3 g    }; E2 v1 _3 Y4 {4 t6 t
}
* f; n/ L8 Y* Y& a  R: i7 o! p
小甲鱼最新课程 -> 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-23 14:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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