鱼C论坛

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

猴子问题

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

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

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

x
大家好!
& p8 o& e6 Q! n/ _这几天我在忙着编一个问题,我用了一种方法编出来!
9 K% Z. @, [4 t3 H/ c/ z但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!; C, N2 n( f; ~8 K
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
, x4 Y* j, e' L5 b9 V  ^& }& g( W  W1 Y+ k8 r0 u
3 r7 h2 {/ ]( }1 x! {7 v3 f
                            题目, J; Z: t  d- O
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
; I- \% D7 @% Z$ R  y4 D第一种方法:利用循环链表2 Y, ^- S% {) c5 t2 b% q
#include<stdio.h>; K( ]# e) A+ O2 L8 @1 I) U
#include<malloc.h>
- g( `4 @( \* l) o9 `9 e9 E% M9 E) @#define M 8            //共有8只猴子4 c6 j4 }8 m7 J' g' u& t
#define N 3            //数到3只时退出第三只
% }0 }% t# \4 E3 `8 Z: Q4 |typedef struct monkey6 V  B, b" h  U6 u3 x
{int number;, J  g6 S; V8 f6 S; Q$ A- J
int flag;7 E7 d9 n! A) i: w( o) P
struct monkey* next;
( i7 T* O6 I. s# ?( K}MONKEY;
% q1 f8 x# T3 L/ q, e4 j2 p! X1 Pmain()1 B7 S) D0 A' l8 I
{ MONKEY *head=NULL,*p,*s;
- P; O& u. }+ y: p) e: d  int i,sum=0,count=0;: }8 g! A3 r& D
  clrscr();              //清屏
& L5 O2 K' p- y  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存% m1 S  }, U' W- l
  p->number=1;p->flag=1;
0 J1 c! ^$ k0 B( a9 D# ^  p->next=head;3 f- C7 O* M8 w+ e* [
  head=p;& m$ n1 e) E7 u9 K
  for(i=2;i<=M;i++)
: v% q( E0 x! o' I; T: f+ c  w    { s=(MONKEY *)malloc(sizeof(MONKEY));0 z1 W7 g2 B+ D- v
     s->number=i;s->flag=1;: V+ i% h# ^( Y6 b3 K
     s->next=head;
/ {+ e& I+ {" Q6 U" p' o     p->next=s;p=p->next;
1 o! B8 H8 X6 X) X; G. G! N    }
& w  n8 o0 a0 z' z" K5 I    p=head;
# R2 _' l. P: G. E. t   for(;;)" R( s9 S- ~+ Z/ a1 G% r
    {if(p->flag==1)7 r4 ~6 F7 l$ Z2 |
       count++;
; Y: J7 ]4 F5 i1 q) w) q3 i' d     if(count==N)0 I& M1 m/ |% c1 R- l
        {p->flag=0;) F: E3 i: d5 E% S  ?. @: A
         count=0;) E/ a( w/ u; Q9 \- i  ~
         sum++;}
, w. H% u: C" j7 e* ~6 q     if(sum==M-1)0 w1 x# I4 y0 L1 t& S
        break;
2 Y" {3 K# b9 }# n/ d* V     p=p->next;5 [* |) M7 G8 a
    }+ U, e" w, f, f0 }* p- x
    p=; p$ A. E$ S3 g/ V
    head;; k/ ]* v2 V9 D! }2 t, S8 T0 M
    for(i=1;i<=M;i++)
