鱼C论坛

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

猴子问题

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

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

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

x
大家好!) y' u' ~! Q! o. ^+ I
这几天我在忙着编一个问题,我用了一种方法编出来!* ^6 w- f: g# \7 Z
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
! m0 `6 H% m1 H* g- n! e& M9 `注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
( {9 q$ \3 V4 }& q" w6 c$ p6 }( ]8 z. g  y; E8 U  {
, Q$ |1 k$ C& T1 R  V; x2 @
                            题目
+ ~5 q3 n( H1 f  k$ I山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
: U; G" S, D! Y; d第一种方法:利用循环链表. p8 q3 n/ W( T" o9 j
#include<stdio.h>6 F; J& q) ?) M. O4 R* O0 e
#include<malloc.h>
% O; H8 d+ S4 k! ?0 ?- k1 V#define M 8            //共有8只猴子
) C. H/ X: v5 F9 C# H' t#define N 3            //数到3只时退出第三只
: c, F9 _% u9 s0 ]typedef struct monkey
2 d0 R/ u! a2 a{int number;3 l" n0 J# }4 @( v; f( ~5 ]8 q/ y
int flag;! A, o& `5 V. D* v$ b
struct monkey* next;
5 j, W+ `# o6 Q3 v' x; O' J}MONKEY;
+ M. s4 g' |8 T: [/ Q* |main(). g. a& e! f$ t4 l" U' u. y/ e9 e& z
{ MONKEY *head=NULL,*p,*s;
. s" u1 D, r# G, B; \2 S) k  int i,sum=0,count=0;
( V8 }1 |7 p( J. [  clrscr();              //清屏
2 a: M* d; f, J8 ~7 l, K  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存  C6 }) O* _4 C: s* Q
  p->number=1;p->flag=1;
' X, F. @8 H: _( S% f# Y  p->next=head;& T+ N( N5 W) n
  head=p;
7 Y$ t3 H+ T5 e# q8 {+ _  for(i=2;i<=M;i++)
  P1 `& @* o% Y) R# \    { s=(MONKEY *)malloc(sizeof(MONKEY));. M+ G. I$ o( V- o- k) p4 ^$ U
     s->number=i;s->flag=1;# W8 m% A- w4 C8 L! i" C
     s->next=head;
& a/ w& I3 n! Q+ }. E% L7 b1 K- l     p->next=s;p=p->next;
% v- S0 S5 h0 h* b    }
2 G/ ^  M$ N% \0 _- i1 I1 v    p=head;, }3 q( @3 O/ j3 `5 Z0 ?
   for(;;)& l7 S5 `8 ^! Q& ~* q! i0 ^! t
    {if(p->flag==1)* O) t; M6 w" b* G( P
       count++;
# E) L1 {# b! O0 z     if(count==N)
' p& W: G# R! p( q, Q; R( X- q        {p->flag=0;
  {  l: h. R& c& M         count=0;
! H: _, E, C) e0 _: Z1 f) _$ l+ Y         sum++;}6 ?4 W; d, Z6 @  n; }
     if(sum==M-1)
2 ^9 j9 p* q, u3 K        break;
1 m  G6 ?8 F! O+ I' c- z     p=p->next;% I4 H! l1 K  E8 X4 O# C5 t
    }2 i* ]/ N0 s! H
    p=
: q& r" z$ e# \$ T2 R: F    head;
; u5 V8 j) M* U  f1 p, D$ o# h3 \    for(i=1;i<=M;i++)
3 @' j' j, O: O- q* x/ v+ i    { if(p->flag==1)! O  N( }6 H: X) G* m& M0 z3 B6 S) Z
        printf("\t%d",p->number);
& Q, Q3 ?8 q8 R0 \' h      p=p->next;
( a& Q! k& d9 E+ a6 A    }
# u4 f$ j: P0 W. q0 R5 {0 c" S3 h$ O) G6 ]2 g. v
- ]/ t) @4 `( S! v; w$ Z

6 E% g& k1 q% @8 A0 P8 O}

- Y7 A& J0 M6 V. v* N2 w) E第二种方法:数组) ]5 l, V5 D* l
#include<stdio.h>$ o+ g+ S0 e* U4 [* L
#define M 8
& E  E3 O4 M" J' i0 G6 xstruct monkey9 F/ ?( n8 ^- t3 _- p* L
{int number;! [0 y$ K* `" \7 g& U: E& u
int nextp;6 m9 y( ~$ b7 }& X3 H
}link[M+1];
1 c( W- H! s- A( K( f
- E( ]. I, l+ `- Svoid main()
+ \, p1 U' d: x6 {) g  H. j' {{int i,count,h;. Z: \* O. n, x% L
for(i=1;i<=M;i++)+ v% \7 l8 R5 P) @- c! U! Q
{  if(i==M)& h2 R+ n- _7 O' J4 ^) C
   link[i].nextp=1;6 [+ R# L9 \2 G6 Y
   else7 m( [) }  t1 h0 u3 x  @
   link[i].nextp=i+1;5 q7 C4 @- F# I% p' X- ?8 K% O, F
  link[i].number=i;8 e% G0 v# J  y; i  S! x% d( b8 R: y4 t
}6 H3 @6 O& [7 J& y/ h
printf("\n");% w  g8 q. k. y8 ?. g
count=0;; r5 O9 T% j0 a7 ]+ F2 C! v, ^( @
h=M;
* b2 v2 g- X0 k0 v8 oprintf("依次退出的猴子: \n");3 [8 k) U* ]9 z# F; ^
while(count<M-1)
; W$ \9 ]& g9 c6 Q4 \( P{i=0;
: i, C/ a0 x& F# y0 kwhile(i!=3)( l% v7 p" [1 z% W
{ h=link[h].nextp;
9 G% j* ^' J. ?   if(link[h].number)& G9 N2 X) M/ p& ~  u. n
     i++;}6 K) G. i' V9 I! F' c+ [0 U
# d+ X3 q- v$ ^. }
printf("%4d",link[h].number);
2 x! V$ s. c3 h" B+ Ilink[h].number=0;+ w. O: @' B1 o* B" T
count++;
1 L' [, t8 Q! D( ?0 I1 d}
/ k8 s  y2 J; \# J% r8 z4 Z: c4 d9 m$ X
printf("\n大王是:");/ ]+ g2 ?4 u6 h# D
  for(i=1;i<=M;i++)& _( Q3 N; u) z% B5 @8 O  d9 l0 x5 r2 p
  if(link[i].number)7 h  I; R: K! p
    printf("%3d\n",link[i].number);0 D! C9 y) A+ c6 ~
, i: }# u# ~0 J; O# z5 a0 {( ]

- y+ ]. F9 d/ V2 U, B) a9 U}
4 o: F( ^& T2 Y8 G  m) d
第三种是普通方法for循环

