鱼C论坛

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

猴子问题

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

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

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

x
大家好!
: s6 w1 }0 I( r( f7 X7 k: o这几天我在忙着编一个问题,我用了一种方法编出来!
# d5 k. d( d, L' I. G! |但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
2 j. p; s0 D9 ~; L' m注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
  `  j) c6 S# ^& S: ^' K
' w; _" t  o1 Q" O' Y
: b5 ]+ m0 Q9 s, ?: N0 ^
                            题目( y6 e1 r6 y% U0 y/ M) _+ l( m* I
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。$ R/ m5 u3 m* j3 Y1 w
第一种方法:利用循环链表
. Y+ h6 [; a1 o( f7 A#include<stdio.h>
' \, _: u1 l5 ~#include<malloc.h>
. \6 D  x0 s% a0 n0 H#define M 8            //共有8只猴子2 p) E. i- r8 {% g
#define N 3            //数到3只时退出第三只5 A1 s: J, K$ n/ ?, s) D8 X" A
typedef struct monkey3 C! i9 \$ c) T  y! ?
{int number;; D2 D3 k0 ?  B
int flag;8 k% |  V6 o1 ^" U7 Y' j' H
struct monkey* next;
& i6 |* Z( w; p( e}MONKEY;. l3 c" F& g3 f% U: q: Q2 W, b- x2 q
main()$ T+ P3 n) r! v1 N9 ~
{ MONKEY *head=NULL,*p,*s;* }2 m# B4 w3 Q$ o7 B; U% S+ t2 e6 I2 h
  int i,sum=0,count=0;
& ~- k1 Z$ z! e$ U5 z& E, D  clrscr();              //清屏( T: ]1 \0 L' C* o, v: M# U9 N
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存8 c5 G) }+ q* I9 Z3 U
  p->number=1;p->flag=1;; |/ _/ J8 Y' u1 V$ u% L
  p->next=head;
0 |3 ~( x9 X1 |7 f2 f' @  head=p;( C" C( W: B1 b; W& d5 E
  for(i=2;i<=M;i++)* ~; s! S  A2 O
    { s=(MONKEY *)malloc(sizeof(MONKEY));
5 F3 I% ]2 o% o% F0 |* w     s->number=i;s->flag=1;
+ V& [3 g( t6 N; g5 i% a. L) v     s->next=head;
- b# H1 y5 b2 `* X1 S" p     p->next=s;p=p->next;* x$ \: ^6 x* {+ G1 \
    }/ I& T' F7 `: j' w
    p=head;
1 }- ?6 R3 N  |* L) z   for(;;)
; F6 q) y" i3 z+ u3 H    {if(p->flag==1)
4 N) W7 K" v8 I0 B0 a$ v       count++;7 }2 _4 o$ F5 T  p3 V- `) G) B7 L7 X0 i
     if(count==N)