& z/ h8 L$ Q4 k  ?* q" n% e    { if(p->flag==1)
# l7 C; t1 @3 i2 X  P0 q; U        printf("\t%d",p->number);
6 w/ C5 P4 v6 I# F) {3 b0 \      p=p->next;
9 z0 p5 ^& r& e+ @+ N    }
- X, [; Q" p9 w" n% c2 c" l% i* Y3 ^0 g
2 C( E! M9 B. [/ c% v% H- O
0 B' S1 w/ P) F8 E+ _5 ^) u% J. ^
}

$ v8 H9 k* t) f; R7 G% }第二种方法:数组5 @3 y9 r% v; B; l
#include<stdio.h>
- y$ r9 r1 s' |( h#define M 8
3 U6 X& D1 {$ \$ W4 t1 Dstruct monkey7 G1 A8 {  z# g: O0 j
{int number;
2 N9 K- a$ p8 K4 K& m- [$ uint nextp;  {2 C/ f3 }3 |( n, g% D
}link[M+1];
  F. ]/ R& H* J" M  I
+ M2 E  D+ t9 Kvoid main()9 U2 ~& h2 q# b3 g3 s" b$ l3 H& w
{int i,count,h;
: ~. \6 ?- B7 ^8 h- i1 Bfor(i=1;i<=M;i++)$ ~- {$ H* B# j  G! A3 @
{  if(i==M)# G$ Y2 E- c  Y7 g0 G
   link[i].nextp=1;: g0 y- ]$ _/ X+ G' K$ U: L5 n
   else
; q% d  j5 h) w8 n# \   link[i].nextp=i+1;
+ E5 }- m& I7 Z+ D" a2 e+ {  link[i].number=i;0 f& A+ F: t- J6 q! X# a* k# k
}6 ?4 X& @6 n( u, C3 B2 D/ a! r
printf("\n");+ j2 u5 y: O4 \1 ]' |
count=0;7 u) a2 _" `/ ?) r0 c1 o# y# v
h=M;
" F1 j! V4 C$ l& W2 X  {printf("依次退出的猴子: \n");- ?* n) h/ _. X
while(count<M-1)
. P* G: @7 ]! `$ f3 W& V{i=0;
9 }, ?7 M8 G# ^" R' Lwhile(i!=3)+ {. s  h' Y; _( P' |* C' _2 J# V4 G
{ h=link[h].nextp;
- B! _0 ^" k( H   if(link[h].number)4 N' q) K  {# B% b
     i++;}
1 Z( z" W% A; x1 o1 N! N3 D# K: O! X4 E/ x4 o* {. g
printf("%4d",link[h].number);" T0 G2 B  t! b2 ?4 [7 @
link[h].number=0;
. ]: }: b% _/ T/ \' Pcount++;
& f% P1 f: b4 g}: D1 V( m6 N8 S; q4 S# Z# K

) p3 c( ^+ _' Z% J. x; [printf("\n大王是:");
) W/ h4 H) P* F1 l( [: l  for(i=1;i<=M;i++)
' O* S' i0 O+ T7 i8 Z% s  if(link[i].number)
* c" g$ {( D. @5 m3 d; @& O2 [# O8 J* M    printf("%3d\n",link[i].number);' e; _; o- f2 r3 g  X" b
, b2 f# }+ f+ F! T! [3 Q6 u9 ]4 u
6 e0 Q4 _, _5 `- a( T# b; L
}
. A7 M5 y  B# W* ^5 |5 b
第三种是普通方法for循环
  ~: t% v* `' |: A9 U
#include<stdio.h>
3 b1 w; E! M+ Evoid main()
  i/ i  l! p9 n% j+ J; p{ int i,k,m,n,num[50],q,*p;
) c8 ^% [) r+ ^    clrscr();& l$ ~1 Q. ~# w7 j* h
   printf("input number of person: n=");
/ v# t5 m# E' G) p, N7 D* I1 u    scanf("%d",&n);( }8 A+ |; \+ G- c9 }; M" C
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只- ~" m$ u/ r% F* F9 ~9 j
    scanf("%d",&q);
2 c/ U7 a3 x3 H* |   p=num;' c, x% p' y% v0 Z3 |, d9 z2 F- B
  for(i=0;i<n;i++)
8 b$ c1 i2 |3 |! `' O- Z1 M    *(p+i)=i+1;
- y! Z5 S" i( s( G7 b4 G   i=0;0 n7 d' ^$ X; x
   k=0;
