鱼C论坛

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

猴子问题

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

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

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

x
大家好!
  K' u* T( g. s! n, ]# ^# s这几天我在忙着编一个问题,我用了一种方法编出来!& J2 l2 V' W+ _# A. d- y* j
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!! W7 |2 P9 g; P: S/ G
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 : N4 [9 Q" n" `) t# ?
' w8 G8 F4 s% P* v! L
/ r: X6 x4 ?) ^- W% L* Y) U
                            题目; ~* ]" p3 R/ x8 J* {# Y) g
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
- F. p  p5 Y. P3 R- f第一种方法:利用循环链表( U1 e9 u0 ?% C7 l: V7 P
#include<stdio.h>
4 {' |$ u6 W; y. Q& S; F#include<malloc.h>1 t  q# @8 G% l
#define M 8            //共有8只猴子
2 Q( V( ]# [+ B#define N 3            //数到3只时退出第三只( |! L* U0 |' P
typedef struct monkey
. i' ]* T; r, ]& [# F+ P{int number;4 N* p& W9 {! R9 G* M4 V( e
int flag;* T  e7 t, T# M0 x( T4 a# r
struct monkey* next;
# g3 G2 q& I/ [* b, Z3 g}MONKEY;# p! n1 |! \9 O$ X& a3 L
main()5 q& r! w. u$ G7 {6 w  [& p$ R
{ MONKEY *head=NULL,*p,*s;- @" ~+ X' U5 p7 |2 K
  int i,sum=0,count=0;
+ c# y8 l$ t, Q. Y4 B  clrscr();              //清屏2 Y9 r8 k( j; K
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
5 f2 z+ V* f2 U4 C7 o- _/ ~  X& b) v  p->number=1;p->flag=1;. E3 b+ z1 f* a9 }4 w0 i* \
  p->next=head;4 L* z; Q6 K+ f3 }8 ^
  head=p;7 t, X) T- A1 i. H
  for(i=2;i<=M;i++)
* D7 p2 z6 W3 A$ i5 _& V# ?' X; ?    { s=(MONKEY *)malloc(sizeof(MONKEY));. @  v+ r6 l6 Q( }
     s->number=i;s->flag=1;" Q6 q2 x+ F! Z! L6 L1 R$ J: T5 y
     s->next=head;- `/ o7 t* \% Z/ v: {! L- T; ^& q
     p->next=s;p=p->next;0 E' }( m; G4 g; |$ Z2 o4 P9 n
    }
2 U- u" _' p! x' n& W" P    p=head;" I9 n+ t0 h% ~9 r* W
   for(;;)
; Y5 \$ Z7 ~( |) `    {if(p->flag==1)4 e2 F+ i% j2 `1 V9 j% g) p/ h3 h
       count++;7 q: B1 f% e% V$ e4 q
     if(count==N)$ ~5 A7 C* `8 ?5 M% d- [" w
        {p->flag=0;
5 d. K% K$ q. o7 _         count=0;( [# O& c6 C, _5 l- M
         sum++;}9 Z* P! t/ i3 O- z( b5 p! X
     if(sum==M-1)$ b% N( r) n$ Q  c$ x! r- J
        break;
# }1 O8 X( b) j6 [2 E. c     p=p->next;
& x/ v, F, r; H, t7 x6 I% D    }( O6 |# y' @6 [4 v+ p- x
    p=+ X( W; |- D! F: V, T1 Z
    head;4 ?$ j! _. X; m: m: ~7 g
    for(i=1;i<=M;i++)
4 x5 x$ H% b- }3 m$ u! Z3 q6 f( X: l    { if(p->flag==1)' L, O$ d3 F1 t; `
        printf("\t%d",p->number);
6 q" i4 M& O6 J8 c1 J' x. g- j      p=p->next;8 z2 p8 I, \8 t. {
    }
