鱼C论坛

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

猴子问题

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

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

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

x
大家好!: n+ c( x/ C) P" S- p  Z" W
这几天我在忙着编一个问题,我用了一种方法编出来!- L0 W( _' X/ S1 |$ d
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
2 u0 d( j4 R" t! u; k  O注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
  Y0 l" j5 E- S- j1 w8 _6 X$ H/ N  x" b
- K  p7 q- U& ^; i  d
                            题目& F) R1 N, M+ @$ [- |% @
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
& Y# B( K* V1 @& E* ]& S* G7 a第一种方法:利用循环链表2 `$ u) b4 W$ x! }, N/ l
#include<stdio.h>
3 m! Q, `2 I! |2 u#include<malloc.h>
) S' R# ~8 C) n# v#define M 8            //共有8只猴子- a9 e/ G. {3 u$ b
#define N 3            //数到3只时退出第三只5 Q  T) X3 K8 |$ Z" A
typedef struct monkey
8 a! R6 `/ P0 x) O0 h( P2 x{int number;3 |3 ~8 q3 `- K( b; p+ Q
int flag;
4 {; @, c# @4 ?! ^  g% B8 D, b4 |struct monkey* next;2 r* A) E! S( r  n0 E
}MONKEY;! K* a' [9 j. {  t
main()# C  C" Q: i4 c- t' Q2 {
{ MONKEY *head=NULL,*p,*s;( N# i  c& U& p0 H2 r. Z
  int i,sum=0,count=0;
+ |% g% G  f. `. [  clrscr();              //清屏
/ }2 D& @/ |; o# I' m  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存' R% e. b$ q2 I4 O
  p->number=1;p->flag=1;+ Q4 W3 E+ @  t) C( B2 _
  p->next=head;  B' y7 y  Q5 ]% b; t1 f, T( G" a
  head=p;/ ?6 Q% E# R" a+ g1 w% R- R
  for(i=2;i<=M;i++)
) v+ T7 _/ |7 ^' F2 I9 f    { s=(MONKEY *)malloc(sizeof(MONKEY));, \9 X& T. f% }4 o
     s->number=i;s->flag=1;9 @- [  z; i  U* Q. H! o
     s->next=head;
: ?0 y0 Q3 \% q2 d4 v/ J6 j8 t     p->next=s;p=p->next;
. I/ l" k( V5 n$ W( q0 u* J* _    }
( h% J  q3 l3 x    p=head;0 U! C( [" Z; N/ W! r1 O4 l
   for(;;)9 b: l! E  C/ ^) d7 K+ h
    {if(p->flag==1)3 M. ~3 X2 |4 e2 K; X
       count++;2 F% h4 o- e- s* `$ S
     if(count==N)
; _' {* z0 h4 O% m# c- u( w        {p->flag=0;- F" l9 [9 x* `' ]) {
         count=0;8 `9 w4 v, u& ]. }1 ~' _
         sum++;}* e) k, _1 U. Z% `7 p: A$ \' q: o
     if(sum==M-1)
5 G' a4 [! F( u        break;
) r* k1 c! l/ }4 i7 Z8 T+ Y+ s3 m     p=p->next;
/ j  ]* X7 n$ e7 x+ {/ X) ]    }- U" Z3 y, u! c( a  C) [' B
    p=
/ C. L- M  G4 U; \  r5 Z/ e8 C    head;
  V- y9 S# b+ h# ^! |* b* V    for(i=1;i<=M;i++)
/ v9 |% t1 q# c% O# _% e# x1 d  _    { if(p->flag==1)
" Z/ l3 X4 B! o8 a1 G        printf("\t%d",p->number);9 H- d- k$ e. S0 L6 m* @" ~
      p=p->next;
9 z; \# s0 F0 ?; }9 p) r    }% W4 n) I8 q  O1 z% D* H8 r7 m5 d& Z& ]% M
$ h8 m# c; [1 j8 D
. f8 c3 F: i4 I1 k( `. d  l% w( r- l
# \" @. C& F  C4 [& V# d
}

3 L1 Y6 [1 {0 s5 H第二种方法:数组
6 Y6 |4 v* p  G+ ^1 j# e#include<stdio.h>
# ?* m( \1 ^1 I$ p#define M 8
0 ~- W3 v3 S1 x- E4 vstruct monkey# n$ J4 G5 U2 \
{int number;( h& W4 |! j- u9 C. ^  J
int nextp;8 j; q# c, P0 ]5 ?' S! j5 _
}link[M+1];; ^, q, S; l! w3 T3 r  b& b

& J& i+ l2 O! T" b* l% K6 ovoid main()
$ }- `/ h7 l; ?$ t{int i,count,h;5 z. t( T" o+ p) P0 a2 Z
for(i=1;i<=M;i++)# g! Q1 P8 T0 r# _1 d
{  if(i==M)5 Q* f/ p8 b) R& B6 e" h! I
   link[i].nextp=1;. ~. o5 a7 [5 Z/ j- o& D. @
   else/ c: M& U% c5 O
   link[i].nextp=i+1;
0 Q' @7 X* w  C8 s  link[i].number=i;; a+ w* j2 G1 ^. A/ b
}8 c' [5 |5 _$ C" r0 ~7 X
printf("\n");3 [" r3 U$ Y$ h$ d" w
count=0;1 C# m9 D% q0 s8 Y
h=M;
( g# o, q2 a; X# d  ~$ {6 F( A6 Vprintf("依次退出的猴子: \n");$ o+ V# h; c' h* n' ^' X  Y* I
while(count<M-1)
. l0 f9 g7 ~  V7 E{i=0;
) o$ {2 G1 W  z. c' T+ Q* ^! r8 S3 Owhile(i!=3)
/ z' r: ~+ b5 P2 x7 J0 V; i  f{ h=link[h].nextp;$ g5 j7 x" I0 H' D
   if(link[h].number)2 i) S& g0 _" }5 y7 W
     i++;}) M& V+ j1 z/ A8 z7 S5 R# P( F
7 f  j: G6 l9 f7 o3 {! |
printf("%4d",link[h].number);; f7 @: l$ q4 r# _/ X. R& {
link[h].number=0;6 T9 W* G# H: ~* `# u
count++;
$ L- R* {7 Y8 e6 H! r2 I( O}
- m0 p1 `2 p; _8 b" t( ]- O# t  P4 X* N; J" N
printf("\n大王是:");
" U7 c5 y5 J; Z  u  for(i=1;i<=M;i++)
1 `! K* b; N" h& }  if(link[i].number)
, W( d7 r8 ]; q9 j# L4 T* v: I    printf("%3d\n",link[i].number);" w$ _' ~! w) h, T9 @7 p

! m5 z% D4 i  h$ f
2 R% v% U" v: x: k% h# y}
8 a- t# C0 ^: W$ u( u, x4 Q
第三种是普通方法for循环

. Y5 ^) P8 A. S  k# h- K#include<stdio.h>1 `1 G  L, J5 w- Z3 g# t$ o
void main()
* P+ i8 R9 y* g7 f! c{ int i,k,m,n,num[50],q,*p;3 I9 y, C3 `! F& r4 k
    clrscr();
2 R# _9 z3 L" f% o" l+ X   printf("input number of person: n=");4 P5 |# B, L5 C' N* n. x
    scanf("%d",&n);; F/ r$ K( ?) p/ g
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只& J# [' k# r' C" G7 ~
    scanf("%d",&q);
: q! B1 B8 k4 G* C   p=num;* b# O8 U5 o8 K4 S, e! d
  for(i=0;i<n;i++)
/ _8 l$ o0 j' X1 Z5 d$ T    *(p+i)=i+1;/ M& i! c9 P: _) j. v& F
   i=0;7 _& v( r6 C3 p4 r% W
   k=0;" T. M7 M& P5 X- Q7 t+ `
   m=0;1 @& U  K2 D0 `1 Z4 p6 v1 l1 |
  while(m<n-1)+ x  m: a, O; S7 u" }; O8 \
   {if(*(p+i)!=0) k++;
& D; S0 n$ X/ Y5 b3 U$ t     if(k==q)
& @1 q$ A, C/ m3 i* L      { *(p+i)=0;
) ^! d- _, _' P* _) V        k=0;$ [, Q; l% R2 N8 M! a" e, T5 x
        m++;, J" \4 J! S3 b  y% O/ b
      }- s- ~( B' Y9 r5 |" F- d% b: k
    i++;4 C/ d5 C2 x$ s( k
    if(i==n)i=0;
7 I; r: @7 z% `' ~3 v; h   }% P: R8 _. f. v5 O9 \1 W
  while(*p==0)p++;6 B1 Y" }/ l# O/ O; D% F5 D
    printf("The last one is NO:%d\n",*p);/ D' A; O# N* k* M1 T! W! g
     getch();
0 G4 d1 N, g2 L" L+ f5 v
# ]; T# X/ b8 i* Q6 E% h2 D}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
3 x7 j8 i+ Q; m+ N$ Anamespace 又费马达又费电
  Q/ Q3 B$ h9 H! k& v, y; z7 V{7 u7 b7 |, t: a; \  d
    class Program
5 M! j; W( N) c+ Z) s9 f    {
8 Q% }" g$ W# [* E        static void Main(string[] args)
6 s- ?6 \! B! p& h) Q        {
) G% S% }2 ~& i: ]5 G            int m, n;# L. M/ u- b2 {/ |! i! e7 n, e
            Console.WriteLine("请输入数组长度");4 n" h: h% Q1 L: L- C& |' ]
            m = int.Parse(Console.ReadLine());//m为数组的大小
6 g/ C. J; L; l8 d+ u9 w            Console.WriteLine("请输入要截取数字的大小");4 x" h4 }% I. F1 U2 ]- [. i
            n = int.Parse(Console.ReadLine());
* ^7 z1 m# x) {) V2 T9 M            int [] numw=new int  ?3 U+ m5 ^% `5 r. g* w3 R

; O, e8 N2 {. P, Q&shy;&shy;&shy;;
0 X* v5 t1 ]" \$ {  j            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数' Z2 |" y  V2 g5 ?9 x9 F2 V  V
            {4 }9 J7 W2 k, L3 N
                numw[j - 1] = j;, a7 x. F- _( I
            }
# R9 d; m/ C8 d! _. e$ G            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!* ^- R: s* {; t) j7 o
            while (d != m - 1)
) l# m  |1 g8 x" J            {
- {1 l* ]! w) B/ r; v9 s                if (i == m && d != m - 1)/ L: ?) z8 P1 ?! T' P: g! N7 |) x
                {* _% j/ Z/ m$ n; [9 \
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!2 E/ q: v4 z7 U& y2 {! G0 |$ K
                    continue;9 \0 i& n! t4 e  Z; u+ i6 q
                }/ [$ L! o6 P( B
                else
1 l- P6 A. N  z: a: ~0 R                {& F* @  e4 l/ a' y6 a& _
                    if (numw[i] != 0)! U7 ~) t% c  Z7 o4 Y! N
                    {! j; t' @- g2 u8 w2 P" p# L# @
                        i++;3 k; g. h* [. ]  N7 |. |5 n
                        k++;
/ M" H+ T* _1 R6 w. @                        if (k == n)
9 A* R; O8 n: e                        {
- Z0 }5 C7 T. a                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
% b& x8 ]$ m- s2 O3 ]' [$ E                            k = 0;& ^! B% ^  L# V$ Z" J
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
: N2 u( u  D) k( @6 V$ Z6 J                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
0 w& R! e6 K# E) R( i9 @                        }
% u5 D8 x. ~( Q$ I                        else//输出暂时还没有改变数组元素的值" A. y6 z9 \9 e1 D- D) N: N
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; k, |5 d! e# @7 z) ~6 L- _& e                    }* r3 C- A1 }0 ~2 \$ v
                    else
3 q( k  Z, F. z; }% Q                        i++;//数组元素为0,直接跳过,不计数。。。
' D$ {" R( F8 `. m7 x0 B, U                }
& `) B; Q) O9 Y& c4 N7 K - H5 C* K) n1 Y9 G# i5 `( Y! n
8 h! X( K1 [  U
            }//结束while循环7 A& z, @/ X4 }2 G( G' n
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
. o# P+ Q; T/ `           , P/ r. _8 H. V) \) [) U
                if (numw[i] != 0)3 U" x" r7 _5 E) Q: v8 H4 \1 F
                    Console.WriteLine(numw[i]);
2 e% c* ]3 y4 l" V2 ]+ T           ; w2 ]% G/ {& Q/ B
            Console.ReadLine();0 G, D* {$ G2 Q: d4 U. ?- f4 N$ N  x2 D
        }
# s9 W5 `$ j2 s* i( q    }
) w% S4 j! \7 t* w# [. x* C}, _. ^9 n" f, g# M- V* h$ |$ B
小甲鱼最新课程 -> 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-7-17 13:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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