鱼C论坛

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

猴子问题

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

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

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

x
大家好!& H# U  j1 m. ?6 t0 D& E  ^) h* d
这几天我在忙着编一个问题,我用了一种方法编出来!/ X1 S! }" h9 O# S* M, g8 ?2 {
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!) {" ?" u2 n5 `: z
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 5 b5 P. j. G+ R0 G+ D* l( b% u
$ [: k* E. C8 \! b8 X( C
0 j/ ?! Z% c6 X" o: i
                            题目2 u! y, h$ A0 U3 l
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
1 Q: ]7 f. T* G2 x& v第一种方法:利用循环链表- J# {7 P# a* f6 }/ I
#include<stdio.h>( q" Q0 c" y2 C- T8 D% j0 N
#include<malloc.h>" }4 Y% O8 D3 a) U- }; d
#define M 8            //共有8只猴子' L$ k8 ^2 l" B; s9 l
#define N 3            //数到3只时退出第三只$ C0 l5 D, \: e; {; K
typedef struct monkey5 l, k2 w2 v; C3 E; @0 y# x
{int number;
% D3 o6 c  K2 H2 l( @int flag;2 L8 {* `& \0 ~# R* h& V% H+ \
struct monkey* next;. C3 A" n% c. @
}MONKEY;' q8 C/ q6 ?0 }
main()
3 o- c! f0 L9 c# M3 A{ MONKEY *head=NULL,*p,*s;% u4 T' u2 I$ y
  int i,sum=0,count=0;3 d; G9 L% O) Q, F" z3 g
  clrscr();              //清屏6 I' }- y3 C# x/ i; \
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存% t9 z% v7 O$ g9 Y7 j" K
  p->number=1;p->flag=1;
