鱼C论坛

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

猴子问题

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

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

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

x
大家好!; `, @/ k0 T2 J$ A# n
这几天我在忙着编一个问题,我用了一种方法编出来!$ b9 }5 n( ~) t" Y' Z
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
; m5 i/ k" |7 B9 Y$ x注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 $ u8 M+ j( L2 Q, \* s
, I* A& Y! @9 f% O  y' f
& |; M2 J# ]$ C- P, @1 ^: N& }
                            题目- ]7 S8 U% V& p. T/ c+ ?
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
- |, `/ P$ v1 Q0 Y0 a第一种方法:利用循环链表
/ C4 W" i4 k% h0 ]9 g7 x  D#include<stdio.h>
6 t0 L! I' c* {#include<malloc.h>$ D# d$ G, ?' @. b
#define M 8            //共有8只猴子' w6 \1 g/ A4 W( ]! Z
#define N 3            //数到3只时退出第三只
9 ]. Q) @" k+ x# y. V/ f8 n# _typedef struct monkey- o/ ?. h* n& _! e1 O6 n
{int number;
4 B/ u4 S& B. e* [int flag;
8 o) I* N: `) v7 Ostruct monkey* next;
- b: `) \) v% i& I5 H) f}MONKEY;$ w) m  {4 v' a) j9 L
main()
' m! [  G5 J4 m- t& m, B- B- r{ MONKEY *head=NULL,*p,*s;8 r* t5 `" m0 R* O7 C
  int i,sum=0,count=0;
+ U7 B% k2 m6 |' K1 L  clrscr();              //清屏  n7 c5 b4 ]% N, ]4 p, @5 c
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
1 `- L- ]8 O4 t( q1 e  p->number=1;p->flag=1;& J8 O# o9 S4 [" R4 l; T
  p->next=head;
+ m; w  u8 M/ |, d7 Z  head=p;" Z7 i) t0 a! f/ N* @  q- g/ p) _4 S
  for(i=2;i<=M;i++)
9 h4 ?) n) Z% [. }( P    { s=(MONKEY *)malloc(sizeof(MONKEY));+ E1 F; h4 s- I0 k* `# z
     s->number=i;s->flag=1;
5 [) m7 N& y. J, n0 S- K     s->next=head;
: p5 X. @( m2 O+ _" h- e     p->next=s;p=p->next;
! c9 b2 u! m5 n' e8 N    }
% n1 N1 [2 [7 T" L    p=head;1 _- p1 }! b% @2 @: A) x
   for(;;)
( A# t- H" n" l# x5 [# R    {if(p->flag==1)
& o/ i/ @9 ]% ]8 ~       count++;
! V' \! U5 m& D0 r- X( |' `3 n; J5 Z, F     if(count==N)
* s# W* N4 I# a  ?; R! }        {p->flag=0;
) Z: X7 Y5 u1 \; W' L7 a: y6 _. }         count=0;
$ n6 i: h1 A$ T! P         sum++;}
* s2 X  E0 m: Q2 _$ n5 v, u     if(sum==M-1); t4 {" Z9 G. L2 _9 e- @2 l$ ?
        break;
0 _2 U% \& B$ y# m8 k- q  ]     p=p->next;3 f6 U( s& F3 k" m% G+ l+ K  J
    }
2 [* O+ k# j& v' f" x  c    p=
  e5 x  Y- _- }. a) a  P, [; G    head;
& S- H1 x( G5 k2 K5 @- H    for(i=1;i<=M;i++)
5 x4 Y9 ~# d  A  \2 B    { if(p->flag==1)5 ^8 U+ y) s  m, s% S+ r, o
        printf("\t%d",p->number);
5 e  y+ n; U  x' E6 Y6 x      p=p->next;
, R: T+ t) ?$ M  s& M3 C- A    }
2 [  I1 R4 }# J! b7 k! _, Z5 }
. Y% ~9 F4 e. i7 Y) S( C' h% a) A  n/ ^

* v! y, @" m' ?1 U3 f' M9 q" Z}

% |3 W) Z( y5 Z1 L3 i* X$ o' A第二种方法:数组
/ u! j5 E$ `9 }( _1 z9 Y4 U2 ?#include<stdio.h>, k6 q- y8 l4 [, E: n% s
#define M 8
" ?1 `& Y8 S. p6 U3 x. Mstruct monkey
& U2 q; ]. N: H& `" J& C{int number;  t6 ?7 n: }! i% \: g
int nextp;; i: s8 @$ |5 V5 B% M. ?* w) k; v$ ^6 R
}link[M+1];% A# k5 x6 L( t$ t' F4 N) i
/ [4 v# z3 o% M6 S; ?
void main()
# Z, A9 J0 m/ h- O: |{int i,count,h;
& R4 \( i2 u! T% C4 Z% Qfor(i=1;i<=M;i++)3 P" G( o, R/ w! v4 w
{  if(i==M)% p7 f2 {5 V# x
   link[i].nextp=1;
% v) N  X, g" `- V5 ?   else& @( ^7 V4 H1 X9 H/ G/ j9 \
   link[i].nextp=i+1;
9 H$ k' ?: s) A- ?/ E# o# @" m5 i  link[i].number=i;
0 J1 }2 G  W" B}8 }( {1 h5 b/ H% f" I; I
printf("\n");
: H' I! B& i5 D0 D1 {count=0;
' Q. M4 ~# S5 F; K  Lh=M;4 J; v- A- r3 G  i: K
printf("依次退出的猴子: \n");; z5 c, i: J2 `! C/ Q6 b
while(count<M-1)% n* u+ J) Q/ N+ Q
{i=0;
" k, [5 x" ]) N4 O" Xwhile(i!=3)
) i% J; r  S4 t{ h=link[h].nextp;
- }) `% j* O9 C   if(link[h].number)8 ]7 J4 [, I) m
     i++;}