/ g# I; U/ c& s1 h   m=0;) Y8 @+ W# c0 [
  while(m<n-1)- `- M7 i- d0 s, u. Q/ `
   {if(*(p+i)!=0) k++;6 d* t8 W7 q/ Z; D3 f
     if(k==q)
$ a% T; C' m+ ~& N2 x* f      { *(p+i)=0;
/ O3 a; W1 N1 U" W' E( D' l5 n! e        k=0;* a6 `; r. h7 j2 q5 D
        m++;3 Q  _: A( ^- h8 `3 {
      }
' D/ E% e% Q: ]3 G5 W1 o3 G    i++;
# C- U/ Z6 |" L% z( g* k0 w    if(i==n)i=0;
. Y( E5 A) j( s( g, n/ n) Y   }  Y$ d0 v" y4 ?* q6 V; |9 P( Z( y
  while(*p==0)p++;; e4 A% s2 M; `7 w; X. h
    printf("The last one is NO:%d\n",*p);3 P% Q5 z7 r6 I8 W8 ^( {
     getch();( |8 w8 R7 A; C+ `$ U9 s
  d# V' h. _: W4 H& D- b
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
* [' S9 x# j- |. \6 lnamespace 又费马达又费电
+ ?1 G- \0 e/ e$ j$ |{/ V7 Y" _/ z- W7 r- L
    class Program9 @) c: ]" X8 t7 c2 h1 Z5 y  E, m
    {! S0 a5 u2 e. R0 ?) A
        static void Main(string[] args)
8 k8 Z& K" |2 V# @  C2 m        {
' B" w0 h" m3 C+ z            int m, n;
% u9 d! Y% c/ }1 e& M5 @5 q            Console.WriteLine("请输入数组长度");
% s% g" t+ B. D( F, D. a# H& c            m = int.Parse(Console.ReadLine());//m为数组的大小1 h( [9 p8 M9 R7 a6 F
            Console.WriteLine("请输入要截取数字的大小");
# z* N6 `& U- j8 O3 _% J, Y- R            n = int.Parse(Console.ReadLine());! O8 E0 x( ^9 ~. A* c' S% m) _
            int [] numw=new int5 }1 ~9 k0 v" e7 @0 W0 o; c

. ^2 G* s: z. R3 _$ x1 n&shy;&shy;&shy;;8 }) Y9 |. t& C& o0 j2 d1 G
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数1 O2 [4 {, u' m# p" x9 x
            {
3 e; J. ~1 I3 J/ c                numw[j - 1] = j;
" |+ C, \' }" n# M! U            }  f. I$ \" C/ ^
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!+ I! o$ V$ x2 D) [
            while (d != m - 1)
/ i, i2 F" Z; @  T- h8 u            {
/ ?( s5 ~$ o, \, J1 v, }9 L                if (i == m && d != m - 1)" j  l0 z. j; ?' U
                {+ e5 c! Z9 A# v( H+ T- V0 A
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
/ |  \* t( L0 ^% c. M6 L( F                    continue;
7 _# @1 Z, D" A# T2 o                }; n3 Y( [& R' q! C
                else
, m6 Z0 Q! A+ _. z2 Y2 E: K& l- `                {  B7 G  ]2 i4 T6 Z+ \/ u* I
                    if (numw[i] != 0)
' d; l" Q) C' [, u' ?) ]. C0 g& h4 Y                    {
3 }( F/ }# y% o$ z9 U                        i++;& g8 o0 ~- q1 S& e7 @
                        k++;% S( R8 K1 f1 a( l- L
                        if (k == n)
+ z; Y* ?  l, b2 t                        {
: B) u: E. C9 @# d' m5 f1 J1 v: j                            numw[i - 1] = 0;//把在n位置数组元素的值改变了. E: o) r- c0 p1 e9 _0 e
                            k = 0;/ g& L* K, P/ N- _, N/ G
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
3 J" n) p) C9 F8 J                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
5 z% W5 M: f) n, G1 m                        }
/ h8 N/ g  Z! V6 @( K- N                        else//输出暂时还没有改变数组元素的值
4 e  t, O$ R- ]5 M6 h                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);8 m6 y0 K8 L( `
                    }2 c7 S8 m/ I8 D, T) j/ n& y
                    else
/ S( n  \+ M1 v7 F1 P                        i++;//数组元素为0,直接跳过,不计数。。。$ V6 K2 F5 k5 a4 ~( F8 M
                }( U' a6 i! S5 d5 [6 |  J9 t" v

8 ~2 a3 _& q# d; r6 a
. @! s; C8 c1 X            }//结束while循环
* @  Y0 K, ?  N: H5 h7 R9 ^; d            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦. ~; w: C- @, o  F& O0 r
           # U% _5 N: W! U8 z6 H1 K
                if (numw[i] != 0)
( y/ Y# f4 ]- y( F  W  w                    Console.WriteLine(numw[i]);
6 {& n& q% I2 `% |           - s' G+ P8 b& J! V1 z
            Console.ReadLine();$ m# W) j$ o" h( s# v
        }
4 w( n9 \% f/ K8 c    }% g- e- f' G7 i6 D6 C# [" z3 L
}/ P( N' W, e9 |
小甲鱼最新课程 -> 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-1-4 05:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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