鱼C论坛

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

猴子问题

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

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

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

x
大家好!  S# i! ^# f2 O" ?( n
这几天我在忙着编一个问题,我用了一种方法编出来!
$ P, n  z! i' g4 m: ?但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
% \0 O+ U6 M0 q注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
5 M5 J+ j1 O7 [3 B" e5 G* H
  X# J" \  }" C, Z% [8 c! I* ?+ h7 o
                            题目. J( X( ?- a1 y- l
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。3 g2 f6 _; r# ^/ `7 N
第一种方法:利用循环链表
( S# {1 p5 {* p' Y" T. \7 g6 y1 _#include<stdio.h>" h5 r8 w7 E; T& ^
#include<malloc.h>* [0 Y# F& ^1 q$ N: G7 O* n( y& c( Q
#define M 8            //共有8只猴子* k3 }7 D7 \3 c' V3 w7 ]3 h
#define N 3            //数到3只时退出第三只% ?; Y( {% z5 _. n6 U$ B
typedef struct monkey
& U( [* e5 B2 x- m# h" Y{int number;* j4 ?$ M/ U8 O* Y
int flag;: q& v7 T8 K8 s/ @' H- @( K6 V
struct monkey* next;! Y: [7 G+ k' r6 K1 M8 y8 Q2 d
}MONKEY;6 S' D0 Z! v  j% i
main()
; {% H7 X8 G9 ~0 L" K{ MONKEY *head=NULL,*p,*s;, R9 m5 G* M7 |9 h* P5 @" \
  int i,sum=0,count=0;* H5 d. X# _# M6 Y4 K: f0 G4 e6 g
  clrscr();              //清屏
3 O' n! ?$ k' k  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存& A5 U# ~- i! M8 |
  p->number=1;p->flag=1;$ L0 R1 h& ~) T$ n. f: k
  p->next=head;! T1 u! t: W7 d) k7 [4 h# B: h7 ?
  head=p;; V* N. e# O) Q
  for(i=2;i<=M;i++)( R2 ~& L; a$ o; |$ k) u
    { s=(MONKEY *)malloc(sizeof(MONKEY));8 W9 p3 K2 h9 b3 c6 s6 ]9 H
     s->number=i;s->flag=1;* u) F# G5 B4 L( `
     s->next=head;! ]7 W! R. ]4 x% I; a8 \
     p->next=s;p=p->next;3 X! R, m3 y" _9 L
    }
/ f" g# ^/ A, A6 A    p=head;
: \6 `) _: H' u   for(;;)
9 l/ X/ A" q; q1 G    {if(p->flag==1)
& Z! F6 V; @) Y3 l2 d5 z' g       count++;
4 ^+ w. G# y7 b: i     if(count==N)' X/ w9 K4 T3 c: i" ]$ E1 F
        {p->flag=0;1 s6 d- f1 ]0 X2 y: P
         count=0;
% h! O3 G1 J) c7 G# M         sum++;}
  G$ q: ~7 M! @: E6 V$ }     if(sum==M-1)
8 r! ~- U; q5 q* r, Q        break;0 c% O! o2 |/ ]
     p=p->next;
" H# v# y# P2 f7 g% ]    }
& p8 v) h% j* U! u6 {6 k    p=
9 s7 D  I6 R, ]" P6 ]    head;
9 |0 K) N) c9 e    for(i=1;i<=M;i++)% r& C% ?# q# B6 X4 b
    { if(p->flag==1)6 R7 Z: u9 I  s, S/ x3 Y1 A$ }* q
        printf("\t%d",p->number);
6 s6 b% y* H% K! d: d      p=p->next;$ x( \2 ?8 I# U7 T' A* `3 b
    }
# r. f# g# L0 N3 g0 F& A8 L8 |& p
# n6 z1 r0 j  p" }( U# u- Q
/ k! \4 _/ p& r/ t' U/ i: I- L5 y. {
}

