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

猴子问题

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

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

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

×
大家好!, S+ l! T8 a4 a. x# Z6 T
这几天我在忙着编一个问题,我用了一种方法编出来!! k4 Q% \) n. e2 z: M
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
. c) c2 D4 @, U3 ]0 t注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
6 Q$ L1 |- m4 |) M/ z. I( {2 Y* @/ Q3 K

0 M7 z+ x& m) z# E
                            题目
- m. }# _% W' [/ m& ?1 r8 D山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
; @/ g6 M4 C* p第一种方法:利用循环链表
6 U: E7 h( m1 t- F#include<stdio.h>
; R1 j8 X9 M: b" w, ?1 _4 o#include<malloc.h>
2 d" u. L. K7 X( J1 [& F$ i#define M 8            //共有8只猴子" {  I& ~+ P6 f) M* a6 b
#define N 3            //数到3只时退出第三只
2 B1 o9 z! D7 c9 D! ]* `) T; \typedef struct monkey0 Y1 C, I" n# q, ]/ X) T( R5 ~0 k0 e
{int number;2 h; t! M3 z3 c
int flag;  |/ M9 M8 ?! C( b" Y) ^
struct monkey* next;! d$ m. _" l# p5 U9 E
}MONKEY;! T* Y# A4 Z# S$ @
main()! D$ m) u2 N! g& X5 @" y
{ MONKEY *head=NULL,*p,*s;0 y) x- f# |  O  J+ R
  int i,sum=0,count=0;
. A9 P7 W1 Z' H, d  clrscr();              //清屏
" R( H' U( {0 }% Z8 P$ ~  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
- F+ Z  y  h2 H& R  p->number=1;p->flag=1;
" W! f) a5 I7 z& k  p->next=head;
- G) W. C) p, F  d& M8 V  head=p;
, k- G$ J4 Q0 @8 V$ Y  for(i=2;i<=M;i++)4 t/ B0 ~5 b: S/ ^- S5 l' [5 g
    { s=(MONKEY *)malloc(sizeof(MONKEY));
. A& r6 d9 P& X) h     s->number=i;s->flag=1;
* Z1 i  z' K! r- p6 I  c/ A6 B     s->next=head;: p! {% N, c5 ]8 E
     p->next=s;p=p->next;
6 K7 p) W5 c% z$ A- K. N+ i    }8 D0 Y$ g1 p# e2 I  |3 _
    p=head;
5 k# c& Z4 }" _   for(;;)3 K7 t# F' \4 [0 q) m: R3 Q
    {if(p->flag==1)6 ?; C* ^/ }6 @  K& t! p+ [
       count++;
7 l' @0 m4 e- d8 t; ^  ^     if(count==N)! x# {+ L2 w8 d- @" m' ^
        {p->flag=0;
$ k4 G& `: x2 |7 F9 r         count=0;+ W9 v6 ^' Q3 z* N
         sum++;}1 i$ y& i  |3 A7 Z* I+ v1 B
     if(sum==M-1)/ D* A2 W& h( z! I
        break;% \8 v% u: G% X# U' h
     p=p->next;  c3 j# x* W! ~2 h% |: t
    }# |7 H6 N+ o  `
    p=; ~% A% ~, S' _5 L9 k. V. ^/ E  S
    head;, j& J' x) N% N, z
    for(i=1;i<=M;i++)% Z$ q2 n. b5 g' X7 n/ y
    { if(p->flag==1)* `+ |, S1 J1 `
        printf("\t%d",p->number);
# _0 a# q* Z& Y5 K      p=p->next;3 _7 }2 I$ N) u0 w/ g, o
    }
# B6 t. }0 E4 R! ~+ m
1 w! K' x( o, S% s. a! m7 i
( _4 m$ _; b8 F+ V* ?2 Z; {) \/ ^, {. d7 R; V. T/ D. j
}
2 b" z0 W9 ]6 S; ?9 e
第二种方法:数组8 _: ]  G. _0 u0 @- X  L7 X" r/ G
#include<stdio.h>) }0 W7 b4 I- r) Q/ X+ ]9 b3 g
#define M 8& b8 A+ m- h! N2 T; t& R: Z! j5 S
struct monkey# o: a1 x& u5 j, }$ B
{int number;
$ J$ _/ |+ }, o# N' O9 Q9 mint nextp;
; ^0 f9 n4 L" Y+ J}link[M+1];$ O# P, J( @8 Y
3 ^) h. x9 |; U4 H( m- m+ N
void main()
' \+ j- p8 U) `: `+ d% w/ E0 J{int i,count,h;
1 X- Y! {+ ]: K. P. }for(i=1;i<=M;i++)
% p2 Q0 T# R9 F2 r  T+ g{  if(i==M)
0 x% z/ a3 j9 H& v$ ^# ~0 N0 D; B7 e   link.nextp=1;" W" E  ^* K& j3 L& t: i1 l) J
   else
