鱼C论坛

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

猴子问题

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

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

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

x
大家好!
: A8 C9 B1 ?3 {( w, ^' K$ Y这几天我在忙着编一个问题,我用了一种方法编出来!
' J: ~+ ?9 Q" E) H但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!& P9 U/ v7 E' g
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
8 t2 o0 |' y7 O* N* F/ g- v3 m$ _, L* @: U& p  ?6 j7 w
+ ^9 X. i9 M4 m+ {2 T9 }( m
                            题目
  T$ @( t8 O4 `, A6 [山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。$ |  L% I8 e$ t0 \) g& ~
第一种方法:利用循环链表% x5 |- r& r) j! |+ B5 o9 R0 A
#include<stdio.h>/ a  e' e8 D# y) l0 a$ M
#include<malloc.h># G0 d9 E4 G# m; v; Z
#define M 8            //共有8只猴子
( ]6 n( b0 H8 c& f4 a#define N 3            //数到3只时退出第三只
# Y  y, U3 o+ l. D/ Ctypedef struct monkey
" h) x1 p* J1 w: U& G8 |5 T{int number;- m; \* z" z1 S7 S- f
int flag;
) W$ x0 ^; U! A2 mstruct monkey* next;& ~* s: w0 I# `/ d$ V
}MONKEY;3 f* n* g$ E* K5 l# R; U
main()1 |2 M. z# Q' j" o2 X0 X4 [
{ MONKEY *head=NULL,*p,*s;
7 @, \" h0 `0 B, z3 r% K" C  int i,sum=0,count=0;8 N- S; y5 [! w& b
  clrscr();              //清屏0 X( d8 ]0 Q* |7 h. [
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
3 ^) `+ A( i9 Z2 h6 }  p->number=1;p->flag=1;
0 F# q# z; t& g. b% ?$ Y  p->next=head;* x' n8 c2 ~8 ~) p, w
  head=p;) J+ l: m! U' Q; w; @5 B+ a+ v- D
  for(i=2;i<=M;i++)" G9 n- f# Z: Q9 H$ [" Z1 X8 f
    { s=(MONKEY *)malloc(sizeof(MONKEY));  R' m# n. Y, \
     s->number=i;s->flag=1;* I  f& G, m- J' Y( ?7 C
     s->next=head;  {! d# _4 i5 i: G% R% C
     p->next=s;p=p->next;' H5 Q" N* W& s; N5 i1 k1 j7 x9 [
    }1 G2 R" m7 O$ r2 y
    p=head;
& @8 \3 o3 J$ k- C! }$ c0 E   for(;;)
; ]# Q7 s, {1 K- q# B9 f. I) |    {if(p->flag==1). \/ g9 K& l/ ]# I5 G& a/ v( E. y
       count++;- w7 z: ^% `- \# q$ ]) @
     if(count==N)- `1 a; c8 F1 @
        {p->flag=0;
# E/ H0 u1 H% O  E8 f1 `         count=0;/ j- m" c( t9 h1 M  I0 e+ e! v
         sum++;}( A9 K: w9 [0 I( F+ J% v, }1 L
     if(sum==M-1)
) f5 r* E4 v9 K! L: z9 x  X        break;6 A( ]& L$ j6 Y* c4 f# t4 o
     p=p->next;# I0 G/ }+ \/ y, E
    }
8 l  X3 u, H9 n9 t" r5 k! t    p=# Q1 C) c& c( A+ Q+ p( j4 C
    head;
6 |) e( j4 g( q5 [/ v    for(i=1;i<=M;i++)
1 t- b1 E, j' x3 a* l% W; ^    { if(p->flag==1)
, l* c* `* B6 h' z1 V- l9 k! `        printf("\t%d",p->number);& W. @9 D0 S+ k: K* b
      p=p->next;
3 D" i$ e% D( o5 D# F# b) M# P* I8 L    }1 X* w3 j; h9 y& X$ |1 y
) f  J6 v% c5 e5 j

6 S! o' Y4 [9 l% Q$ L  V. C8 u7 N7 V. Z# y) e
}
/ z4 C( m% Q% I
第二种方法:数组3 e2 Z9 X9 D4 o. R9 E. ^
#include<stdio.h>
" c* l% l% M. Q1 A& a' t#define M 8
' c, a6 ~8 q) dstruct monkey1 ^1 @$ s( m& Y% D4 J# s
{int number;( n5 N. r: r& |; e6 [8 C
int nextp;1 e5 y, |: B  l
}link[M+1];
3 U5 s7 o+ G8 f) U( [  \& a0 q; K7 r! H( Q0 ]6 ^- Z
void main()
( i& D6 g4 r% L' v3 n3 W1 N{int i,count,h;
: j) H+ m, h. O* a8 B; u5 sfor(i=1;i<=M;i++). q1 f% Y& f2 q5 @* p( m3 t) |
{  if(i==M)0 C+ f8 Q/ Z8 o
   link[i].nextp=1;+ q( ]1 M* ?0 u4 j3 s
   else
- {! w; q. ]3 g  t( ~   link[i].nextp=i+1;
, g) s0 {8 r! y3 \: {! Q2 V$ r  link[i].number=i;+ u6 P; y; D: c5 ^
}
. A1 P$ h6 P# W% M" O" H. @8 Fprintf("\n");/ n* f9 _3 \7 W8 a/ J( N/ s
count=0;
6 Y" ^6 p2 ]( \. ^9 L; \' fh=M;
6 G  e+ l: V1 r$ g! hprintf("依次退出的猴子: \n");- Q9 F) S9 x, E
while(count<M-1)8 D! g& N- S8 o
{i=0;2 Z* ]7 |# M" j. q9 L
while(i!=3)
6 t, V, \1 r4 s+ i5 K* I{ h=link[h].nextp;
$ w1 z( Q% w7 G% s  k   if(link[h].number)7 `+ @% d- G  A1 h$ G6 S1 z5 N
     i++;}, ]3 Z: v) ]5 Y
9 e  y3 F: ^0 u; ?. `$ W
printf("%4d",link[h].number);
9 G0 L% Z5 \. w% l3 vlink[h].number=0;: D3 `3 |: L& [1 D# f* _
count++;; j2 ?; x, F! U, n/ _, Y2 K
}
5 @. `( |7 K% j! z! Q
5 a! }1 J# O" I' Gprintf("\n大王是:");
' V7 e* q# M9 H3 q  for(i=1;i<=M;i++), J9 e+ m2 R4 {9 a: w; [+ P
  if(link[i].number)2 T5 B- J; W4 d- W) V; y
    printf("%3d\n",link[i].number);" }9 C$ j: K, C9 q& _4 I# n* _
& s0 S2 ~! B9 T7 x) ~

: Y1 |- p! A* g7 S}
; j- Q' `! z: M, H8 D
第三种是普通方法for循环
- ~$ ~4 J/ d. ^, {
#include<stdio.h>
7 U1 v" L: c' x, H6 T* H5 j# bvoid main()
: O6 `6 Q" r) U: \{ int i,k,m,n,num[50],q,*p;1 k  s4 Y4 U) W4 n* B
    clrscr();
$ {8 t: b+ D) v, U. n   printf("input number of person: n=");
4 p% e" E1 W4 k& }3 w7 ^    scanf("%d",&n);
5 E1 w. L: M) x5 v5 ?; `5 l' ]8 a9 oprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
4 U" h7 a" B1 t2 _& }/ X0 s    scanf("%d",&q);
3 Y7 B; o! B; s2 e2 w   p=num;; G6 a0 t% M$ V; F; t& r
  for(i=0;i<n;i++)
9 u$ i( e8 h: c1 }3 r4 L    *(p+i)=i+1;" W0 J) \; H6 J$ ]4 |2 P- }
   i=0;4 v& U, w- B1 m
   k=0;
* k+ C; U# m" V% O6 t; H1 c   m=0;
: L, A: D& [* B  while(m<n-1)
$ R* s, U; n3 v7 R  t- s% f   {if(*(p+i)!=0) k++;0 \' l+ C: r% O& u% w: f2 Z0 @
     if(k==q)
" l; Q4 M: n, N7 Q      { *(p+i)=0;5 n) @) C) h- b( O
        k=0;+ Y9 s5 t+ j& u* O
        m++;
$ Z8 |8 d7 c3 N* y9 @. |! L2 \      }
6 r5 I3 C' x6 i. {" k    i++;/ i5 G9 ^& D, w5 k+ G4 f: x+ n
    if(i==n)i=0;: V8 @& M, y7 H! s
   }
" L5 V0 @( D- `* Y, L  while(*p==0)p++;' D4 H: ^1 ~4 P0 `, P6 g
    printf("The last one is NO:%d\n",*p);  ?8 E2 u5 p' \  s$ {
     getch();: c' i5 W8 i/ A$ w3 R# ~' [
' }: ^1 o6 F  M
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;" b4 }9 W; @7 G! R0 ]
namespace 又费马达又费电' G5 w' p' |7 H. @, D& x. d! Z" l
{' W  _5 L/ u/ O4 V
    class Program
) ]' c2 A) n% B  s; D    {6 {6 B" D$ s/ m4 x0 f3 x
        static void Main(string[] args)8 p2 T! x( w# Y! G, J1 A
        {" b9 R1 ]  e7 ?4 ~  n4 ~
            int m, n;
' B9 a) E& ?. u/ r/ ^2 v            Console.WriteLine("请输入数组长度");1 @9 P% B5 Q: s9 I, r* y
            m = int.Parse(Console.ReadLine());//m为数组的大小
9 _: k( R/ }; ~# a/ U" v9 ]            Console.WriteLine("请输入要截取数字的大小");
" |$ G, O! R  @- S- ?2 t            n = int.Parse(Console.ReadLine());
3 K2 ^& X! ?: b! U            int [] numw=new int
' _$ b9 D( b3 k! c3 q/ i7 S
" T7 F& f) o% {/ t&shy;&shy;&shy;;9 H5 D, P2 O2 L/ Y* g  d2 S
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
+ O; \, D7 K. s7 k- m            {# p8 v+ j. R5 S" Y! k. ^4 j0 ?4 w
                numw[j - 1] = j;
$ E) e1 r' j7 \! ]$ e            }# `' Q$ f8 z/ m$ r! I) d: Y
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!$ N5 L8 `" l  }# p
            while (d != m - 1)8 Z4 T) u+ b& x. B7 b
            {; ]: j: Q. ~5 G, A, n4 a
                if (i == m && d != m - 1)& l% O" n6 I! x4 a: L
                {7 Y. c0 i5 L2 f; J/ ]
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
: g, N0 a" j) ?1 {                    continue;
( S& E& Y6 A/ g& A; ?                }1 q! h4 t9 k# J
                else
0 ~# V& i0 e! p# O) R6 ~                {4 \2 h: w: e, R: P: H  ]
                    if (numw[i] != 0)) y, ^5 m' X  c: j
                    {
* s* S9 q0 F8 `( K* c$ l                        i++;; x6 J* G& G# d; m
                        k++;# N. n: R8 S' n
                        if (k == n)* B. E( A: Y. p
                        {1 ]/ R3 m9 |8 h
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
& p! y. W8 T3 d7 B/ `) s2 o                            k = 0;
+ g! o0 B3 [; t- ]# r0 ~: f              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
4 c4 }+ {6 u% D1 J$ P% Q                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
% r" ~8 t9 q: _5 [3 ^! z                        }
9 d$ W; R: t2 A: @: H                        else//输出暂时还没有改变数组元素的值
8 `% Y- H  Y7 j% t7 C1 i4 c                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);2 _& x! J7 f9 V+ R5 R% F5 [
                    }- e. m" g7 z3 D0 m- }
                    else
6 w# J1 O5 K' _8 E) ]/ }                        i++;//数组元素为0,直接跳过,不计数。。。" E/ j, _, @! K/ z+ t% S! v/ \
                }6 R! z* }* m+ F" q% i0 v) F
% W8 j) U/ Q- t& C
% m: e+ a- E6 G8 v& n. e/ N
            }//结束while循环0 T8 b1 \: ]: r& Q: \
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
) ?. i; k2 U- K( u$ q2 `           * i: f0 k/ @" j# O
                if (numw[i] != 0)
. S0 S, V  B$ @6 j' `. O                    Console.WriteLine(numw[i]);& b/ ?: ?0 F" U( k5 X& N
           9 q5 f' w) a( w. s) N
            Console.ReadLine();
. n& T1 Z5 {4 o7 x        }4 \& P# ^) \8 V$ |/ w: w
    }
' T  S' ]$ y) X/ }) E' e, i. }}
7 h9 R' P% q9 S8 V" l( R! l9 a
小甲鱼最新课程 -> 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-8 14:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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