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

猴子问题

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

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

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

×
大家好!; V. p/ z$ e- y" i! Y
这几天我在忙着编一个问题,我用了一种方法编出来!* x# q/ H5 O, d0 s" S
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!: e, a% Z$ p  ]" Y
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
1 k6 {& A) e9 G& l4 A% L+ \+ }/ O: l: V2 y/ S7 E

' W) w, Y% W7 x+ q
                            题目' {( z  C9 S  q$ x! i
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
7 Y$ N  b: g% i: H! K" [! D; r第一种方法:利用循环链表
9 D: @1 P  u6 f2 c3 k#include<stdio.h>7 y  c# r$ C! y" B( Z, r
#include<malloc.h>
1 B( s. W/ ?: P5 D  @#define M 8            //共有8只猴子
) b3 p- w: K. `2 r7 {#define N 3            //数到3只时退出第三只5 o2 ]; X; U3 [2 p/ }) c
typedef struct monkey
6 N0 i& E- U  ~7 u. V+ J5 K. ~{int number;
& y! l: a4 ?5 w( }4 ?: c' x% Uint flag;2 }0 W" b. w* S+ e4 v8 |
struct monkey* next;: v; b3 O7 L4 k+ X* X6 x. i1 R
}MONKEY;% ?- v9 }8 {8 c' Z6 p1 d
main()
: z$ n$ f/ w) Z/ h9 `{ MONKEY *head=NULL,*p,*s;1 E  \8 t( x" {, c
  int i,sum=0,count=0;( K" b! D: p$ I, h' U
  clrscr();              //清屏5 Q7 q  \7 Q3 [/ G1 ]2 f
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
9 a' ]% o/ ?+ e, E8 i' |; m1 C  p->number=1;p->flag=1;6 i1 r2 C* b" E, E5 k9 k( O
  p->next=head;  R! m5 A( B, C7 b& D# v& l" F
  head=p;/ ^# a/ I0 S4 {( z# @* w  O0 E
  for(i=2;i<=M;i++)
1 s, j7 y) w2 U3 B8 B9 }. J. |    { s=(MONKEY *)malloc(sizeof(MONKEY));" l  z" ]6 I- o9 D; `  m
     s->number=i;s->flag=1;2 g6 f9 e$ j; D4 f/ i
     s->next=head;. N! D$ I( C" T) e  m8 N
     p->next=s;p=p->next;- }' P9 ]+ a4 t/ u: x+ |
    }4 X; y0 n  r2 ^$ C  H
    p=head;7 {5 J$ f9 P: y) M% z" v
   for(;;): o* c0 k: o/ D! y  M) J7 l
    {if(p->flag==1)' |7 d" a1 Y7 H- X
       count++;# F3 {8 A" w4 q3 R+ s% Q
     if(count==N)
( K4 ^1 n% {/ U% I4 h, t9 |. |        {p->flag=0;
7 q( I1 `6 B" [2 I; e2 o         count=0;
' A5 w7 j* j: C/ @% f( f1 k" H         sum++;}
! @' J( ^% ]2 N     if(sum==M-1)$ k" a5 }) n3 }6 _2 ?
        break;
2 s5 {8 F7 @/ ?, r$ w     p=p->next;; F) p4 s4 V8 a$ v9 Q
    }
: p- H# i* b  w  y6 U: T    p=& T. j2 o9 r, }
    head;
4 B. d' O7 T! g7 Y) `% H    for(i=1;i<=M;i++)
- I' C) L; H- W0 N' E6 i4 Y* c    { if(p->flag==1)9 h" q0 V3 D9 t: I8 @
        printf("\t%d",p->number);. l; l2 V9 ~- v
      p=p->next;' Q6 t, @+ q7 h+ @+ j: i
    }
/ \( ]/ M/ e4 M( X: |" k/ ~1 [  h7 p! x, I$ V) w/ w* G9 s

' @2 I% H' f+ t3 H; T* R  q* F/ A1 U7 V: j" f; t
}

* l2 @4 Y" `  U8 z  R; W第二种方法:数组8 {! j8 q% s% N0 w: p4 M: Y6 h  u
#include<stdio.h>
. h2 |! v9 \  N+ |# k1 h6 N#define M 8
* B; f$ B3 A% _) P+ D5 Sstruct monkey
7 R8 `. a2 g! C  o{int number;- [! W/ a# X7 @0 h8 Q. f
int nextp;4 O9 p0 w' |) s- n. q
}link[M+1];7 R" E& Y) k" L& g  x+ \" g0 n, W0 |

. n' Q* o! C3 l2 {& ovoid main()
/ e7 H6 X. S& l% r8 y7 |+ U0 ^{int i,count,h;: @. e$ X" L) J5 N# v
for(i=1;i<=M;i++)
, R: Q1 M5 A( {+ V. k( ~; Q% ?% _{  if(i==M)5 g( S8 G7 C9 h; ^5 D, H
   link.nextp=1;; s' s7 }) c4 L3 e
   else
, {4 g1 |# U, `: n; X/ _& [   link.nextp=i+1;
& @0 _. B; J5 d( o' E/ i% N  K  link.number=i;
+ {& \! Y7 Y* J! _}8 |7 y  K& T: d3 J! i8 x2 R5 _
printf("\n");4 w! J- B& G2 B+ i2 G
count=0;
" E' q( @9 `' S, J4 {8 \# M0 f/ th=M;
2 _) @0 Q, S0 I% K1 S6 x9 }printf("依次退出的猴子: \n");/ E" n: E5 Z, Y' N, x) b& J3 J4 u# C
while(count<M-1)
' h. k  w1 `# W0 |  Z6 Q; O{i=0;
+ V. T% |7 S1 X! Swhile(i!=3)
; ]+ K1 i" o6 \7 D7 `{ h=link[h].nextp;  c7 @- O' Y/ v" g% x
   if(link[h].number)