; x8 r( J; _$ O; B9 N#include<stdio.h>
: c1 E6 B: k4 r7 @+ pvoid main()  d% S, b' U# x1 v# H% y8 O1 Z
{ int i,k,m,n,num[50],q,*p;
! h. X' T6 y$ O9 w  N7 Y/ U) W7 y    clrscr();0 ?' S, T$ y) C& X) {7 N% q& b- g
   printf("input number of person: n=");
; g# Q( r6 ?& z7 b8 }    scanf("%d",&n);
* Y5 u& X# P/ \printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
6 m9 V5 Z9 r9 W8 R8 R    scanf("%d",&q);' g- i. _  L8 n# q: P  C
   p=num;+ a# _5 U. Y: r* E  F- p2 a2 J
  for(i=0;i<n;i++)! q% e4 v  q5 ^! A! b
    *(p+i)=i+1;% F( b8 Y% t( E, ?1 J' |
   i=0;+ @6 K9 K/ n/ l2 g0 F
   k=0;
9 a. X7 l7 k! S* s. ], G: X   m=0;
1 {! V. t4 S' G, @  while(m<n-1)
. z# }/ B( T, w+ z8 s; @# R2 B3 ~   {if(*(p+i)!=0) k++;6 w+ k: ?/ l( v; c7 Q
     if(k==q)
# d( ]2 }( G5 m      { *(p+i)=0;
' n. T1 C2 l" ?        k=0;8 h7 k% B6 @6 H" y! a, J! n
        m++;
! E  ]. J0 {7 L1 f! [      }1 k0 e* n4 t# U& w% f: f& p5 `
    i++;
5 W$ ]8 O  L3 ~2 H2 N( \4 o    if(i==n)i=0;) r0 P6 [! ^( A5 C- S
   }
' J7 t2 V# g# V0 w8 M* l  while(*p==0)p++;! j6 }$ P7 x# ~5 Q7 h
    printf("The last one is NO:%d\n",*p);4 O# |( @1 E1 m1 }' [4 O; G
     getch();0 d+ i! ^0 M( d5 [

+ ^( ^6 W- k2 |( F: r9 i# R}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;9 ~9 f- O9 `3 O  R+ C
namespace 又费马达又费电
* |  x2 F0 r6 ^: k% M{6 k6 o) A; Z; a/ N* A/ y# X' b% L* J. e
    class Program1 i& H1 J* r. i- l. n! t
    {5 k  }4 X$ S6 S/ _* _" V/ a
        static void Main(string[] args)7 Q" Q" g1 P! C0 x2 Z' y, u
        {% f9 L( a0 N0 }" Y. P- q; d
            int m, n;- d% G" J: p& p
            Console.WriteLine("请输入数组长度");# f2 S2 u- C1 ?- B6 e
            m = int.Parse(Console.ReadLine());//m为数组的大小
' H% A: H/ ^6 r            Console.WriteLine("请输入要截取数字的大小");
) j: D+ ?/ b2 a+ \            n = int.Parse(Console.ReadLine());0 p! P2 q. @6 T& y* M/ V  r7 R1 x
            int [] numw=new int
6 {3 I1 h; Z, }/ f" @; r1 G! U4 o! n  w
&shy;&shy;&shy;;
) z: v" M: a1 [7 ]            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
) Y) Z, c- K4 W9 _" E% {1 P            {/ v  d+ V2 i0 Q3 b# C0 A( }5 }( q6 W
                numw[j - 1] = j;
+ n+ O/ U+ P  e4 L            }
6 K  G9 v$ ]4 a' l7 i" o( H- I: b            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
/ Q) J. J" x  L- K% {; j+ \            while (d != m - 1)8 y* r: h+ |$ S
            {
- b8 }4 u) L2 N: i$ Q8 O: E& c                if (i == m && d != m - 1)
) y* v1 T- J6 T0 m, N                {
; g% R$ R7 k! w2 O                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!/ q; H1 _* O# J) |
                    continue;
8 p3 a3 U8 j: t* `; R& Q/ X0 ]' j6 D                }
4 b% O% P; U. V                else2 k. v- S' O% l1 f
                {& D) N" r& K$ M8 K9 F* P
                    if (numw[i] != 0)" a. Z8 m! m1 f+ H
                    {
" C! o1 _" P# G                        i++;8 b0 h1 C) w! Z( I5 O( y
                        k++;
7 d) E5 B) g4 b+ ~                        if (k == n)
, E. Q5 t3 T0 X' W* R                        {( z5 f3 j: s1 Y7 |7 l# U: x) W1 a$ L* Q
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
. a! I; {* U% s. ^. b                            k = 0;5 k& P+ C: v, h& j; k$ y& {
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1# A6 j* O: U5 k* N: s7 U6 b
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
4 v. m* H! A8 C9 m$ r                        }( A  x& S# }8 B& L, A% s- j) X
                        else//输出暂时还没有改变数组元素的值7 u8 {0 j5 J3 E+ q& S
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);/ a! k' @. F  P9 @1 A1 u
                    }+ `( s' P. ?! o  `3 D
                    else
% ]; p7 x8 M& ~+ n                        i++;//数组元素为0,直接跳过,不计数。。。9 z2 }0 N' a  ?, W- D- V& J2 p( d% x
                }
' f6 J4 d: J7 c; @ 5 b3 K+ G$ o+ X1 _% [7 m2 h8 b
& F7 ]# Y& g8 Q, V' f
            }//结束while循环6 N( M+ l% h& S5 j! [! c
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
/ Q: l& T& H* G# F           ; l2 y- \( L' n4 {* I" d  X
                if (numw[i] != 0)5 S/ C  P$ ]. x# L
                    Console.WriteLine(numw[i]);( r+ I8 H9 ]. l6 Y6 L  l
           
% {+ s8 d2 K2 P            Console.ReadLine();7 }9 F& u2 H5 I- H) O1 M/ f
        }3 z1 J" a& t; _- X+ d
    }- g6 j; s- c3 Q; j# h3 }9 x' c, G# j4 R6 I
}
4 N+ B, G/ z* h9 s7 k# H
小甲鱼最新课程 -> 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-5-30 14:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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