, E, T2 y4 b3 ]# z  p->next=head;
2 R, ?5 V) ^5 d; f  head=p;5 d; X4 V9 d9 {* G4 s/ L: W
  for(i=2;i<=M;i++)
7 _+ m6 ?! m' }. ~9 z$ T! W    { s=(MONKEY *)malloc(sizeof(MONKEY));
4 K: A1 U$ b5 ]: ]$ ~' g$ W     s->number=i;s->flag=1;% k4 l! \$ z; T' }9 h/ v, B
     s->next=head;6 l" t0 R( w  B8 c3 q) K" K
     p->next=s;p=p->next;, n4 h( M* Z5 c8 Q; q+ H* {
    }
( ^$ J2 N4 S, S' `4 f8 B1 V5 `/ z    p=head;+ Y( }0 E" ~/ ?5 Q
   for(;;)7 N9 _3 @: p. i- I
    {if(p->flag==1)
8 i  c) q2 z( \9 z6 X1 b: {# |* @       count++;  [# Q: L4 K( r( B+ P6 q+ x: _- p/ o- D
     if(count==N)8 k0 S7 ?2 C2 L8 A
        {p->flag=0;
3 z% @' ?6 o+ n9 ]' Z6 \         count=0;
3 y! H- m0 B/ X- Z  ~1 Q( D         sum++;}( h' p; K# I& X9 W
     if(sum==M-1)
7 w# T( A3 l/ K/ O7 _2 C: u& ?; }        break;: F4 Z; `' B3 l% \5 U
     p=p->next;" L& C* G, Q3 K! F7 T7 r
    }
+ Q0 X2 _2 P& a* x, p, t    p=8 F. A6 ^8 n' n) z3 q# B
    head;
. T( R. }: a" D    for(i=1;i<=M;i++)+ M' [0 F4 X) f3 [% J+ p) ~
    { if(p->flag==1)
$ L" l7 x' m* H9 G2 j1 Q" H- }# \        printf("\t%d",p->number);) |# V1 Y8 Y$ k3 S7 m
      p=p->next;
+ {/ I; D& R$ G% @% t    }; x5 _" D5 d3 F) p# d1 e0 d9 H+ S
) Z4 E3 l( s% D# `; U) U: ^

' ?- q! O9 w4 e7 o/ S* H/ P- W! e7 c: E* x" m" _# T
}

1 y; b' M6 l: Y* i7 ?第二种方法:数组
; p: s: r0 g' R5 f. C: Q% ]* ?#include<stdio.h>
$ N% r: R: E% ]" x* Q) M#define M 8
" |4 o8 q% u( {: r( ^/ ~struct monkey
- {: ]0 F+ o% {9 f6 |2 ^{int number;+ b9 i3 f+ G4 N; y0 P
int nextp;9 }2 h. `5 v  b2 c- _9 }- W
}link[M+1];
! v( Q. T! G/ `: ~, @5 M6 O! X& ]3 @% ^. ^; n5 J
void main()
. f4 K, _0 m# o2 c, J4 I  @! f{int i,count,h;
  T3 H' `) Y1 L* n; b$ x; tfor(i=1;i<=M;i++). G5 C  x/ j. {# b) m: W
{  if(i==M)0 [+ \$ }' z5 S  A- j" l3 Y% v4 ^
   link[i].nextp=1;
! Z5 s, K9 @: u- [   else  ?. |) [# b# F
   link[i].nextp=i+1;3 ^* u* N' m5 [: _/ Z8 U" M
  link[i].number=i;3 ]6 U5 v' B% `0 B6 P
}
# F! U8 [& p. o( e* cprintf("\n");. h# ~6 e& [: g% f4 S/ a" i
count=0;
* h9 O5 L+ f( X5 f) ch=M;
! R9 c; m6 d. C# o, y% s* ~printf("依次退出的猴子: \n");) U. H$ e. w/ f# o% d
while(count<M-1)3 x& S. c6 g, p  r$ Z+ k
{i=0;
4 o; ~9 V( ^$ jwhile(i!=3)
$ K; h. I7 a8 }1 V' {9 ^( I; z{ h=link[h].nextp;9 F# J7 z9 z! \" y: F
   if(link[h].number)0 i  V4 |. p, G- T
     i++;}; H2 U0 v  N8 W) Y# Y1 E' P

( ]* q7 P( E7 ]3 Q7 \0 q7 R* O2 T9 [printf("%4d",link[h].number);; g8 c' q$ L0 M2 y" r( U) K# M6 D
link[h].number=0;
1 [% P. U1 b  W( B7 Ncount++;5 i  R* K3 T/ H& B8 V, X% ^5 P
}. U! n4 A5 e# z3 f7 l

0 r8 r2 g$ x4 c% Pprintf("\n大王是:");
* H) d  M; d$ i; t1 ^- |/ G7 G  for(i=1;i<=M;i++)
$ [* D0 e' d: i' l  V1 \0 _  if(link[i].number)
) J" b5 U& f' b4 Y    printf("%3d\n",link[i].number);" m$ g' [. ]8 w9 g5 e9 z9 k
2 |0 _/ U6 u) I; c  Q% ^3 y

/ r6 g  o( b( s; H! ]4 w/ l}
- k& d$ h) A$ E1 c1 o, ~
第三种是普通方法for循环

% r; u( M! g* d/ `& U. |  z5 l#include<stdio.h>8 M5 t$ ~( T* T- |: n& Q
void main()  s/ v# L* \4 X1 o+ B
{ int i,k,m,n,num[50],q,*p;
, H- }: x! b2 y6 U    clrscr();& R! |  |6 N1 Y5 K2 M7 k
   printf("input number of person: n=");
$ C  y2 s/ u2 d  Q    scanf("%d",&n);8 k* m5 d9 o6 v& @- _/ Q0 x! F
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
. P; r: Q) i6 l; ^    scanf("%d",&q);
5 T) W, G8 L6 c   p=num;% r: D1 W; P6 l/ j/ C
  for(i=0;i<n;i++)' u: r- F  h: Q
    *(p+i)=i+1;! w! J) ?7 N2 p" I$ C# m: q
   i=0;; f, c9 E. U5 ^+ ]3 r6 C
   k=0;
; _1 o& c4 v$ W) e1 r2 q4 [, ~4 u   m=0;* N0 X4 q9 w) a! |* q( S- ~/ o- N
  while(m<n-1)$ t3 ~& H2 z2 R) Z5 X- F8 l/ y
   {if(*(p+i)!=0) k++;2 C0 n) c8 I4 Y, \) R4 \
     if(k==q)
- u8 c1 y" j4 G( e      { *(p+i)=0;( R$ K' I; d( V; ]
        k=0;# p& s  Z, l' N3 }- V/ F; D
        m++;& M+ H6 @  G3 o, M
      }8 i* ?4 M7 E8 ]& ~+ l
    i++;" \4 S7 C$ [( D& e
    if(i==n)i=0;
% _' f" V1 g9 @  C, e7 `$ r5 P/ ~   }
" |  B2 p) O% D" V  while(*p==0)p++;; I8 I/ t6 }# h7 G  ~4 s  B/ C
    printf("The last one is NO:%d\n",*p);