! q8 e0 {* z9 Y5 P     i++;}: X" h$ M+ X4 x: A% C- ~; ^

4 S- ?$ _9 {0 E8 aprintf("%4d",link[h].number);
% M5 }+ G5 x6 h- e  n+ Olink[h].number=0;- m: z" B- E5 u# E9 r5 T, v" R
count++;, ^3 ?/ |6 Z& T; n$ S0 Z( G
}
) D8 h" C" I- l9 V( F( a2 v% _# a
printf("\n大王是:");, E0 ]1 Y3 J: w! h- ^$ k9 s) l
  for(i=1;i<=M;i++)
! K% s; n7 Q+ s* f2 }% U  if(link.number)
9 d0 _6 w5 D3 [+ q) M    printf("%3d\n",link.number);+ ~$ n& [4 _" Q
  `$ ~2 P" Y1 q1 M
2 o+ O) \9 ]2 B2 F& C5 A- \
}
* u6 G6 u4 p$ L! b6 t
第三种是普通方法for循环

' T) ?4 y2 @9 j: _, S6 F; v#include<stdio.h>
6 _- D0 z7 Q6 y$ uvoid main()+ t+ H0 Q& X' f* b; n% C
{ int i,k,m,n,num[50],q,*p;
# a- e3 A' u0 W6 t) T. ~    clrscr();* }, o* Z$ F& S9 H+ ]7 ?3 `6 q
   printf("input number of person: n=");
# K7 x3 X) q( N8 `' a. c' s    scanf("%d",&n);
/ J; O4 E( Q. Bprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
4 t2 h% |0 b7 c" Q    scanf("%d",&q);! P: Y( o( W7 \# V
   p=num;
4 n: x% C+ c: ^, q( ~" p9 [  for(i=0;i<n;i++)
5 ^2 ^) \8 i+ A5 ?9 N8 F( c% v1 y( X' @    *(p+i)=i+1;
' x, b) J8 L2 }( x: f   i=0;
: O9 O7 H" E# O; k7 r& M3 d   k=0;" a' @( V+ j, q5 e; [; K8 g0 [
   m=0;. j' H3 @; q. S% \* _
  while(m<n-1)& Y" }/ [$ W/ w: T8 t: K5 \
   {if(*(p+i)!=0) k++;
( X# d  x) [0 L) R$ D! H( t     if(k==q)/ r6 t. F, D' i& Z* g
      { *(p+i)=0;8 i, y" ?& f3 m2 q# W0 f
        k=0;- ]* r% H- ?0 Z  B7 f) L
        m++;  K- S  Z. ]- ]
      }# V9 W/ N7 g9 f5 Q8 k
    i++;
% U/ n+ Q) D+ D4 ^" R0 }) r! e    if(i==n)i=0;% o3 x6 ?% f, L5 l2 l' B) N* D
   }' f1 D  ^1 h: m$ X
  while(*p==0)p++;( x3 y) \; ?. ^4 z( r$ h
    printf("The last one is NO:%d\n",*p);$ m' ^( z& N' y1 w( |
     getch();- P$ N" b# @/ k' I: r: v! v

1 q  [5 ]) ~; T: @' X, a}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
6 f6 D1 w* c. L+ i4 Mnamespace 又费马达又费电
. F, G: b3 n# W+ I5 P: w2 i{6 V8 K$ V, h5 c6 T
    class Program6 ]: w) o4 F8 w# _) f5 B& }, Z
    {
- D  K. _0 l0 a+ E+ N+ P2 D        static void Main(string[] args)3 O. M3 g+ }. f
        {
: S4 ~( `& I1 Q! u            int m, n;! }# `7 r8 J' K* l( x3 Z* C# J
            Console.WriteLine("请输入数组长度");
6 R( q4 f. C" S; J/ D: A8 y            m = int.Parse(Console.ReadLine());//m为数组的大小
; ^: ?+ @# ]8 x( |            Console.WriteLine("请输入要截取数字的大小");% ?2 z+ ?- ]" t  G4 t- _
            n = int.Parse(Console.ReadLine());$ ^' @& I. l( M" Z) I! Q, j  D
            int [] numw=new int' D! \$ n; I6 N- ]$ o, y( T2 d, O
$ t5 P- j2 [0 ^4 k( c0 s4 A
&shy;&shy;&shy;;
' @5 e! l% b, ?8 S; J2 U% K            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
. W) l) b/ i8 r            {
. H. X- |1 k  i+ J' _' j4 `                numw[j - 1] = j;
8 s+ F8 @* W# r' c            }
) K0 V. A5 K& B            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
1 f/ J# G$ [1 w) V7 M            while (d != m - 1)
5 }+ e4 |6 q6 V% X1 ~" U            {
& |; e0 P5 x! d+ k# m                if (i == m && d != m - 1). N; Q5 M/ L5 s9 b0 ~8 b, V, l  F
                {
* Y! b' n3 a5 y( T                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!5 Z0 W- w7 u( o7 F; f) o. O% o
                    continue;; k' S) f% c+ h9 b
                }) l' I8 V% \: D# P* g
                else
  W9 l, M, F) ?/ i7 \& q- b1 @; W                {$ k! G% s8 f) ?8 |+ t
                    if (numw[i] != 0)
4 O, b+ B& q$ u# P9 f  x                    {" S/ W' T! n( ]' {
                        i++;4 G7 E+ |9 W1 l
                        k++;
% |0 |' Z& r1 ^                        if (k == n)
5 ?' a9 b& T) L; e" D) E$ j+ ?- g# u                        {
: }" [4 M- C  P3 r8 a, O* R                            numw[i - 1] = 0;//把在n位置数组元素的值改变了" ?/ C+ o& A4 ~
                            k = 0;
: `$ F* _/ c1 T  Q# {. u) J              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小11 Y' |) m- \6 l7 G7 }& ]6 x
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
1 h/ K8 [5 e/ l- j                        }1 d. m. O8 Y% Q+ L: n$ ]) L
                        else//输出暂时还没有改变数组元素的值
2 C/ `: w! }. j5 q' V/ w* ?                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);6 U: Q- p; F+ y: t, E
                    }
. M; W, S4 G  `8 @                    else
4 w; K) g: e' [6 Y6 U- q  }: j% ^; ]                        i++;//数组元素为0,直接跳过,不计数。。。
, n/ x* K' ~( U) E% t. S  f                }
" |% T  k8 n5 ?  Y5 ]* O. A; H ( v7 g$ W: I" K. l; f! F

% V# J  K, [! l* ^            }//结束while循环
$ Q2 |, r& D& d. i            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
+ I6 R& K9 L$ H4 v" Q% I' y) S: m           
  E, L# [1 v- L                if (numw[i] != 0)
% B: A+ p' S5 Z6 n                    Console.WriteLine(numw[i]);
( e! m4 g4 w! X! h3 C  [" k           
$ w( w$ Z8 k8 Y$ J9 ~            Console.ReadLine();1 Z3 A4 p8 W) D* x$ H1 y  v# x
        }% v0 ~' l( d- t' @; t
    }# b7 D2 o* o6 n& F7 c
}
$ q) M% j: J4 z
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 1 踩 0

使用道具 举报

发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

Archiver|手机版|小黑屋|鱼C工作室 ( 粤ICP备18085999号-1 )

GMT+8, 2026-11-12 01:09

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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