鱼C论坛

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

猴子问题

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

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

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

x
大家好!: p2 R  G& [# |% q( ^, E9 F) c
这几天我在忙着编一个问题,我用了一种方法编出来!! T4 a  B  B) y+ y/ v* p# R  F& o
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!" h; R# e) E5 a. r1 ~, _5 l1 \5 J; d
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 0 {! M( x/ e/ @& D( p/ X) F

9 L5 x7 e% A; ]2 u+ Z& C: c2 Y, _( @
                            题目1 i' ?2 k, _, `- X
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。0 e" a. t+ E$ E9 C
第一种方法:利用循环链表
  o5 Z7 h) b2 a8 S3 \4 r: b9 B#include<stdio.h>
: H" W* g; n( `  i5 w9 Q& {#include<malloc.h>. u. k9 P. }+ C# z
#define M 8            //共有8只猴子
! z/ s4 Z  [) S7 T/ f! Y+ \" }#define N 3            //数到3只时退出第三只' X- N, D( _1 }9 }" d9 l6 r
typedef struct monkey
5 C" A/ z7 g2 w: q{int number;% N: p4 @( W/ a7 t' `& K7 q
int flag;; q% R3 y9 C. F. T" J
struct monkey* next;! T* D3 H, z' K& p) B3 o' Y2 m
}MONKEY;
( J! {$ u, L7 G6 `/ u) ^, Hmain()3 N6 D+ A0 K: z" M
{ MONKEY *head=NULL,*p,*s;
' m& f+ k% R7 w/ d" @( s  int i,sum=0,count=0;% M/ R' ?- M4 z8 |6 y
  clrscr();              //清屏
* Y) o) L2 e8 \' X  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存6 R* `! ]4 E- P, X! q$ f- j3 v
  p->number=1;p->flag=1;
7 z3 M# t1 X, c8 R  p->next=head;, h' U2 [+ K) s
  head=p;- L3 w) |& y+ V# C, s/ _
  for(i=2;i<=M;i++). @5 k4 F) f( a- W
    { s=(MONKEY *)malloc(sizeof(MONKEY));
" N5 r6 C: z5 A8 W* n4 Y1 U" p' A     s->number=i;s->flag=1;
2 j$ I) j1 k; `$ I8 P8 G/ J/ b3 q     s->next=head;
+ Q3 k5 ~9 G" P9 v3 f6 b/ C     p->next=s;p=p->next;8 O  x4 S9 `1 `# L/ n, x" G
    }* n# c! i/ C# c! R+ `" G1 `1 |( P  K
    p=head;8 z( ~5 ?. s- l' v
   for(;;)
  U- R# ^/ p/ W    {if(p->flag==1)
+ u6 T  L: o2 A       count++;
" O* Q7 e% E% z$ m( ?1 c     if(count==N)
  @; q! u' h- K+ n* }) F        {p->flag=0;
5 Q2 r2 V, H" k; R         count=0;6 G8 {; h1 S% t
         sum++;}) s  G) i% G. C7 j/ W1 L, C- w1 }/ |
     if(sum==M-1)
8 V# W5 X+ w- t/ u6 a        break;& w( [6 s6 l, k) S' o
     p=p->next;, |' I3 A& U7 T' X# A
    }
' @* ]* Z. d- A    p=* t! h( ?0 ]5 S/ p( A9 i, V
    head;