* O6 R4 h. A+ V! G7 s/ [0 x
7 B4 o. R" t4 B
6 [+ F( Q. P) I9 k# C
: F# X: H- J4 I, s}
# _2 i! W1 F8 |7 H3 H
第二种方法:数组
. u! t: N7 T: e. n0 f4 T1 g#include<stdio.h>
  a1 `: q/ r+ d" y4 i8 [#define M 8) ?& v+ y. G% N2 k% N, ]
struct monkey
' n6 H, Y( A! p$ Y+ w* }, `+ G{int number;
3 h/ T  U' ]! x7 dint nextp;4 H2 X: g2 r7 F4 d3 i
}link[M+1];
& n, y! k$ W: X, {3 l4 k& L7 e6 D7 J
void main()
! R# k6 A- g2 ]2 a4 _{int i,count,h;
2 c7 Z, L8 v$ E9 O% T& d' W3 ?for(i=1;i<=M;i++)
4 s2 D" n8 f4 |$ b6 h) w, O{  if(i==M)
3 N5 K9 \, X1 I" l+ Z0 q   link[i].nextp=1;
4 e+ `5 ~$ V1 q   else
, V9 D) L4 F' q  U+ j& q   link[i].nextp=i+1;9 l, s- x, D# t' K/ P& O6 \7 C6 i+ t
  link[i].number=i;2 {6 o4 ~( M" A: a0 \
}1 q5 W3 o0 E8 S* {
printf("\n");+ h- f' l" F: n0 ]( U
count=0;
7 k8 q( _, Z7 R  Dh=M;
' x& C' t* s$ m& n' h2 T% W$ [printf("依次退出的猴子: \n");; _% B( V0 V# j7 [
while(count<M-1)
, ]1 {! }7 v% z3 R{i=0;/ ]+ g- N" i  j
while(i!=3)2 V% A# h  B- `2 @) ?
{ h=link[h].nextp;( B! h. U0 w% S$ _' P. ^
   if(link[h].number)7 K% [. K8 v( o& M
     i++;}
- P4 i: ^- r! ^- ?$ b6 `/ ~+ e- N9 J9 l' d5 |
printf("%4d",link[h].number);
: ~! A2 Z: \/ M; X- E" [" v7 g) Dlink[h].number=0;" A& T; Z4 K: u% d" m! v8 |  `
count++;! x  Y# W: H& p6 c0 r
}
$ R1 |) e3 S' r, P/ t
. c2 D% m. ]- K9 q- Zprintf("\n大王是:");/ j' @5 h) L" n+ j5 x. M/ Q
  for(i=1;i<=M;i++)3 b# m  k) A5 v! H1 V" w
  if(link[i].number): x8 Q# d) ]# B0 M3 g
    printf("%3d\n",link[i].number);
$ f7 V, n6 @5 q. O0 V: s6 ~' U$ R. C0 Y& |1 }8 j" N! U. |

* G- n' T5 x( U5 c4 S. d0 x}

- E: u( \/ a7 z- R, r, ~第三种是普通方法for循环

! J9 y) S- C& W#include<stdio.h>
( g' S5 H! Z) q* e* [( v! Evoid main()
% ~8 t; `9 C0 @8 [" d0 a/ O{ int i,k,m,n,num[50],q,*p;/ T( q  z" Q  s1 R
    clrscr();
7 t  S# J4 O; F2 C) g; g$ C0 H4 p   printf("input number of person: n=");- Y" F. i5 H* b4 l/ Q
    scanf("%d",&n);+ `+ k5 {8 x8 D
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
6 `" b* p- z2 a1 r  M5 ~6 w6 I( C    scanf("%d",&q);$ T( \5 u: ~6 I0 s/ X& e; M
   p=num;
3 t& u- P: k3 Q" J  for(i=0;i<n;i++)
- [1 E$ V* M% }& h: {0 o$ a    *(p+i)=i+1;
3 ^6 ^: e, ]0 K: K   i=0;8 x: w. h: `& I5 p0 F
   k=0;
  F6 o; d3 `1 U" a, Q4 e   m=0;
" R1 H8 [+ N( _* e/ M  while(m<n-1)9 i% }6 z8 ^. G- q
   {if(*(p+i)!=0) k++;
4 U- E& J5 p; {     if(k==q)
2 C' ?+ q5 F/ R1 K. b. F% ]5 j      { *(p+i)=0;
" f" r1 b  ?1 A1 {        k=0;
) I: r: \5 X' r" o( u        m++;
" R( g$ k( z& _      }  ^5 K' d; \2 M/ ~
    i++;
8 x  N0 ^1 c1 b    if(i==n)i=0;
) X2 G! V9 k* m" l4 i4 l# I( D   }
: K! S: b! ]  O' x; B  while(*p==0)p++;: j- X" ]/ i4 r* T- r* P0 _* |
    printf("The last one is NO:%d\n",*p);; B" N8 e- ?# V; F' K
     getch();
7 I3 M: r8 S# U7 p2 l/ o% a( E/ E8 K; k9 \7 w
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;0 E+ y! Q( x) N$ y" }; c
namespace 又费马达又费电
3 [) \* }  F! v- }4 x: s7 y{2 K3 ~- Y# B4 B! E1 z
    class Program, i7 Q5 @  I5 v3 |  {% t" o
    {9 U9 ~1 @5 P8 F
        static void Main(string[] args), }5 V1 I. h6 w% H/ L; \" v; N5 o
        {' P  m) \1 A$ x( k: ]
            int m, n;( o; ?1 ~5 q& S6 h
            Console.WriteLine("请输入数组长度");
8 x9 d3 Y1 R( ^' L" K9 k4 G' B7 F& `, }8 |            m = int.Parse(Console.ReadLine());//m为数组的大小
8 Z0 G/ K0 [4 C5 ^# S+ j8 l  Z+ o            Console.WriteLine("请输入要截取数字的大小");2 E$ Q% \% _' l4 g, ?: l
            n = int.Parse(Console.ReadLine());/ C4 c! l( S& b, G) ~+ S
            int [] numw=new int
( _3 g2 `# m2 s* V* W5 F( a) T, I$ I6 w( |) g- B5 `
&shy;&shy;&shy;;
3 R( _7 j' ]6 k' F/ n            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数" f; }" N; E, y# ^  e
            {
% t5 U0 x! K1 x$ d2 ?# V+ e                numw[j - 1] = j;! h# o1 `3 |' {3 [
            }
4 b: c/ W5 M! _& h( V            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!2 y; d- l" F) k
            while (d != m - 1)0 i6 f, m' @( G3 m
            {
& q, B& z; @* s, I! B( V: V& W                if (i == m && d != m - 1)
, x" g1 g0 D1 x! [# n                {
& g2 W- C# g- g) E2 Y% [                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
, G% {' O+ w; \; k                    continue;' U: l1 r+ ~( d. [- z
                }/ D8 S: q$ r: v- i
                else2 C. L3 q' b2 r, R3 W
                {
) z# h$ ^' }6 u  S1 J3 L' ^6 U$ L' S0 S                    if (numw[i] != 0)
; W1 M0 K. c8 R' J" d                    {
' v1 ]3 _# n5 r4 Q& ?8 N. T( Z- b                        i++;7 g9 @6 Y' |( t8 K+ w) B
                        k++;
5 f  q( ^# F# K% A                        if (k == n)
- t8 ~6 Z- l& X; j                        {6 ?5 g; Q$ M& s
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
( X! f6 Y6 |8 L; `1 B                            k = 0;1 z! W: s/ i( P9 H& d. G0 K
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
& n; r. M. {0 S" f2 S$ o' O                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);6 W' ]% d5 V3 b# A- E7 U
                        }
7 i( }3 k  c* r3 n3 u/ i                        else//输出暂时还没有改变数组元素的值
$ I3 _1 c5 M! K1 _3 H$ A                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
6 v+ W0 c6 w$ F4 f) x* f+ i, |                    }
& B, |+ q: }3 {. k: `: P                    else) Q: h* d/ [* z3 D$ N
                        i++;//数组元素为0,直接跳过,不计数。。。  c* h& m* G$ t0 f
                }
- B, h0 P* O5 D% y" u ; x2 E) B% k: J
  k' {0 ^: k: T5 j- v4 \
            }//结束while循环
. |( e" e; g* V            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦0 ^; V! w' K* T2 {2 Q
           & ]9 S, S* r# a7 p* p2 ?; b
                if (numw[i] != 0)9 C- A5 v! a' Y
                    Console.WriteLine(numw[i]);7 x; G, j0 [! c% g) I% E5 ^
           ( g6 p) b' i. b+ X! v. N3 n
            Console.ReadLine();
! v- o3 [3 L8 j( s4 W        }9 w+ H: V$ P+ D# B
    }; c. t1 v4 Y: X7 }, z
}9 _7 i$ U8 x. {. S4 ~! [8 n& X9 x
小甲鱼最新课程 -> 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-25 19:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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