鱼C论坛

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

猴子问题

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

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

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

x
大家好!% J  b5 v) K3 s8 G* i) w( O" S
这几天我在忙着编一个问题,我用了一种方法编出来!* d" N5 |. ^  m0 V" Y# a
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!5 G+ v! S1 Z5 W! D$ m
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
  y8 o- R. O0 D
/ ]* r0 l8 x- T9 q8 N( m
# h8 a$ `4 G& }/ \# S
                            题目
3 d# |! A# f5 j" K2 Z山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
" ^* d8 L3 `& P/ \; j# r第一种方法:利用循环链表6 \& [9 K+ q4 q. O& f6 w
#include<stdio.h>' i/ f% t" S9 ^3 E' P! k; [% u
#include<malloc.h>
4 _( I; t' ~( e, S+ `7 c#define M 8            //共有8只猴子
( i; d3 N7 V1 P#define N 3            //数到3只时退出第三只
! C5 c* L- J2 W/ d1 h% Otypedef struct monkey# B9 |/ Z8 ?  @7 L6 C: h6 b/ m
{int number;
9 y  w; |( p$ m9 jint flag;8 Y" S+ ^/ \  F' m
struct monkey* next;
3 j) h9 e. W: F* N3 K3 ?" i- ?}MONKEY;$ V6 G, D- r( W# U
main()
/ u# b' {" T4 e: _% T{ MONKEY *head=NULL,*p,*s;
6 |3 v. y5 n; m9 P0 a. F2 f* J6 N* Z  int i,sum=0,count=0;
; V* M! ^1 I% h) d- U5 `, t  clrscr();              //清屏4 f7 n5 _% v% @  [  R) s
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存! l+ Z2 q6 o( d: |8 o7 H( U
  p->number=1;p->flag=1;
9 g: B! P% e& Y! {# c  x  p->next=head;, r! e8 g4 q8 B4 p
  head=p;
# w. E: Y" Q: Y  for(i=2;i<=M;i++)
% F; N' B3 {1 J* a( L2 M" T) P    { s=(MONKEY *)malloc(sizeof(MONKEY));
+ V& y; g# V9 [2 n5 l1 j6 ~     s->number=i;s->flag=1;
+ {+ C; \! z' s, c+ y8 y7 v, s' I1 r     s->next=head;
. A  p3 `- B) C6 B8 O' g/ p* c     p->next=s;p=p->next;
8 Q2 k1 h, z" E# E, B, C8 p* I    }0 B5 F6 q* t  r) p+ c7 S% J
    p=head;) G$ F$ F8 ^* I
   for(;;)2 P8 P; \' Q9 V8 l9 f) k
    {if(p->flag==1)& D6 ?( q7 z0 w9 m+ d. ]+ Y) h
       count++;
; h& Y# B& l1 |7 \) P# b' l     if(count==N)
1 f1 Q6 |" h! _7 O( E3 ]        {p->flag=0;
& t# X8 @! h$ w& i7 c! r         count=0;- B, S) O0 D9 \* T& c
         sum++;}( X/ m+ N% _$ ^, I) X9 A$ @
     if(sum==M-1)