* x9 P: i) Q0 M# L. k' I9 a    for(i=1;i<=M;i++)
) {7 L  C# F1 I1 ~1 b& t    { if(p->flag==1)
7 j& k. g7 L/ U( K. p% |        printf("\t%d",p->number);
/ }& ?+ E: S+ q2 h1 q      p=p->next;9 o% ^/ R9 A! g8 m
    }
) S# [* e0 C: Z, E8 @2 }& A+ r. F- Z- A* Q% E% L- O2 C* k
1 [6 D: [+ r4 e5 F: u* E

+ ~6 ^% ~: m8 @! l, x" V}
# M/ W9 _" T5 F  _1 H0 }
第二种方法:数组; D* {- m+ L& f5 B7 E: O" _
#include<stdio.h>
  y" y: q# O6 z$ `6 S#define M 80 O/ i1 W( I: Y+ G
struct monkey+ O- f, q2 d- N* [$ C6 O5 [4 N/ q* b
{int number;
, C6 h& U9 Q6 e0 c& i; zint nextp;8 m  a; l# [. \* C
}link[M+1];
$ @! h4 {' Z2 n( U* v- g% l9 C
void main()
9 v3 |/ k5 |" ]- g' }{int i,count,h;
/ Z, o2 ?' Z5 t$ @+ ifor(i=1;i<=M;i++)
0 _2 B% y4 C; v+ G* @7 A4 g{  if(i==M)4 W" W5 y! F/ V4 d: H
   link[i].nextp=1;
) H5 @0 K. }$ P& W. r( I3 g   else! T  O9 z7 L4 m6 m, i) g
   link[i].nextp=i+1;& w) q+ H& f) T. I4 k2 ^, a, O) `- l7 a
  link[i].number=i;
( V( w) _; @5 D3 ]- _9 d  M1 v* _}3 g! R% G7 b0 M9 ^- _. @; @
printf("\n");
6 I* `' @1 o0 G0 b7 F! lcount=0;
/ ~3 W  k, B/ ?* N4 X3 k5 ph=M;) ^4 p6 @. _$ W. F/ l
printf("依次退出的猴子: \n");3 p% V, r5 e2 s' Z  l( a: o
while(count<M-1)# v% q$ g+ e8 d4 z
{i=0;% m7 i& ~' k" L7 i
while(i!=3)
9 |' v' P- J7 R4 O/ C{ h=link[h].nextp;1 n4 e; j6 S- o3 N
   if(link[h].number)
; j4 T# h& r  J1 l. ?9 ~     i++;}
& G0 T% t4 o1 s1 k8 t, k
( [. ]: B- J* i7 u8 Kprintf("%4d",link[h].number);; @' {9 @/ K) H# p5 X! I- Z& W
link[h].number=0;3 W" U% I1 {# N# i4 T
count++;
" h: u/ f3 l; D# H}
  |7 q: m. N. z" n/ {
  a( G7 Y8 M2 f. Oprintf("\n大王是:");; Z' h* t" N, C1 J
  for(i=1;i<=M;i++)- S; x5 E, e; D; `; _# a
  if(link[i].number)6 Q8 C$ D. R& L0 ?
    printf("%3d\n",link[i].number);/ z$ c  z5 \6 l# \

5 I* H9 L0 L" H* j. ?5 `
1 i) `- }! Z* m) p}
0 Y% C2 ?" `& D* a* }9 g) W
第三种是普通方法for循环

- \" \, `  f; i$ i+ v% F+ w& J/ U#include<stdio.h>8 i: w& k4 r6 O# k: h1 Q, F, d* E9 ]
void main()1 r0 y/ A! M- D0 w
{ int i,k,m,n,num[50],q,*p;+ Q( j: n+ j3 K: k- H6 G) @
    clrscr();8 V/ S0 n0 d0 U- I3 r7 v& [" T5 {# t
   printf("input number of person: n=");
2 p& w0 _" w: Q8 `" j" ^" p- b  `    scanf("%d",&n);2 ]& X! l+ u1 W( a' ~& N
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只# F  ^* k3 A0 w; B
    scanf("%d",&q);
/ D; g0 D6 ^9 t0 R7 h# i   p=num;
: j/ E( O) ?4 C" J7 Z2 y% d# k  for(i=0;i<n;i++)
$ z; Q2 y0 K+ D: e% V" n    *(p+i)=i+1;  E7 ~# Z* c. A0 e6 A
   i=0;
' u3 C! G" s/ h$ g   k=0;3 _& b/ \- k8 o1 b2 h. \
   m=0;; f! z/ {8 f. M! N7 ]
  while(m<n-1)8 w* ~& O8 O( h2 v7 Z
   {if(*(p+i)!=0) k++;
4 w5 k3 i. c/ _5 _8 ]. ^9 @     if(k==q)
4 {, h  U4 P2 O$ Y3 _      { *(p+i)=0;
1 h  g$ Z! v- V- f* x' c: x: G6 W- {& e        k=0;' g! @: H8 n# h4 r1 A
        m++;
" Z+ K$ {, ~, s+ q: H3 F* O      }
" ^5 r' R7 T; p: _    i++;
/ D$ e+ d( J6 b  d* e  Z& r    if(i==n)i=0;
/ p1 K3 M: @0 K- q% o# s$ Y   }
8 w$ s# H4 o" M0 g  while(*p==0)p++;
' x2 x: o8 E  r8 s. Q% a- H# v    printf("The last one is NO:%d\n",*p);2 Q  D* D. R1 `6 Y
     getch();+ c* D- a) F; U3 k" v/ e' ]" M2 d

: O, a# t$ @. S$ o( a2 O* A}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;% j* ^2 P3 ?5 z! j9 v
namespace 又费马达又费电2 u) B% @( h- d; K/ S& T
{1 a; q2 J7 |) @- P) L: d$ Z6 }
    class Program
3 a( J0 n; Y( H0 {! E9 @; X    {: H7 c1 ^2 L+ B& z8 @  R: L
        static void Main(string[] args)
* N# D. L7 ]7 Y2 A$ Z        {4 j1 Q- S, {9 K
            int m, n;" M% l; F- ~0 l3 T% E5 U6 y
            Console.WriteLine("请输入数组长度");
/ G+ Y3 y% }  \# f' _7 G            m = int.Parse(Console.ReadLine());//m为数组的大小
' y5 I0 F, v1 }% n! Q            Console.WriteLine("请输入要截取数字的大小");! f( P' X8 \( W
            n = int.Parse(Console.ReadLine());, B5 T! t# H( `- u8 Z% a1 B
            int [] numw=new int
# e% `$ @7 K" y' ?& R  z* W; J- t/ x: l/ s  [1 u7 H5 M. E# ~
&shy;&shy;&shy;;
8 m+ X6 e6 G9 P+ y$ v8 Z+ q            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数- k  x; `7 K  v4 h
            {0 G$ z5 a' |0 c1 l, c6 i4 m
                numw[j - 1] = j;" g1 U1 N/ g  s4 _. [
            }
  i. \1 f: {8 b7 r" c            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!, Y5 x4 R. c4 n, b! ?
            while (d != m - 1)/ V# N$ I/ P3 {! w
            {
7 {+ c# Z2 d1 `" g  {                if (i == m && d != m - 1); f* Y) ?- }4 ^% i
                {
0 x1 q. Y* d3 {  T% o6 j                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!3 p% J& I& s. n0 d2 {
                    continue;
8 F3 w! P3 ]3 D, v                }+ O, M8 J' V9 R
                else' R/ _" ^9 U9 D& d
                {
2 P$ j( O+ `) \6 c0 h) {+ I" R                    if (numw[i] != 0)% ]8 Q3 `+ ~) `5 x/ G
                    {
" C' s0 u9 V! T. E0 }                        i++;# _9 D1 g: u& S6 E) b& F- `: H: x
                        k++;
( y& ?) q! O0 s. C                        if (k == n)3 ?; s: a+ F) s9 c+ I
                        {
# W- g3 C; n% W% L                            numw[i - 1] = 0;//把在n位置数组元素的值改变了8 r* r. M7 W6 V& [: ^
                            k = 0;
3 I! H+ Y  E5 d7 W  q* O1 r% V: r              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
. N  m; W7 D& c( V' N                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
6 j" s6 ]: G  ~, V* Z  T  j                        }
) p# u! {) E) c                        else//输出暂时还没有改变数组元素的值' O* c0 z( y: p
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);+ M8 i) u6 b8 ?
                    }
  n" i7 {5 }: w* x                    else8 m8 R2 o3 ?& G, V1 V" X1 X/ m) `2 z
                        i++;//数组元素为0,直接跳过,不计数。。。+ K  ^0 m/ h2 V
                }
& w! U. k! |# D6 c7 C3 r$ F  K * s/ v6 x1 U' J

! r. u) M  o3 V7 l* j; r            }//结束while循环
* k0 m  h. d' {& m4 Y            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
$ p. m/ x) p* L, M2 j           $ c# a* f8 x' m2 q* @* G
                if (numw[i] != 0)8 v0 u3 F( D+ S1 v; s
                    Console.WriteLine(numw[i]);
' {0 n# [- O+ d- _9 W! _           2 r, K7 b" z) n( j
            Console.ReadLine();
4 ~- M1 U1 d7 Z0 P2 M        }
9 T2 G0 ~, s0 L, }3 i    }( r8 @1 T0 z. }
}
: n1 w8 C* h% g6 S7 `# @
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 07:02:23 | 显示全部楼层
循环队列。循环链表。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-12-28 07:02:46 | 显示全部楼层
这个题目就是经典的约瑟夫环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com

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

GMT+8, 2024-11-23 01:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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