鱼C论坛

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

猴子问题

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

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

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

x
大家好!# s* Y0 n6 s- y- f" ^" X+ d% {
这几天我在忙着编一个问题,我用了一种方法编出来!
4 g* q1 Q1 Q0 \) B/ E但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
9 P& s4 `& a+ @3 [/ Q9 M. s注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 6 Z2 C  P% m+ ~2 Y% H: B+ P

% m4 W& U$ `0 b6 w, F
; v7 g: z, s5 t& j
                            题目( i9 |' e4 W  [; U0 V. b8 u( |
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
; r7 H) k5 C3 R6 H1 L第一种方法:利用循环链表
; R( Z1 b4 T1 y" L#include<stdio.h>
2 {# F" h( w7 L. m, |) \  L#include<malloc.h>0 F3 C& |; H( g
#define M 8            //共有8只猴子
2 @- F  l6 {" j& f* m3 G#define N 3            //数到3只时退出第三只/ `; N6 [  X, o5 d6 Q; U, u8 m
typedef struct monkey0 @. V: p* Z! W: @& Q, ^
{int number;
, r) e/ q% z% j7 B1 @5 X8 O0 qint flag;3 p; Z" K$ w+ g" ?, K2 z
struct monkey* next;. r6 h. n; N! k" A2 [% p, i5 g- D
}MONKEY;. a  M; t) j- @! A9 C
main()
6 R7 Z& B0 X9 l! h- X{ MONKEY *head=NULL,*p,*s;
# `& g, w8 ]2 n5 g0 D: Z. _  int i,sum=0,count=0;- s! K' q4 w; S# m0 N9 R2 l" R
  clrscr();              //清屏
7 o2 y: y) f0 o" u0 \+ N  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存7 g- u: A, V; e
  p->number=1;p->flag=1;
, ^9 B6 `* z% J7 y  p->next=head;6 J9 Y" j' b, j* S) E$ K, z
  head=p;3 `, S/ c: I: Y
  for(i=2;i<=M;i++)
0 y. u) y; s7 M) p# ~. u. @    { s=(MONKEY *)malloc(sizeof(MONKEY));
0 g. O$ {$ S1 R* M3 i     s->number=i;s->flag=1;
5 B! V& u. q9 x! \9 h& ?7 Q     s->next=head;
$ x8 I% a" ~  ^$ r, c( C+ w2 q2 O     p->next=s;p=p->next;
. f" e; N6 [4 C" n# Q' U5 u    }
. F; |, V! S  r! U    p=head;  T/ g# t3 l# \" {* c9 i4 f4 v
   for(;;)$ U2 ?: s& _- g. X- E
    {if(p->flag==1)
+ C! v; N7 ~5 h; s" Y. n/ \       count++;/ `1 J0 R1 c8 G& J0 {  M' B  y' s
     if(count==N)' n. W4 {) T. l  e& }2 G
        {p->flag=0;0 R! N0 u; S: R; K; D: N
         count=0;
; Y/ X8 q7 ~+ [, d: u1 j         sum++;}: Z1 Y- Z5 [) ^+ @7 H
     if(sum==M-1)
! K# F+ ~6 `. ]5 i        break;5 }( A2 ~* [& |" a) K: c
     p=p->next;
4 G( F' [3 C, s7 Y. P4 O    }
  d$ b) p5 g0 [5 q. n/ `    p=: J: z% E$ r/ Z" L
    head;
- F/ r, E4 d5 U0 \    for(i=1;i<=M;i++)
) u% e8 L% U) f$ ^! {: c1 E3 z2 X    { if(p->flag==1)( m6 I6 e7 a3 m; G- A4 K! ]0 O
        printf("\t%d",p->number);
" t* s( D/ u* ~: `      p=p->next;
6 E5 y6 W" g% P4 Y9 Z. P/ L    }3 g3 A& L; U4 q8 y0 \4 F

- i9 t0 v; P+ v2 S  [  y
6 p/ f1 J1 O6 R! p
3 Y( X3 S; M# H& i# v3 M1 I}

' c* Q1 w* X8 L1 K3 T) y第二种方法:数组# ^/ u9 s5 A" q! A7 a9 J
#include<stdio.h>
8 \6 i; x' v" w, J( z#define M 8
% L( C1 D$ `+ `, J/ a  T1 Q7 fstruct monkey* q. Z7 V: P* _) W0 X
{int number;% B# S8 W+ P/ `- u4 p' [- M
int nextp;
  e+ s% j" j4 l9 |* o1 r9 {/ u, R}link[M+1];
6 }- s* o( {, |) o' A
) z1 Z; u' {  H7 V7 Svoid main()" O! z1 u) Y9 _+ \, H' e% h& I
{int i,count,h;: |  V6 T& n1 p# z+ Z! i& E
for(i=1;i<=M;i++)6 h3 D- q  e. |% j, m
{  if(i==M)
0 z, c1 }, g) D( f   link[i].nextp=1;
# E4 r. B6 I+ i! [# D0 l   else( {# i. V+ H+ I7 S( w# k
   link[i].nextp=i+1;6 H+ U8 s4 {$ p2 W
  link[i].number=i;
; s* B/ w3 v. p0 I, T) V# `# |}/ {3 T( u' i9 T# @* K  i; F1 |
printf("\n");- Z( ~) _% U% |8 o: z( {
count=0;
- T! }+ Q$ b' ~) k; r) lh=M;$ c6 Z7 k# g- c" D3 o
printf("依次退出的猴子: \n");* Z. a/ \, k8 ~( u
while(count<M-1)) S. L# ?! s( N+ B; N0 M& v2 R
{i=0;+ m$ U/ R2 R* ~; n+ P4 c# A
while(i!=3)+ |7 N8 z2 E9 f- @0 `# C
{ h=link[h].nextp;
" X# m4 X& _* k9 d5 k   if(link[h].number)6 t2 v2 [  E  B
     i++;}: s  N0 \2 ~6 Q

1 r9 _- q1 a& B) q+ r! ~% Oprintf("%4d",link[h].number);
( w7 @4 |" R( W# slink[h].number=0;. Y( q* d# P; s* V3 V( x
count++;
+ P* _5 w/ c6 v. H+ w) s}
! e. I7 K" N1 Z  z! Q! e7 u$ c# y- `5 B% W
printf("\n大王是:");' @* d' L0 Y% p, p5 t
  for(i=1;i<=M;i++)
, q$ I/ l: d/ j1 C  if(link[i].number)
" u6 |9 B1 U/ B% d$ F    printf("%3d\n",link[i].number);1 c5 p. Q; k0 K- ]7 s" C
: z7 O- K$ `; I7 H0 J' X. [) d

$ ]  L7 }! D, B, O; i( v$ \% R}

& F8 F: L5 v# B% K- H第三种是普通方法for循环
7 I, R$ e; N. r0 c& H6 ^6 c  `/ a
#include<stdio.h>
) e" i3 L1 x& vvoid main()
- Y3 T/ C- _# q' i{ int i,k,m,n,num[50],q,*p;* ^* j# v, u  B/ m2 u% k8 Y8 J0 {
    clrscr();
4 [; |8 d( A  O" q0 y' ^; l   printf("input number of person: n=");0 V9 r0 i7 K5 B% Q
    scanf("%d",&n);! {  a8 I; O6 b
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只. F$ j" O7 J* B% K0 W+ S0 J
    scanf("%d",&q);
3 y- m! [2 D5 M# I   p=num;2 \8 m- g" E6 G% I; B# U: z
  for(i=0;i<n;i++)
/ V4 q; J! D  x- Y$ M( e" W5 d    *(p+i)=i+1;
- B! m9 e' b% D: n, J1 Q9 Y( H   i=0;
% r" }1 W' u9 p+ y9 A! F; j9 j   k=0;6 b7 q4 }2 [4 d' `7 p' ^! i/ N, z
   m=0;' D) u' k. s2 ]. `
  while(m<n-1)1 q: o" E& c' R0 }" P: i; Z
   {if(*(p+i)!=0) k++;) K: P$ x  v6 M& y7 @) @
     if(k==q)
  x1 H! U: k- U# P/ N  t      { *(p+i)=0;
( l4 v0 ]8 |% `  {9 w        k=0;
: p& O$ U7 q' R) Q/ t7 T+ G, R) j) m        m++;
; J/ f$ _9 |7 j+ _* D) n/ R      }& @+ F. ^! x. h! u
    i++;- g  `( k- D  u+ m( ?% g
    if(i==n)i=0;2 L6 U3 k4 y8 }$ K1 |
   }
/ D: }2 W" i: {3 j0 _9 U9 V6 o( h  while(*p==0)p++;$ Z! r& O6 c8 P$ X
    printf("The last one is NO:%d\n",*p);: J# h3 f( _8 b% f  E0 Y6 Q
     getch();
  m, u1 j* i4 ?# o9 s) S
$ U% x. d+ w& t6 S" i( p2 W}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;: J. O6 {0 V+ H' d& b0 [6 u
namespace 又费马达又费电2 y5 W7 X7 ~2 ^0 f* f4 H* d- o# c
{; i8 K6 _7 W5 E+ t
    class Program% @9 k( ]' h  C1 ^: I0 N% s8 Y2 h, s
    {0 }7 }9 {2 s7 ?$ S, q, u
        static void Main(string[] args)
3 A. a/ u, B8 D* i/ E/ u        {  `6 \. O$ l- H1 A) B
            int m, n;7 ?* L- {8 g; W6 E4 T
            Console.WriteLine("请输入数组长度");
' x! t' p/ N+ y* c3 f: Z            m = int.Parse(Console.ReadLine());//m为数组的大小
: b  b- _  m4 J( ^, L% W- e            Console.WriteLine("请输入要截取数字的大小");
3 r& q7 K9 O- I* q( U) _0 o# C            n = int.Parse(Console.ReadLine());
$ E& H3 g$ e, L0 J0 e" t            int [] numw=new int7 B8 V' B& C/ I' Z# p& o
: \# d! B% U5 A
&shy;&shy;&shy;;7 J9 R7 ?+ C, Q; B
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数9 G6 N- w7 O( I  _2 S1 `' p% O' M
            {
1 C1 f2 m4 t4 A! u5 o                numw[j - 1] = j;& T: s  Y7 a$ a% ~, `
            }9 q2 h4 e% d2 S9 }& e
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!' n8 S( l/ A6 Z' Y' t* o! [/ @
            while (d != m - 1)% I6 I% N2 c  {6 Z
            {
/ A% \, o" Z/ P7 l                if (i == m && d != m - 1)3 h8 N) o! ]: z( i
                {# k6 {, J8 A6 k8 }! k% _# z
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
! q* p% J$ x! \9 a4 [5 _                    continue;3 j0 K' y2 J# H
                }# M3 A% P% m' j+ u- e9 ~
                else7 G1 |+ g& S: R: M: x
                {
+ J' y$ [% Z' e% j' i) k                    if (numw[i] != 0)
. L0 ~7 s, z7 D' x6 ?; A                    {, F6 z/ D; `" I& J. @$ O
                        i++;4 t. P! z5 U0 G7 _( z: V1 v% X
                        k++;! }+ _3 e" K7 b6 N& c% V! n
                        if (k == n)2 H9 v7 K# }2 t  b1 K% a
                        {3 f/ t1 X6 {, {# u0 U: l* U
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
0 G. n; U1 G- H* M" z4 ?0 {8 @                            k = 0;
: B% S2 L8 T% k% m' y/ `              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
' g8 m' I- o# Q( l                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
7 q% Y9 a5 H" w                        }
+ u% B# k, j& T6 l                        else//输出暂时还没有改变数组元素的值! |* O* T  o$ J" F
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
/ y! q+ O: \# E# s0 T* U                    }
. ~, a# O$ e% Q; D8 U                    else
+ z7 X5 e3 r1 u5 }1 ~( V+ e2 Q6 g* |                        i++;//数组元素为0,直接跳过,不计数。。。
) ?7 ]) M" }2 O* t7 ^  x. ^                }- p5 T. _% O  A1 g7 \

9 Y9 `' G4 W* y: K3 _/ j- Y% c, t8 ~
) ^8 @( R$ J$ v7 I4 n: v% b1 F1 f            }//结束while循环
% b5 g# E6 {0 `" a            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦" A: k: A, I0 F" D1 e  f; N7 l7 B
           
7 _0 [. C, A9 }: W: T; t' |* Z* N; H                if (numw[i] != 0)
' m( M& w  f; T$ w5 J1 V: A" A. {                    Console.WriteLine(numw[i]);- k' W5 q: ?8 X# H& E4 ^( t
           7 C4 I  h+ o+ N2 A: O+ k$ T
            Console.ReadLine();1 o) P+ Q5 |7 m; G6 C$ F1 Q
        }
0 Y+ w2 d: [2 h! L0 z# R    }5 A: l8 _6 ^& d; f  W6 }& v
}
$ z) m9 A( H2 V$ y& `
小甲鱼最新课程 -> 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-18 12:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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