鱼C论坛

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

猴子问题

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

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

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

x
大家好!
/ \2 V) v- v4 ~" `3 X( l这几天我在忙着编一个问题,我用了一种方法编出来!: k7 W- \! m' H; a  A  J6 ]' W! v
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
  v3 y8 w$ k4 R& u3 n* P注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 & q7 b- I$ I: V. o* i9 E  ~8 t$ B# t. @

4 @4 e: h% ]& z1 S& u3 N* c0 \! I
                            题目, q$ I7 }5 u- l- f. S* }9 s! I
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
, R4 F6 k4 u1 J7 a7 w第一种方法:利用循环链表8 A! _; _/ J0 m* ^5 b
#include<stdio.h>
" ^% L0 ^1 }- y( ]* O#include<malloc.h>1 U. H" l1 l$ ^5 c
#define M 8            //共有8只猴子) p1 R3 Y7 w( B8 p7 k; R/ Y
#define N 3            //数到3只时退出第三只4 ^3 H# U/ q; A* T
typedef struct monkey" x* u" Y: A  J% v$ t% p; k0 D
{int number;
: ^( S6 X7 R  d+ Oint flag;
0 u1 x$ _. x: M: `struct monkey* next;9 `! l% |+ Y" K! j! d  n0 G
}MONKEY;" v6 p$ O! u, y- K" i" n  v
main()
( N8 i7 e6 ]" R7 d% D$ y5 R{ MONKEY *head=NULL,*p,*s;
, {5 z- H; n$ B8 e! B! F  int i,sum=0,count=0;! i: E6 e3 p( A1 B: K; F
  clrscr();              //清屏: D  Y( P8 j2 m. {5 }
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存9 `) g) ^% X$ f  R8 S# |
  p->number=1;p->flag=1;
  W9 _" z/ A$ E! E  p->next=head;
  i- s# p3 V$ I  head=p;/ {- B. m& n( d. }3 _4 P! g  ~
  for(i=2;i<=M;i++)
2 _: t5 J, i, l; v6 d9 R: E, \    { s=(MONKEY *)malloc(sizeof(MONKEY));: [& i  e4 q) x  d
     s->number=i;s->flag=1;0 t# I+ t; z! v6 v9 M1 e8 S
     s->next=head;3 H, g3 v7 d+ f
     p->next=s;p=p->next;
. T5 }) J1 N: E! r5 h    }
; k, q& a! B) j: Q1 {6 ~    p=head;1 }3 f- z& E6 p0 @% K$ y
   for(;;)) R; H# K6 T% d, x; ^
    {if(p->flag==1)% t: f; A$ P% t2 |1 @6 Q  Y# ^( \5 Z* I
       count++;
5 y$ b& `6 X: s, K     if(count==N)6 ?6 ^, P1 u. G0 i7 R) Q3 L7 M7 [# r
        {p->flag=0;
( F# u$ _. O2 {  Y         count=0;' k) A4 ?9 c: ]5 m
         sum++;}- J# _' s( g( ^
     if(sum==M-1)! E5 r0 v  K. j) F0 |
        break;* S6 |: _' O& k! a0 q
     p=p->next;7 K  a# ?5 _" P
    }
+ G! y" n$ [7 \5 x' a    p=% U7 E2 X- d" W9 z* `% V
    head;# q7 ?* {  y& S, Y% {
    for(i=1;i<=M;i++)7 X* Y4 k* l$ G; e% L
    { if(p->flag==1)
7 B9 f( K: M1 c% B: Y. b* M& E4 s        printf("\t%d",p->number);0 i( J7 e4 c- l' r. f# D
      p=p->next;
6 o9 Z( }/ r, w' |% k    }
; X  D' W/ Z" n: b3 S4 w3 q3 Y# G. K
! T$ p* u5 S7 g! N, _
5 y; O5 @5 R/ j# a
}

6 @0 b& I% m& |9 W第二种方法:数组. e$ A7 y9 v& _$ g, S6 R
#include<stdio.h>
* ~9 W. V# D1 k* x' Z0 U6 ~#define M 8
7 X# _* I" o2 Q" _+ t, Y! ~5 m  Q6 cstruct monkey1 f$ }) X8 s: f0 z' j% s5 g3 I
{int number;" }2 q1 N0 |; b; S9 Z1 |/ B: T. e
int nextp;- v/ V. n7 Z2 g, t. c' J
}link[M+1];( S& z4 T- G& k( A# `

# p& I/ m1 e* ?9 m! [7 ]void main()# _- t0 A  Q) C# l
{int i,count,h;
0 {% E8 ?7 q, dfor(i=1;i<=M;i++)
% z3 X% u/ X9 z! r; t# D6 t# [{  if(i==M)- s# b$ U7 e7 i+ l3 o. ]
   link[i].nextp=1;
+ B3 r  i$ V& _3 i+ H' y3 M$ b   else7 T& {* L* V2 w' ^8 l
   link[i].nextp=i+1;
1 v+ P4 E3 P3 _6 [5 J0 s( Q  link[i].number=i;
; d" o! P& `, g, v# ?% H}
/ W. k/ A, R( [# |printf("\n");  R0 ?2 [1 z9 X- O
count=0;
3 {2 A+ R3 [1 A0 f0 ^1 \6 ch=M;
8 ~; D( s, `" {) W- G2 hprintf("依次退出的猴子: \n");
* P$ }" B3 G3 K: ~0 z) Z4 N5 |while(count<M-1)( o/ @/ \( t) |. g
{i=0;, r- i& o* S( z% @
while(i!=3)7 K+ W- H& K( K9 E0 E
{ h=link[h].nextp;
* X4 d# m7 B4 C" ^" `   if(link[h].number)
  `: D0 O7 r9 M" q     i++;}
, B/ J* J# O' c+ m6 y0 t8 S
: E4 C  n: X5 k2 {: [- @printf("%4d",link[h].number);
8 l( [3 ~& y4 G- plink[h].number=0;/ `; q, d% A% X* O
count++;2 F) s* \1 g2 I1 E
}
: r6 d; s4 j2 Q! t% }% q
5 |# }0 z$ w, R  \. l  i4 y  _" qprintf("\n大王是:");7 |0 h3 U+ `) Z. Y3 P( x
  for(i=1;i<=M;i++)
0 \( \/ K) F3 ~( V  if(link[i].number)
6 P( e+ `7 u8 R; J# u) m2 Y8 x    printf("%3d\n",link[i].number);
) {7 X& r/ Q  e; d, c7 ~' [$ |6 @$ J! z8 ^9 G

- B( Q% ]; G! r7 ^}

! |% T( z1 v& f4 H. h第三种是普通方法for循环
- ^  N7 O8 p( j" F. p- J8 v+ r6 F
#include<stdio.h>3 s2 i- n) m3 V) l" |
void main()
  H. Z( u; r) P0 Z& ?{ int i,k,m,n,num[50],q,*p;  B$ v! k. }4 b# o' A0 O
    clrscr();
$ X! l. M/ _- Z7 |   printf("input number of person: n=");0 S' C* ?+ g) l3 k5 Z
    scanf("%d",&n);2 C1 v, L. \4 h$ S: s: N# @
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
2 A% O  _8 K8 @$ W# p    scanf("%d",&q);
8 F% {$ x$ K; }8 X& ?; Q   p=num;
0 d2 [  [5 X  Y9 ~' b2 b  for(i=0;i<n;i++)
+ l$ w& y4 S" h3 N& Y    *(p+i)=i+1;
$ x! ]- s0 {& a   i=0;  F  |9 F- K* e
   k=0;( r* L2 [" R# w! v9 [
   m=0;
+ h' d# \4 L, y/ L1 T& [* P3 p  while(m<n-1)
" p5 C- U" ^2 c% C/ X   {if(*(p+i)!=0) k++;/ F; X5 a( S+ \* G' x
     if(k==q); Q5 r) S0 |8 L) T
      { *(p+i)=0;: e. Y2 S% O7 P1 N4 E# k* h
        k=0;" \5 w+ F# P; A$ N2 q
        m++;" L7 t$ g3 f3 S+ {% |' {% e
      }
/ {! Y% b1 c; e/ |    i++;
9 E$ a# R& y& A5 [+ [% x    if(i==n)i=0;5 ^6 G  K  F4 a1 D2 t
   }
, D1 U+ `2 T4 k  while(*p==0)p++;% s  W# \$ y) \6 j" }
    printf("The last one is NO:%d\n",*p);
( Y5 n1 t* }( @6 x5 R! s     getch();* r8 u& X( S: \9 E

4 Z0 z5 g1 ?6 l! E; f6 d7 d/ p7 a}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
- ?( }4 M& U, b6 jnamespace 又费马达又费电
* _2 w% Z! i# W+ ^9 Z" a9 ]{$ W/ n' U! @1 F/ n. O! W
    class Program
4 \' b, z# B* D) q; i9 I) X7 B    {
8 T. j. G& O3 f/ \# B        static void Main(string[] args)7 R: z  |3 Z$ [& a
        {+ X( [6 O& h* s' Z5 X5 U2 X2 p
            int m, n;4 H% D% m* s/ P# d  U; g7 Q- Q5 c
            Console.WriteLine("请输入数组长度");
7 K6 L' w+ z# K3 j# P! s9 D8 K0 @' p            m = int.Parse(Console.ReadLine());//m为数组的大小9 ], b/ Y% h4 _1 B* C: b) h- y" w- X
            Console.WriteLine("请输入要截取数字的大小");0 [9 l) B2 M% E3 E- \
            n = int.Parse(Console.ReadLine());4 B) ~* w3 T; B3 T: P
            int [] numw=new int/ {" A$ G) s* u2 z; M; v3 C

+ B& j7 K# x! V6 t6 T$ ]' c- {9 Y&shy;&shy;&shy;;
  Z0 W) ~( ]0 C9 g' [$ b            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
) K* e. ?+ s, M4 T/ t7 }: }            {
* J5 m  z, [! m. b, `8 o; Y' f                numw[j - 1] = j;" `7 Z* h7 u- }6 S/ p$ ]0 }8 I4 p
            }
9 Z' j2 g4 m1 b* p. ]$ `            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
. r7 ^; Q6 Y$ r            while (d != m - 1)
/ Q4 \, A; a. N3 `8 F            {7 r, ?; F  Y; t& P$ {; U2 E
                if (i == m && d != m - 1)
/ R2 g4 ^- y3 [- _  v/ J- Z                {
8 s3 s1 T% f2 R. k( f2 F- E                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
. Y2 W+ i0 ]. y; g7 u                    continue;8 B9 m0 D  ~8 Z8 P
                }
+ e; `6 k' F! j# H                else
  j3 x( d5 R0 R2 b% ]5 A+ S9 p                {
3 N' G3 H; d# \0 ^+ \" m3 S: Q                    if (numw[i] != 0)5 |% L) ~$ F  H! q
                    {. c* L; l! Z1 x, Z! z( f
                        i++;
2 l# _& ?8 G  W' {; F                        k++;$ B) s6 O$ R1 r  b, `  n- \  J
                        if (k == n)/ ~( y  a. [6 t' {+ n: _  Y  P
                        {
9 g& Q4 {$ F/ ?( w2 S+ }                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
$ p) k- I3 j8 [2 E; u+ |3 o& g0 i1 }                            k = 0;
- i- Q% I5 Z6 W/ P; J1 L              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1  e/ p1 _2 m4 l9 V
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
! a" ]& q# S8 ?- k                        }
0 N9 T1 f7 a- |  P                        else//输出暂时还没有改变数组元素的值* y. r8 P& P8 f2 G) r2 t& y
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);1 _9 {! ^& O4 ?/ d% B; k- K
                    }
2 u- c$ W' U& L) K                    else$ {% {- q, \( i' ]& X
                        i++;//数组元素为0,直接跳过,不计数。。。& _' [3 e# h1 P- }# t) w
                }
: v- i2 y/ Z) E
8 D; G, J. E% }/ c/ n- R- q7 G* p. |4 O
            }//结束while循环/ \9 |* g$ I) O* c) R
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
5 w6 f- B9 m: v% w6 Z/ v5 `           1 n. K: I2 f8 ?; l% I
                if (numw[i] != 0)- M4 r  Z* l: F: b7 |+ V5 c; \
                    Console.WriteLine(numw[i]);
+ U+ |; J" }" U- ^/ Q           
8 Z6 N5 z/ E2 f0 N3 \2 Q            Console.ReadLine();
7 N4 C, e# [' m        }( \9 S* C; X) i/ Q7 t& n4 q
    }
8 y* B& U/ j0 }" i) y- K: l}
" w# f, h6 g% s5 F7 a/ 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-4-28 02:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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