. J( m2 |3 Z5 N7 M  o+ `. [
9 R8 \! R% b& V3 Nprintf("%4d",link[h].number);# u" G0 j8 G8 ?8 I5 _+ f1 S
link[h].number=0;8 v3 a7 y+ I: Y- V( ]
count++;( W( V$ _' _  E" o, R
}! ?7 K' S" ~: y0 t) ?, I8 b5 k" S" ?: S
8 f- p& _0 j8 C( c
printf("\n大王是:");
, w/ ~9 v& c1 s1 W* m  for(i=1;i<=M;i++)
5 t  G. }' i& t" y% c) C! ~2 M  if(link[i].number)' o1 T+ c' w& v4 C, A- C
    printf("%3d\n",link[i].number);4 p7 r) I1 ?" H

4 z4 i7 Y# E" t1 G9 u$ ~
. A5 v7 U5 D# l( x5 S+ b" K. Z/ s& e}
. R  A4 ~" T" U* _3 q
第三种是普通方法for循环
* G. G7 D# e9 c7 `
#include<stdio.h>9 h) I" ^; e  p0 E
void main()
( x) H* n7 q) x( N. O: s{ int i,k,m,n,num[50],q,*p;) h- }' v/ m3 S" i! I% @
    clrscr();7 H' m( b8 E: C
   printf("input number of person: n=");/ _: l" q1 w  d9 p* u9 A
    scanf("%d",&n);/ r8 |* J4 F! |; K! ?6 Q0 x/ M3 j
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只0 U4 L: C+ G. t) _. g" H5 _. v
    scanf("%d",&q);
5 I& V; |" w" k- j6 }   p=num;
" c  l5 H4 ^  B  for(i=0;i<n;i++)
$ U4 M3 p8 w* c- C+ `8 ]  K3 D    *(p+i)=i+1;
/ U6 D4 c6 b& h+ V- Z1 P   i=0;9 X9 u8 ?. m  s( t
   k=0;+ \! a% }: c' D& i5 N2 I
   m=0;
; P8 ]0 L* k+ `% C, X& y7 M& ^" e6 g  while(m<n-1)5 Z! I4 Z$ B& }/ m  y
   {if(*(p+i)!=0) k++;" `) \( I6 I; x! L7 G# K( [& H: p' `2 s
     if(k==q)
+ m# }' T! X, n, K. T1 A' ]$ K5 W  D& L6 x      { *(p+i)=0;& F: b; [1 _! c. \" t" ?* `
        k=0;
! M7 z! G2 Q; l/ _        m++;
" a+ c2 F' q+ F2 H& s" ]      }
( M! ]; q% t; G7 {# b) J    i++;
) U* i+ x8 t$ E) o  f    if(i==n)i=0;
& f; F" U$ D6 }. b9 v   }
0 K$ W# V. x5 O  while(*p==0)p++;7 k; U" P! a0 K9 n, N' Z; W' |/ X
    printf("The last one is NO:%d\n",*p);