, o7 [& M% Z7 J" P0 h   link.nextp=i+1;2 H: X( F  i: ^6 Y( B4 b1 N3 x
  link.number=i;
. H) v1 [5 h/ v- H}4 D1 o! M/ V; v4 m' [2 ^7 h5 m
printf("\n");
( j4 N! ?! x+ ]: I" S: acount=0;
# I. u- j/ @# Y* }6 ]h=M;
1 C3 E4 c6 O1 ]& s& Fprintf("依次退出的猴子: \n");
2 o! k  s' k6 B9 W1 b3 P% j- n1 vwhile(count<M-1)
5 d, A& m4 a5 E" `0 p{i=0;
: W9 y) y3 x* Z9 r% X! V. e3 }while(i!=3)
& _' r+ E( |: G6 K" \{ h=link[h].nextp;
& s) t& R9 X/ P1 [2 P   if(link[h].number)
0 m  f2 Q( H. n* d, \2 y& i     i++;}
9 ~+ i! Y8 y. d  h" {( a
5 E6 A( i" {! u% k, l$ }printf("%4d",link[h].number);
& b- n. `' V& Q* _/ zlink[h].number=0;" u2 I% P0 F# |" b& ^7 F/ v
count++;
. r0 h- H7 V  J; Y8 a}7 t) x! r$ |6 p6 R

# g8 _: M3 b* C" z3 Zprintf("\n大王是:");
# L# z) a1 j+ Z1 k/ ~0 m6 c4 ~. y  for(i=1;i<=M;i++), _% ~+ K. D6 K$ \
  if(link.number)
7 _# ~6 n( v; ^% u% y) j. |+ p    printf("%3d\n",link.number);
$ O3 ~3 y9 h" H1 f& \, H1 s$ T
: y+ ?( E) l8 R# K: E
9 l4 C/ F7 u. E, c}

# i1 ]) E& o6 |3 _( l: h) A第三种是普通方法for循环

) w  V% p0 j( |$ c7 [$ u% J#include<stdio.h>& T% T* _1 k* Z1 o, e1 `
void main()
& A+ s1 t% d  {' O{ int i,k,m,n,num[50],q,*p;
: D7 S# G2 f0 `    clrscr();
/ ~) M. M! ~$ l   printf("input number of person: n=");
9 ]  y' s& |$ j7 q! e    scanf("%d",&n);
0 D- w+ k7 _' Aprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只! M* P; Y8 R" e) C3 u8 m% H
    scanf("%d",&q);
$ g( V& @: A! G  c/ y5 j   p=num;
) f1 _5 }* k  r( S! @; O  for(i=0;i<n;i++)
! E2 x, S, ^/ m* M/ q6 [, q6 c    *(p+i)=i+1;8 A3 k' i- [8 d, G
   i=0;% K8 x7 [' b# \' @9 E
   k=0;) N. F% _3 ?- K- {% d
   m=0;
$ G& R: A  r: e" b  while(m<n-1)$ {# J/ k( e9 E2 B
   {if(*(p+i)!=0) k++;+ B- g! Q- b1 k# a8 Z9 n0 R
     if(k==q)$ c1 j- }& D) \; F* O" }2 F$ `
      { *(p+i)=0;4 S6 }/ c1 l+ I6 n) @$ k
        k=0;
! B! c5 [. F: x1 Q6 g8 x        m++;4 Y# ]! J2 P3 q0 T+ w  k) ^
      }3 E4 ^% G5 Z5 m( k
    i++;) j- h  }3 x% l  T  w& Z
    if(i==n)i=0;- m) j2 ]4 C! r. s! g
   }
) K. E% o) T% E. u, g. G- X  while(*p==0)p++;' w# ?9 f$ Y/ h8 ~% W! M$ a
    printf("The last one is NO:%d\n",*p);