4 f1 F( d* Q, U; m8 W  z        break;
! X5 x6 S6 B8 l4 y2 I# L% k     p=p->next;
$ i8 [3 |/ D8 a1 E+ x3 C    }
+ A8 j( s6 M: _  E3 }  z    p=- \/ v/ B# j% q. l
    head;8 Y! N) s, m" ?
    for(i=1;i<=M;i++). |$ u3 A" @9 E! Y+ n
    { if(p->flag==1)
% _$ W/ b4 `5 m" b        printf("\t%d",p->number);2 p; o7 J* s" i+ b( l: X4 i
      p=p->next;% _4 X' h$ j% O
    }+ o- {* Y) ?1 k

! J' v$ L( [7 s0 {9 a- F
8 ?/ a8 {- u  [  l( v
. i8 l8 c* l3 c$ k1 l9 F) E}
$ |% P) }  K2 O- E) t
第二种方法:数组
$ g) Q7 C9 p8 ?6 d- a#include<stdio.h>
+ b4 K& L% h. u6 P#define M 8
9 b9 J1 e' g6 U9 ustruct monkey+ N& b# Z) e; ]; [( f
{int number;
+ m. \8 \% t; _! f7 dint nextp;
) R; d8 M' X  A% L}link[M+1];
: s, S+ ]0 Q, V$ R; l
8 O) `9 h- j5 c5 ~& @void main()2 B2 Y  ^  h  }* E
{int i,count,h;, b- v& }, A' N
for(i=1;i<=M;i++)/ C% n/ H* v; k- W! \( k4 z7 e: a
{  if(i==M)+ A0 \& Z1 H% N4 W, f4 f
   link[i].nextp=1;
+ e/ b  H" ?5 Y% r   else
! _2 m5 Z  j+ u9 O# q" S   link[i].nextp=i+1;; ?7 }$ r' f5 V  F
  link[i].number=i;
$ i- T9 Z, \% z; s}
6 L. s& Z& j$ B1 p, dprintf("\n");
! W0 d" ~' L* g! `# U" ecount=0;7 Y+ K. J9 l7 q2 \0 X1 N; H
h=M;8 `+ x: q# v) c* R' |
printf("依次退出的猴子: \n");4 f5 n) w2 W* w+ D9 ~% ~9 }/ e8 {% F
while(count<M-1)
" G# P) Z; {+ Y9 {+ S' h! i9 M{i=0;
. ^. i9 |9 b  d+ h& J3 twhile(i!=3)" M+ g& x% Y* q6 D
{ h=link[h].nextp;
4 s2 W* G. }; }4 H, G- T   if(link[h].number)$ }2 v( K. h2 ?1 h' A0 c" s
     i++;}
) H8 ~' q5 h  l2 o, i
3 ~' ]! F1 I: F9 zprintf("%4d",link[h].number);' n. G& h. L6 K! F, H
link[h].number=0;& b' K" A! }+ b/ R4 X; u* R9 S& G
count++;
, B3 h* q% y% b: A, r. o% }; Y}& i* G: c( e5 W% ]9 E$ n8 E- h6 L

7 u/ ?* j3 V# H9 Wprintf("\n大王是:");
. l5 ^6 [2 w4 Z! e' F  for(i=1;i<=M;i++)" R0 C  K6 I  W8 ^: g1 r  R) C
  if(link[i].number)8 G1 w1 o0 c4 @8 \
    printf("%3d\n",link[i].number);6 {, Y# g# ]8 C0 e; U
) u0 y; F: N5 H6 w) e4 b) N* f# P
" M: L7 K5 O+ z4 f$ K5 `% T
}
0 l' V: z/ E* Z) y. o' L
第三种是普通方法for循环

2 j; i9 H: R4 k$ U  L4 N#include<stdio.h>& ]; E' t) n( N5 h; I  d, ]) W
void main()
" u" {: c+ Q9 k- r7 c{ int i,k,m,n,num[50],q,*p;
8 |8 ]; F, ?/ y1 O: A$ o" n; q    clrscr();
" F) g# G, N. w# g8 y# A- }   printf("input number of person: n=");( H7 k0 d$ V9 {$ Q
    scanf("%d",&n);
" @" P# P& `8 N  }+ wprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只) _  K* @' ~, q$ Z( J- \1 u+ @9 L
    scanf("%d",&q);
) M% E/ _( y: a' \/ ]0 V3 H0 P   p=num;
4 v, |/ N& ?4 f# K, [( d5 x! Z( l  for(i=0;i<n;i++)% O; ?: B9 `, C! D' E
    *(p+i)=i+1;0 h* Y- L6 \$ ]" o6 z; Z  L. D
   i=0;8 G. B: B/ o% f& F8 y' a1 x
   k=0;