/ A. ~$ `, O0 I+ J) g* }" L     getch();+ a3 ]( V1 U; j, w: w
' a- J5 Z% J; g# ]& B
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
8 H' B: @2 h6 w8 _namespace 又费马达又费电
" D+ t" \3 }, b1 w# W# j$ r) s2 s9 i{
. Q3 S$ F! {! e* b3 R    class Program
6 I# l2 B2 I6 y) i4 I    {
& A5 P; N) F0 D. I$ R        static void Main(string[] args)! R8 z8 ?. l8 s
        {
  S  Z+ r5 G9 I9 Z5 Y5 z            int m, n;
* R" _' b5 y) a# r4 i            Console.WriteLine("请输入数组长度");4 z: C7 K4 e3 ^, T5 d9 h: g
            m = int.Parse(Console.ReadLine());//m为数组的大小( _1 P( S, X8 `7 I
            Console.WriteLine("请输入要截取数字的大小");" I3 t! D# v; d
            n = int.Parse(Console.ReadLine());5 ]. K' f3 f) K( m
            int [] numw=new int: W) r3 g% F  M" M
$ ]; n  v4 o% o+ d& C& x
&shy;&shy;&shy;;
9 ~, v7 X. k; Z) t/ c            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
. B7 p! I+ t5 R" D6 Z4 Q& A8 B6 a            {4 s' B/ O" s- ]( w, v
                numw[j - 1] = j;) e7 {" y: p4 ]* ~2 z
            }: I% W7 Z4 Q  ^4 m. g
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
5 z6 ]: D* O: f            while (d != m - 1)* ^' \) d' V: H  ?1 d$ I! b0 |- U/ {
            {2 `/ F2 n& J5 ?6 b5 n3 @
                if (i == m && d != m - 1)9 S( M9 k& {# l/ n' h& `1 g
                {. |4 B& z$ }, U: k) U" X
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!) H4 C" C. j# v- @
                    continue;
4 M- X! }" W9 g1 j                }
. z& o" v2 W  K0 A5 R6 o( H% `                else
! Q1 H: f& |1 u% f) _1 |. K, e- t. r) d                {; I; M' n! ], ]3 d9 m" @; A
                    if (numw[i] != 0)
; A9 M& ?8 Q1 `( k1 E5 D                    {3 V0 G0 Z5 c7 t9 o0 T3 e; c
                        i++;6 g! X9 g2 j& L  L* l
                        k++;& h& v+ M8 O( D' L$ M/ p) K
                        if (k == n)
1 k" c! S# z' s6 G' n                        {
2 T, J$ B5 s+ e* H                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
, \  |. J6 |- ]; b8 _6 l3 x                            k = 0;$ g4 t5 a" o" G" I; u5 H/ O. X$ ~
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1* J) ^/ W# M& l
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
% ~2 u! c' M- ?; z$ E! \( f: E                        }
0 g' u, x+ s  {/ ~, K                        else//输出暂时还没有改变数组元素的值! b& n1 B" W: r! T* v
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
% D- Z9 j5 ?3 N) l1 o7 Z# ?                    }* d; O% D% ~" H4 g: A- V) X
                    else
$ `" E, K' V' `7 [                        i++;//数组元素为0,直接跳过,不计数。。。! K, @$ T& H% O3 Y
                }
4 q  t& T; p4 ]( k( g# D
1 |/ L, r/ Q; j% K3 o4 Z$ D' @: o. O9 S0 a0 |" B8 e) Q, e/ d
            }//结束while循环' p" Z& x) J8 i) G; M1 j
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦3 \. X, K; p8 Y+ E; _% G
           4 |* r# C) Y, S# J
                if (numw[i] != 0)
. p# s* ^5 a) z7 h, T7 o6 l, Q                    Console.WriteLine(numw[i]);2 j( G$ a7 `& E1 a2 M. c
           
: h- i5 E# f3 b' \: w% U            Console.ReadLine();
) j! _$ C! C4 D( z% r        }( b+ Q# p, r+ @% r
    }
1 m+ y; p+ J& _" o/ f8 j}
: |/ ^$ h* p5 G9 {9 c8 z# w' R) T
小甲鱼最新课程 -> 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-7 09:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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