3 o; C4 }0 @! k& u9 F     getch();. J9 x. U) }# k( }: s! W

8 C8 ]0 C; U2 ^}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;* j5 L$ k* y$ n7 ]0 ?
namespace 又费马达又费电: B. P+ i& H) P8 k! w
{0 i' p4 ]) S# n( Y
    class Program
: V! x4 W2 ~! q9 a; A7 J- h    {, r6 z2 ]6 L: }
        static void Main(string[] args)+ T4 B4 H8 V& q4 |
        {
/ m; p8 b( C. T  W# y; P            int m, n;' p2 L. p0 J0 v4 t
            Console.WriteLine("请输入数组长度");
& Z) ?9 a' ]# p            m = int.Parse(Console.ReadLine());//m为数组的大小
2 j" T0 E7 T& z1 ~. [            Console.WriteLine("请输入要截取数字的大小");
! I; ^* S5 R6 u2 w            n = int.Parse(Console.ReadLine());3 W' \8 y- z( G' r, v; w  `
            int [] numw=new int
) Q: z5 Z( a* S
; F) J3 k  A  ^' @0 r4 l&shy;&shy;&shy;;) U& m* b& @: M) k4 W
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数" D( ]9 @3 w/ V/ ^: K
            {
7 G; e4 o2 h  U0 H" s                numw[j - 1] = j;% U" z: U# \# I7 d$ Z
            }
7 o* _0 ~) T2 q  ]( V            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
* x6 E7 ~" w$ n" S' O. ~7 K# L            while (d != m - 1)$ K4 F6 V  Q- |. w$ X5 B, ?
            {1 L- T" B0 k" N" t* d0 ?" ]" }! W
                if (i == m && d != m - 1), `$ }, Q/ Y  p. m8 i/ A7 |
                {
7 L& ~4 w4 z+ f: k                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
/ M+ B$ |# z) L- |) N7 V* I. ^                    continue;5 i+ }5 l2 ]; o6 q: r( n. z& J
                }
1 u! J, X9 l3 s' L" ~                else
6 m& S0 S" r) E# N: p0 G, B                {
! L& }1 s% n1 _+ i1 C                    if (numw[i] != 0)& U$ C6 t* Z* }0 R. N
                    {
& P, [8 \  K$ v8 W# M                        i++;
8 U! B+ z7 R& n! _                        k++;
0 W! N6 `4 W. C$ v                        if (k == n)
' L$ Y9 U( p+ j5 I( i; A/ a! B                        {: P, p  U- s' J: e& U
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
4 H% |. c9 [0 h1 k                            k = 0;
2 c) K* X5 _9 W% n: S4 f  X              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
/ g( L7 v1 `4 O; _& j: [7 h: A1 W, k                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
/ z5 q% o2 C: ]9 O6 @+ F0 E, {& T3 C                        }1 a) {! T8 ~3 L
                        else//输出暂时还没有改变数组元素的值* F9 g" S$ K* s
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);2 k9 |- c# A4 m; ?, ^
                    }
' j% v% X# H* [2 Q  k/ [: _. R                    else
  m# P( e- \3 n) v2 ~                        i++;//数组元素为0,直接跳过,不计数。。。
$ t4 y3 ]6 B) A* U7 _7 N" r" p                }
# A9 q2 W# T4 a2 r- o+ U3 _1 L   z- P: C+ h" U' ^+ I% L

1 G/ k1 m: H$ f% T" t            }//结束while循环! q. v( a( P5 M1 d& T& p1 ]5 i8 v* v
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦4 l, c/ v* j4 D
           : A8 H4 W- R8 x! @% ]% I) a% A
                if (numw[i] != 0)
* V) d2 C% c5 w2 [& s; q. O                    Console.WriteLine(numw[i]);* f' M( C4 X1 M4 T+ x! P5 m
           
( M+ i1 c  T  L0 t8 q6 @( `9 }( q            Console.ReadLine();6 J( S) u' \/ K5 |/ q
        }  m; m/ c8 V% r0 P  U4 e1 L
    }
' ?  O$ e+ k+ C5 L2 Q}, ?6 `  f! }1 K  w  f: o
小甲鱼最新课程 -> 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-9 04:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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