* P! W# e5 s, I# W* z' G第二种方法:数组
3 W; k! ?# V) _/ V) f#include<stdio.h>- E1 x/ u' Y) c0 C
#define M 8
3 J$ J4 k: e3 |struct monkey) D7 W9 i5 _0 P) e9 t
{int number;4 S6 i6 [. I: _& ]. n$ {
int nextp;8 n+ s" i- t1 S& q7 ]( f
}link[M+1];; Q! {( x; s% V
5 Q6 t& V6 ]8 i
void main()
# T' l2 v  E7 |{int i,count,h;
+ g* }: U8 a9 H3 [for(i=1;i<=M;i++)
1 |& |6 z1 s# ~4 d1 O. J0 V{  if(i==M)- O  R8 z$ I$ f( p+ S% i
   link[i].nextp=1;
+ y2 `4 @0 p) h   else, ?. U8 }/ D$ q- Q
   link[i].nextp=i+1;% J6 x6 I+ o5 o. i' V7 X
  link[i].number=i;
# R0 A& {. V1 F& u  ?}
8 N6 X4 Q5 g5 @- t2 n  aprintf("\n");: U8 b0 H- s$ F/ Y8 R5 ~% I8 s% b
count=0;% ]1 K$ k* L* i- U2 k/ l7 [
h=M;
. B* |8 Y. u0 d2 j" ^! o+ gprintf("依次退出的猴子: \n");7 M, _1 O) f5 }% j1 ^! V
while(count<M-1)5 _% N4 ~" s* p& G1 h2 y
{i=0;
6 j$ m% E2 Y; B2 w$ W3 L. rwhile(i!=3)
( v1 N; Y% a8 S& e* O+ q4 {$ w{ h=link[h].nextp;, z6 N, A- u' Z  ?- D
   if(link[h].number)7 M( R1 o1 V: U( v, ?$ Q+ f
     i++;}7 O7 m; x* O3 I, q9 x& y. {
5 ?, a2 V' n$ @% s! P% A7 L. q
printf("%4d",link[h].number);9 W. _7 |! x& r: v
link[h].number=0;
8 l( q% e/ F2 C' _; scount++;) C* h2 ]% T, j3 d$ `* R
}7 s, G# z9 D1 ~0 d9 [

" T8 e% _* q& W4 x% o+ T- _; d  Nprintf("\n大王是:");" N) ~: n" {6 ]4 c
  for(i=1;i<=M;i++)' ~; M* u; y# O( S% W
  if(link[i].number): C. U, o- l/ Z
    printf("%3d\n",link[i].number);
8 E+ }1 E+ a0 e, b# o( h  z* E9 H7 |
9 A) ]3 q# b) l" b" |2 Y# p. |! z/ n* d1 b, [' M( i# J
}
3 W" ^: [0 Z9 O2 x/ q) F" O
第三种是普通方法for循环
+ r( G: B% T* d) _# l* o) E
#include<stdio.h>1 @! o3 }% h! I8 K8 [2 c0 s) k: p& l
void main()
8 C  W( O6 ~; j# C! r6 E3 S{ int i,k,m,n,num[50],q,*p;, U+ ^  r& y- L+ d1 m
    clrscr();
5 a" M5 N$ [+ B7 f/ P* s   printf("input number of person: n=");) b+ H& o' S( e5 N
    scanf("%d",&n);
8 Y  N5 L% N* h- Bprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
3 o% W1 D8 r1 V" i: ]  k& j6 x    scanf("%d",&q);1 T0 S% Y6 i# Q/ y) B
   p=num;/ l% V# h* L% ?( v. H: q
  for(i=0;i<n;i++)
% \+ L8 d- j9 d/ }    *(p+i)=i+1;
# h1 P# a7 }9 ]  b3 U. U" u   i=0;
# O1 b1 ]2 p/ q$ d+ I   k=0;
. N& O$ T, w# }: r( |$ O   m=0;5 T0 @# k! n/ N% x
  while(m<n-1)