1 q+ A# U  O1 X   m=0;
; t( ^, L  T! z' ~5 P  while(m<n-1): C. k* H% ]2 M  P" S1 g
   {if(*(p+i)!=0) k++;+ x/ s, l! e# n, Z4 X& e% |% n
     if(k==q)
( U& G5 `$ J1 Z! h0 G5 Q( C      { *(p+i)=0;) u% K; V) x. x0 C* z6 ?
        k=0;( X* t2 ]% L( b) Z" h' x6 b3 u
        m++;; ~- J5 ]1 {/ s8 C6 B. Y4 G& M) C
      }; k$ B. l, @$ ~5 h
    i++;/ o) Y; B, ^' e, R
    if(i==n)i=0;
- B% j; a: b9 L! T   }
  n( P6 A; \$ q, P) S4 G# s8 z  while(*p==0)p++;% A2 ]5 K" m; j6 Z
    printf("The last one is NO:%d\n",*p);  c" c% u, Q8 {6 |6 c; K: |- y
     getch();; G9 d( h$ E0 p) y# X7 W

& ]2 |6 P! W& i% G) K}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
& n# I1 F- O) m+ R" S3 i" w8 V3 r" vnamespace 又费马达又费电5 q1 K' F0 M/ P- J: ]/ o2 v8 i
{0 q* T1 B. b: X6 U5 o& O/ `* \9 Y
    class Program
- k% x  n! j3 T0 O5 _    {
# J( ]5 q' K$ E2 J# F        static void Main(string[] args)# {+ _8 I" Z* M, E. @
        {
) i( R# F) X# h1 K0 ]$ O+ ]            int m, n;
, V# n$ z7 M3 x4 B4 W* B. `% D            Console.WriteLine("请输入数组长度");! ~' M3 X7 }# x" C
            m = int.Parse(Console.ReadLine());//m为数组的大小
9 [4 l5 z' S6 k. V            Console.WriteLine("请输入要截取数字的大小");5 E6 b: Q% M5 s- n: `6 S; ^. T
            n = int.Parse(Console.ReadLine());- e' _1 p3 E5 L% S
            int [] numw=new int
5 y/ j8 V. h9 o$ ^2 P4 W. G( m0 Y, }; ]8 T9 g
&shy;&shy;&shy;;
( W% B& {4 d' z/ C9 _5 U            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
5 S" T6 e. R- r; R& p            {% z, C7 [1 T* D! j
                numw[j - 1] = j;8 ?7 V# t- q3 I6 K; P9 c
            }3 v+ x1 Y! P: d* ~- O& h4 z) d& {
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
& E2 }+ ]6 l" y            while (d != m - 1)# ^& ?% _. }- ~* a4 {
            {- ^- h/ O. r& |; _+ L
                if (i == m && d != m - 1)
  m- {0 M" F  q/ ]# c- Z                {2 k" }$ X* f8 U5 |# y
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!, |' a+ G& A( Z+ `
                    continue;
- B) u4 j- y! `                }6 \2 |5 N2 Z1 H: ]
                else
5 f$ w0 ]' l) [                {
5 S# G, `3 n3 z' v- d! Y                    if (numw[i] != 0)
* N: g7 \. H% ^$ ]0 |                    {
0 A* B8 n" _" T: H7 g; \, z2 I% v" |                        i++;
0 V% b8 Z* ^4 S& _  U2 Y2 s/ m                        k++;6 ~4 \% d7 q! D* j& |
                        if (k == n)
! N  m5 E! m% p; V' }' U  l                        {2 J2 C' l, K) q% B6 ^6 H$ l; b
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了! I+ Q- C) p2 r5 q5 \8 q4 \* ]
                            k = 0;
; ?8 G! a5 j6 S$ K5 e              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1) i- O$ l6 B9 M# |9 |2 R
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);3 V& L- i* U2 ?7 f3 U5 m+ d2 p
                        }5 P  i! s) J( Y! e! A
                        else//输出暂时还没有改变数组元素的值
( j1 z7 u) e" [9 L( J4 ]                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);, J, T0 C, c5 I
                    }
& S, W3 H  Q' G+ Y8 D1 x5 i                    else- I$ G. w9 i; E: `" r5 j( t% q
                        i++;//数组元素为0,直接跳过,不计数。。。2 w0 q+ b+ `5 y( T) y" x; z
                }
: N5 ?2 m5 s0 [, N6 f6 |
8 w9 d  t/ h" b. }0 {7 U  X9 R% s
            }//结束while循环' @+ t! e8 d# f* H8 C. N
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦9 O  @# [0 U$ ~! B! D5 t& C
           - t' S+ o9 v3 W4 x
                if (numw[i] != 0)& S& e. Q* W3 C0 b
                    Console.WriteLine(numw[i]);$ A$ O- q. n0 p4 M$ F" g
           
/ R6 n# l' X4 k5 ]            Console.ReadLine();* l. q( h" m8 Q, ~: D: O$ E) O  @
        }
1 M5 t, V, ^) z( h# v* _& J; W    }1 L( m- @2 q/ r! B( C* O
}0 f0 z( m. [) f$ {/ 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-4-4 08:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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