9 n4 F' i# K5 @8 ~  i# h/ h' G6 Y     getch();5 @, H# \" e' o3 A7 \. e* q
" l: C  h4 }, F: E) [- {
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;, o: u( X& w; O) l0 p# v
namespace 又费马达又费电2 e' g# u" |; M, X) Q) [+ o) ?
{
& s9 ^! b: p9 I1 `" Z) T* n5 @    class Program% S$ v, D" ~- B+ A" _/ x9 w
    {! a- z5 R, k* }. Z  ]- Z
        static void Main(string[] args)
5 w6 ~. S% j1 w; A        {
4 q& ]( u& s- h            int m, n;
4 K! x7 N! b& D8 n% y            Console.WriteLine("请输入数组长度");# v  ~' o2 d. Z; [* z7 H
            m = int.Parse(Console.ReadLine());//m为数组的大小% a# G+ L7 \% P; U
            Console.WriteLine("请输入要截取数字的大小");1 w  A& t7 Y& j5 M6 {5 E1 u! p
            n = int.Parse(Console.ReadLine());+ D) C/ N* g3 d: Y+ F* U3 {
            int [] numw=new int
" g+ J( d$ ~. T! e# }5 g9 Q9 @8 g9 E
&shy;&shy;&shy;;
, V+ f: D, I  `& y9 a            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
) F! p) a9 b" Z! y' _6 A            {2 `8 y, N. L) ^# e8 S
                numw[j - 1] = j;% `' q* j3 y0 c' m
            }+ d5 \' ]4 k1 ~" T! G
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
9 U+ c# k. V! h$ z$ x, A            while (d != m - 1)
: S( i1 W( @2 z; I+ `2 M' g0 |            {
. z% t1 U4 [$ E                if (i == m && d != m - 1)
+ V+ n3 p& S# e3 w4 w                {
3 ]: e3 I+ r; C$ Z5 Y' u" ?( s                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!- y6 e& p( Z  t5 c
                    continue;
3 M8 Y5 Y& L6 `2 P4 g! W1 j                }& [2 [$ f3 Z0 P# M/ k6 W2 I
                else  ^3 R: z* r: [  `
                {" f  z4 I& y- H, }
                    if (numw[i] != 0)" J- _. b' Y9 |# F- L/ ]% m, }  h
                    {
# O$ D/ u$ \. L8 l9 p6 e                        i++;
0 X- [3 T" X* {- h) Z: S                        k++;
  V( s. r/ J7 C; p! x                        if (k == n)8 ^* Z( F5 S& n' ^! |
                        {6 ^' k9 |, a! A3 T. ^
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了2 ~' w* @  Q3 }# v6 Q' r
                            k = 0;) v! U8 L+ J" e9 s- y
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
/ u% Q" C6 a0 T' ?) ~% T                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
0 o1 x, M- ?% e! I" y5 Z. O                        }
: B" V+ t2 ?- O! x                        else//输出暂时还没有改变数组元素的值
% I0 o4 I. _1 q3 F                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);1 Y3 R4 t' C. x2 ?% D
                    }/ T/ U9 |; X* }4 F7 J8 n8 A
                    else
5 e2 E0 S" L9 q( c( _2 m                        i++;//数组元素为0,直接跳过,不计数。。。
4 T- H+ \) y4 J3 i! m: d/ q                }
0 \0 ^& `5 @: o: J
5 x; G+ X! b6 Z# x; k( h
0 Z1 S7 N, `' ?8 [5 Z! f) W" b% M            }//结束while循环
' N! M0 d. ~: p) k0 N9 b            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦0 S( u2 G# I' J
           . g; L5 {& J& M6 {
                if (numw[i] != 0)  `% m$ u+ _7 F( n4 M1 B, I
                    Console.WriteLine(numw[i]);
+ Q% S7 H! \) P. ]3 e           ; g( A3 V- `, c/ y; }; t( Q8 W
            Console.ReadLine();
5 A- [$ k1 F$ u! V        }
5 j( L1 c: U% i$ D4 |1 O) A% X: W( I    }
$ \- `( ^$ |+ H3 u! u+ a( n) X}
: C4 r- \- R+ Z  t8 `; ?: G
小甲鱼最新课程 -> 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-14 21:27

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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