! V/ a/ d0 j4 l   {if(*(p+i)!=0) k++;1 ~7 @9 z( {  N
     if(k==q)1 k2 x) K2 Q( K( w# a" q, c
      { *(p+i)=0;: g4 U2 v& j; w" O' C/ ]
        k=0;$ `4 w  g% V! H: p! t2 Y4 _* K
        m++;
: I) f9 ~$ T: X+ F2 d( @, t      }/ L* [! z9 |6 S, m0 U
    i++;5 a9 H0 J+ \$ l1 [+ @
    if(i==n)i=0;
& E5 E! k' k- m- j! N: X! }2 e   }0 X, f$ h# b" _  C& d
  while(*p==0)p++;
  x: J& o$ v4 A  y    printf("The last one is NO:%d\n",*p);& X0 A) X" L3 E
     getch();
3 [8 q. A7 S3 G5 v' L" t& L
2 P. k7 x' P% Z% m) X  r}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;4 J5 |7 O5 v% Y8 C* n6 r" s3 ?
namespace 又费马达又费电
& w: ~0 |* o# ^+ x7 G{
8 P+ e. A% |* b0 B5 w7 |$ z# o    class Program
" h: w+ t$ _0 Y* T# d1 l% P3 E, T5 u    {+ O# O1 S" l  E. l8 B
        static void Main(string[] args)' I2 z8 c" ]' d
        {1 o- f% z  W  \2 O( e
            int m, n;/ N% i9 I% d+ x: `0 g* d
            Console.WriteLine("请输入数组长度");) i8 b* V# |& s3 }
            m = int.Parse(Console.ReadLine());//m为数组的大小/ R6 l2 j$ B) h+ C1 V
            Console.WriteLine("请输入要截取数字的大小");: o5 E( S1 ~% A
            n = int.Parse(Console.ReadLine());% D2 }* o6 R# V) d8 M% z
            int [] numw=new int& ^+ a9 O9 ]+ z% n% a3 C; t

- Z0 C0 {2 c' N/ r/ W$ \&shy;&shy;&shy;;
0 j5 c) @# \3 ?2 k$ F2 P' {            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数, S2 [& d, E+ a- o2 r+ P
            {
7 Y1 l* I, y" s% P- v                numw[j - 1] = j;8 N9 k& C+ i5 ~7 r  o7 [
            }" i( m0 r! w, v
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
! G* P3 b9 b: h6 D8 d4 ^            while (d != m - 1)) s, e7 h: G  D* h( M+ a. w
            {8 ]3 \) b1 S9 H& b& X4 u9 m4 C
                if (i == m && d != m - 1). j) p* L1 G4 `
                {
' A+ W2 }. l1 d$ {                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
3 j8 H/ `8 Q0 \% G3 x2 p; X                    continue;
* i) i/ ]9 d/ {  @* z, ?* l                }
/ g+ W  K/ }/ i  L) j$ K. V                else
4 |3 P* [/ X! P) J                {0 i8 ]/ V$ \* m- V( [9 P" o
                    if (numw[i] != 0)+ w% t* K+ n! r: Y, O* Z
                    {
; U# j1 a$ U# g4 r8 r                        i++;
8 C* n. K7 H0 D4 ^                        k++;
9 T; v5 w/ x3 ^# M  e+ z) ?                        if (k == n)
2 ~2 y! s$ B3 e6 ^, B" w                        {+ u2 @% g5 M. h  @. x) S
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了4 a* b0 L* n- a7 w8 m) ~; I
                            k = 0;3 D6 d- s& d& N, n( a3 e, Z! x
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
% a7 E" u% W% W2 f3 z                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);5 ]6 [2 B4 [- w, \' D- S
                        }# P& B. _9 V5 Y6 s3 v8 T: K
                        else//输出暂时还没有改变数组元素的值
5 r+ x1 ^8 m# ^' }, z& H                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);' e; T4 m" U& n6 s5 L
                    }* W! Z3 d( p3 h4 v2 u
                    else
, ^+ l  N- S. e& d5 k                        i++;//数组元素为0,直接跳过,不计数。。。- \3 ]  V  K, k5 C
                }
/ u6 p2 @4 }0 \, a. k* L9 r " ?. D  k/ U! @* C# ^& t# o

0 u% |/ I: L5 D# b' s) V* O2 {            }//结束while循环
7 [% p9 [* F7 z            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦1 @+ a7 N' r! T
           
- o: a+ x# ~3 f, \8 C                if (numw[i] != 0)! ?5 L' T8 D& s/ D
                    Console.WriteLine(numw[i]);4 I3 f9 R! {6 ^- t, h5 d
             ^* T' ~# C7 E; x
            Console.ReadLine();$ F; l  j' O7 @4 \; S: C
        }
" R5 u/ C& W) y# Q" S    }
0 U$ u% B8 f/ j5 {}) @* X% y7 L: n- ?- A% J* r( r8 ^
小甲鱼最新课程 -> 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-2-2 16:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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