( x8 F6 m9 N' S5 f& A) `- f: p4 F        {p->flag=0;' z5 v0 A1 c# b0 b& O( T6 u) O) Q" z
         count=0;% |$ K9 L: f+ A4 T
         sum++;}1 W4 R+ E( u, X: [" T  G" @
     if(sum==M-1); Z& _3 @: J1 D# b, f
        break;
# ?6 @8 R5 {) b7 [) _* Q3 ?7 {     p=p->next;
/ E" {/ G9 c' V+ v4 Z) z% q! b    }
1 s: \7 k  V- ?6 N    p=
0 H( p: T) r% c% n    head;9 f4 S5 V: d1 f% a! P
    for(i=1;i<=M;i++)
9 t/ A) \' B$ l5 I' R+ I0 J    { if(p->flag==1)
' @6 F, A, j) N& J8 z1 B        printf("\t%d",p->number);1 Q2 F% Q! b! P9 p8 d/ B
      p=p->next;
$ \. J1 X# Z  `1 v9 \: G    }! k/ b# p% [- G: C7 X
, y: P5 N$ r/ {9 V* F% y" _1 y

2 u" P/ Q7 J5 q2 S3 N5 E! I" z
* C" W3 m! g5 x. i! U}

, I1 M/ T' ^* i" A. ?4 b2 K第二种方法:数组
7 a; q7 S+ m" E/ \+ N: Y( F#include<stdio.h>
) F0 ]6 L- P! i; B5 T#define M 8
7 H7 r, z7 P0 P! ^0 bstruct monkey5 a$ @# u& i& A1 i
{int number;" j. F  o" w& \& I" g, l- C
int nextp;
! R9 z" C7 E" L. d4 c  {) ^& h0 \}link[M+1];) D  u* h2 ^4 U2 v# d/ A' M6 G
3 ~7 Z$ b7 J; i6 S* L
void main()$ y9 e6 F5 G9 d+ A
{int i,count,h;0 \0 H5 w; w+ h/ Z. l* d
for(i=1;i<=M;i++)3 y+ V8 p/ O4 P: s1 {
{  if(i==M)
+ q+ x/ D/ ]  ^1 A   link[i].nextp=1;( L" A  z4 _7 H2 c! i
   else
/ Q  s2 e- x! m5 J   link[i].nextp=i+1;* w. O4 }3 e: F% Z7 m
  link[i].number=i;, z5 Y1 b; E- Q
}
# h  H7 d1 m! w0 T# v) f) Fprintf("\n");0 {+ P" {  V* X6 X# k* x  Y  R
count=0;" t, @( a% {8 ~1 Z; o
h=M;" v& Z6 y7 ^' L& d( V# j/ }- a
printf("依次退出的猴子: \n");
& G4 d  G7 l! t9 [while(count<M-1)$ w! {1 J. }' d' E9 d
{i=0;/ M* y7 A# P5 ~* s/ C
while(i!=3)
3 A1 [# l/ ~0 d" Q3 f$ k, ]{ h=link[h].nextp;
0 k2 J% ^8 F$ @) y   if(link[h].number)
; l" S) h  E% I     i++;}
5 D$ y4 A7 Q/ b  @" ~+ [% J) d9 v. h# P( n# @* X! ?
printf("%4d",link[h].number);5 |% L- _( N* m! N1 {- C, u
link[h].number=0;
/ ~+ l' @# K* h) tcount++;
- i" o0 m, A' [}8 }9 n2 W5 ]5 Z0 E
& a8 d+ b# [# L9 g! r& B4 D
printf("\n大王是:");! W# s# c. j6 C, _4 \( l' C, ^
  for(i=1;i<=M;i++)3 x$ ~9 R8 \7 w$ L# C7 r
  if(link[i].number)8 V. T. |1 G, E4 }1 w
    printf("%3d\n",link[i].number);
$ ?8 J0 e* E' G2 K
+ W5 V" l7 g3 s
2 h0 m5 V, L' w: E% r' L# H- S) i8 v}
" B: w- ]7 Y4 b: T; w, o: Z
第三种是普通方法for循环

' x& p! }1 T+ O#include<stdio.h>8 j. m: D7 a* Q, v" H6 u' i% U: _: L
void main()4 g& i& ~# O+ ]( O8 s) b& s
{ int i,k,m,n,num[50],q,*p;
9 K% |0 i. {% @    clrscr();5 M, g& {3 B* l! b% B( r
   printf("input number of person: n=");+ [1 K8 i  z& x
    scanf("%d",&n);
, J) f* J2 i- K3 s" _7 a2 aprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只- V- \0 C* s; F4 @0 E2 R
    scanf("%d",&q);* v  m* A* N& d' \
   p=num;
& P  B( Q! n( v  for(i=0;i<n;i++)/ G+ {7 k/ w, V6 f; A1 }2 L
    *(p+i)=i+1;
7 B; M4 z' e0 T- \& |   i=0;
8 Y3 T- S9 `  G1 g, {% i. A: ^   k=0;2 z+ k( @' y  q8 o3 l
   m=0;) P  I$ F2 y8 g4 }: }* w  s
  while(m<n-1)
- E& I  S5 P& F/ f, y* r   {if(*(p+i)!=0) k++;
) {4 b. P: g: U/ G3 w( ~     if(k==q)
( g% Y$ R3 [8 w  U+ Y. w4 ~      { *(p+i)=0;
' c# N+ K* d6 M/ }% |" b2 H        k=0;
* ~% |( g# {/ ?) }        m++;* C1 Q% c( Z. _. L; y3 c" Z) T
      }7 ?. _! R( k% o$ z6 w
    i++;
2 e% m( ]; \0 x) n* d7 [( K, W' q    if(i==n)i=0;
$ ^' _& E5 ]8 f+ ^" S   }
1 P5 v" g5 O! H  while(*p==0)p++;
5 Q; O6 Z3 |8 G' B9 m, o9 K- r    printf("The last one is NO:%d\n",*p);
+ V9 y  E8 i* P, p) |% B4 G3 a     getch();
' F) v4 C) @9 q2 Y  k4 X3 Z7 V/ I" ?7 u
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;% c8 C+ u) o6 P# V- e
namespace 又费马达又费电
$ H, i- W+ `; r; `{
; f3 ?4 O3 ~9 V$ q    class Program
( Z% S5 F) E+ T, a" {    {
6 W- X% n1 m: F, N$ }4 o        static void Main(string[] args)2 a3 i7 L# E+ ?8 k
        {
  M% \; a) o7 c& q& f, s- v, l            int m, n;
* q  f4 w5 J9 F4 i, o% ]& E            Console.WriteLine("请输入数组长度");7 c5 i( O: k7 I' a7 L
            m = int.Parse(Console.ReadLine());//m为数组的大小7 d4 H; @4 J( G% V+ Z
            Console.WriteLine("请输入要截取数字的大小");
8 D& e8 c6 ~; r) S7 T5 [8 q            n = int.Parse(Console.ReadLine());7 D; t6 M" M! t
            int [] numw=new int; L. H' V4 q- q$ Q; {
5 C* G; y6 r* T2 _6 f+ A
&shy;&shy;&shy;;6 `! v  f8 K* g' c0 P' f. r
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
2 v$ o2 a! R, [* B2 Z! P( U3 f            {3 P9 `* g# T  V; |4 B* P) X& |
                numw[j - 1] = j;
  ~. {7 h2 _  u0 E            }
8 ^. w4 }* J3 V- B& e, K            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
8 E1 i& D! i6 @! {            while (d != m - 1)
& h6 S& B7 r( H2 o! ~, h            {6 R: k# \1 {8 h0 v
                if (i == m && d != m - 1)
6 V% P9 }+ b  F8 Q/ @0 F' i                {
, [1 d; |$ u0 d) K                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
5 e6 `- Q6 ^' {; l( s( v                    continue;  E* N0 f1 A7 p( [
                }
* O* ]/ J- [  Z: w/ ~                else
" n( m5 p" ~' Q3 z1 o! o                {$ }' F" C& H' n
                    if (numw[i] != 0), s& }* E4 ?) c
                    {# M" ?4 |% J; D  J! E
                        i++;3 R3 f7 i5 A' R7 U
                        k++;
5 }7 |* p! Q$ F% P' f9 {5 a; F1 b                        if (k == n)0 F  K  m, ]# i2 i
                        {1 B  K! Q6 X% b2 a
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
; q7 Z5 M( H* u2 }+ s8 m8 [: c. z                            k = 0;
3 h% |. H+ s* \' x6 ?% n0 T' C              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1  t9 c# S7 I9 @. X5 E& D4 Y8 f+ N
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
- M  j$ }9 p- _7 U+ h$ O5 A- R/ W3 E                        }
' }# T/ d) v/ m                        else//输出暂时还没有改变数组元素的值7 ~. }. a7 M; |, \
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
- {0 U7 n3 l: L$ l                    }
6 {" y. |4 G) h, W1 T8 i                    else
8 [9 ~& Q0 g5 k0 G                        i++;//数组元素为0,直接跳过,不计数。。。" D! c+ f! V7 X; P" a+ A' {" s
                }
$ T" _) d6 I3 L3 ^" w+ v9 Z
" C& V! ~0 j) u1 r) F7 y; ]- }
% J+ A) j# B* ]/ l5 @            }//结束while循环8 o" g& R1 o! r5 a5 N
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦  c, R( ?& G$ V& C
           0 b: r7 U6 D' X* R  c( I7 e5 L4 U# o
                if (numw[i] != 0)
2 T# ~, ^2 T1 w4 ^0 H                    Console.WriteLine(numw[i]);9 B! B& u" y# Q* _4 u1 I$ a7 S
           
* D* `9 o8 L9 U# h  p" o. G( x3 j            Console.ReadLine();6 }5 z. C" c; O( p! N* a
        }
% z6 n. ]/ |& y4 P; P    }4 e: V* R+ w5 f2 `
}4 j1 U3 q( w9 E7 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-25 06:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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