鱼C论坛

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

猴子问题

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

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

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

x
大家好!8 v% G& u3 x5 ]( c
这几天我在忙着编一个问题,我用了一种方法编出来!; z# y7 S; ]. ]' ~
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!2 p) x, g( c$ p8 v+ z- G
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
* o3 |7 F$ [4 Z3 V, [
& `: ^/ W, O- [) e6 b8 x
5 J+ _" @  ]7 V4 O
                            题目
; H: ^; N  }+ w1 ]山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。' P, t& x! N! k; [6 C- u
第一种方法:利用循环链表0 L6 T& W- e; a- t; y# p+ g5 b2 O
#include<stdio.h>: H) A4 W7 d1 q! |2 V9 _$ s; K, J1 G
#include<malloc.h>
" [6 L! S" e: N% P2 h1 A#define M 8            //共有8只猴子
; q" p; w. q; f+ C; s3 j' A/ ?#define N 3            //数到3只时退出第三只
9 ?1 q/ y1 ]  |9 Rtypedef struct monkey
( y2 l( w2 B+ g7 M1 o1 _{int number;
3 K7 i* z2 _+ wint flag;4 H/ C% o8 j- y
struct monkey* next;/ S0 n6 o& v3 l. \# G- v, H- I
}MONKEY;( I' }2 i6 ~" d' f) j+ L0 H5 n! D
main(). R% l! E! U& B" Q
{ MONKEY *head=NULL,*p,*s;
$ s8 Z# g0 n; J& B! j  int i,sum=0,count=0;5 j7 a* F# E# K. ]9 q% d
  clrscr();              //清屏
$ c6 b: B' L* }1 O2 D. U0 i# O  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
) `( j! n9 h# L4 P1 S* K  p->number=1;p->flag=1;
; k9 D" x& G0 L) C2 s  p->next=head;
  L" {/ b2 ~4 e' j3 ~( a! Q  head=p;
: V3 r. [+ [" j# n  for(i=2;i<=M;i++)
& {5 y) G3 o) C! ^  i! V    { s=(MONKEY *)malloc(sizeof(MONKEY));7 w  l3 _7 ]+ z. ?* C
     s->number=i;s->flag=1;
! W) q; C6 a6 S6 ~     s->next=head;, a4 t* s- D! y7 z
     p->next=s;p=p->next;
0 L- b/ E5 |! f  V( J: j    }
5 P$ Y4 x" ]. {" k  V    p=head;
, M  d3 y: R1 D3 }/ y, b4 ~/ k   for(;;)* t7 W5 ^3 A4 w5 v
    {if(p->flag==1)2 A$ j* C& D; m9 M: r  P
       count++;; _5 U& W; |; [  ~. @
     if(count==N)
& _& w/ c0 v4 ?4 b3 j0 E% m) [, N        {p->flag=0;
: f7 y" g/ X- E7 l& F         count=0;2 _2 ~) E! W6 G1 b7 _
         sum++;}
; ^2 b5 {+ Q8 X( e9 [" H4 B( p     if(sum==M-1). p$ n7 S, p6 P: A- \
        break;( c* d: R  @, M3 g- k1 \+ _
     p=p->next;
; x2 N* |; c6 \3 r2 h( r& b$ Y, l    }* B1 B- B: L# _) e9 u
    p=; i" G& \3 |8 k" o0 m0 F
    head;
4 O! y" n$ u! R; y8 x- U5 y    for(i=1;i<=M;i++)
' H5 m3 }/ p, h) b/ Z+ J0 V% ]    { if(p->flag==1)5 N" V8 {* [" J& F9 u. t; p1 O
        printf("\t%d",p->number);, a% `1 z! x2 I# y
      p=p->next;8 D5 M! W' Q6 w5 k$ l+ b- f6 ]- j
    }
6 @* w) s) }. ~$ Z
& e/ u# }, V5 u8 S' Z% @5 Z1 H9 z
2 }* Q2 N7 J2 h1 z' b; j
5 T6 A+ [" g/ x; K}

; r2 W1 _/ X( o5 l第二种方法:数组
) w3 ~% ?3 W- H% i8 a" A! L#include<stdio.h>
9 E  t* G* Z$ O. V! `8 D6 A$ r- k#define M 8
; V' \) z$ x- xstruct monkey
, y% i" B- X3 v+ _{int number;
1 f+ m1 C4 X6 d+ o9 W- hint nextp;
  i8 I$ i& d/ e5 K- `( v; B/ q}link[M+1];
+ J1 f9 h& J- ?: u3 C6 M/ z8 V4 F/ p4 r! s. {
void main()4 k# X6 V5 H/ ^1 [% T; E4 {
{int i,count,h;
2 g6 b4 S& w" p# A, @( Lfor(i=1;i<=M;i++)+ e. t, e9 W8 R* e; O0 p: S: p& N6 r
{  if(i==M)
; `: d# X2 W2 c* g$ W( l1 Y$ _4 X   link[i].nextp=1;
  }5 t' o( b8 ~0 f, ~) P$ B   else
( z* [) a, J# f& Z; _. \9 T& O   link[i].nextp=i+1;
4 C/ \) n+ [" j+ ?0 l5 e( w  link[i].number=i;
  ]' t0 m1 S' z1 |}2 ^# A6 O( j$ Z- x4 ?1 I- R, Z1 q* b
printf("\n");( J* D6 g3 |: M, ]4 f6 m9 M
count=0;
2 n( N; _. G+ m' q: vh=M;' @1 f% Y( l% \6 \+ I: }, g
printf("依次退出的猴子: \n");
! S+ D6 d0 _9 }, W7 twhile(count<M-1)1 W/ ]0 n' d! {' ^; {
{i=0;
. \# w6 U# F: [4 Lwhile(i!=3)" H6 h# R* o5 O0 ?/ B
{ h=link[h].nextp;: |' j2 z; \/ K) r) a! e
   if(link[h].number)
7 P- [, c( j  H' e; _$ {& |% V' {) B     i++;}
  W- ?) v3 \+ t; R0 `' E6 o9 u# N; R( }# v% T8 K2 H' Q
printf("%4d",link[h].number);% S" O0 b# d" ?
link[h].number=0;& r: N! Z  \+ H+ J$ k
count++;
+ w( j0 W7 n! q}
9 F3 g* }  g3 S7 v1 ^9 N& U; K+ \; b
& Q( \0 u( l2 Y$ W& X5 }4 C& U9 wprintf("\n大王是:");  E9 _* B$ Z6 d; z. @
  for(i=1;i<=M;i++)* V# L4 Z3 c3 t, T
  if(link[i].number)
4 O$ v, P6 J2 M6 k" Q5 ~' E+ J    printf("%3d\n",link[i].number);
5 u! J* E( C( e& F
9 @9 E5 z2 b2 Z& X+ \0 a. I/ E: H  u
4 X# M! Z* u$ |. d6 \# n}
' L  j' l1 m  ~- v- c8 V
第三种是普通方法for循环
- Z, y& k) O! i  b; `9 j- z4 c3 w' b6 g
#include<stdio.h>
4 a& [+ ]3 _7 ^& ?! A% Mvoid main()
4 F  J5 ~- m& v3 t8 `0 D5 a1 g* |+ |{ int i,k,m,n,num[50],q,*p;
5 [8 C+ k) d# Q  k* n) M+ J    clrscr();
. e3 g+ J, A3 [; w; y5 l) ?   printf("input number of person: n=");
! G% F. ^- M2 y2 g* i8 D$ J    scanf("%d",&n);
6 X* O5 _+ w5 Aprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
  `3 z& r9 ~! N: Q$ S! x$ ]* G4 i    scanf("%d",&q);/ Y: {7 h. k: p# X: {; r
   p=num;2 N; K9 p* t, E+ u. h" Z# d
  for(i=0;i<n;i++)
6 }+ B$ Y: Z8 x" M    *(p+i)=i+1;
" K6 b+ A! H7 _" z   i=0;" |- z) y. B, M% t
   k=0;
/ l+ l7 g9 D( J" D: y/ z$ `' u8 I   m=0;
; D9 L; r2 Q2 {& @  while(m<n-1)
& L" j! s: L- L$ ^   {if(*(p+i)!=0) k++;+ Y6 [3 r+ V0 b
     if(k==q)
9 x% t# k  }$ F( s: l      { *(p+i)=0;
3 X, }: A' l+ l( r  F% ~0 O        k=0;$ f4 Q" ^' ~$ E) D. L: ^' T5 }0 W
        m++;
4 J5 C: m9 ?# Z: Y0 b7 K! L1 \      }) W  I/ v' A' M+ n9 c5 [: B
    i++;
" R/ F& l) c" }- |2 b    if(i==n)i=0;/ E+ x( e3 d) {: t. L( U% ?' p$ ?& [
   }
" }) V' X! f; U* C  while(*p==0)p++;
7 u6 t& o  x( i5 l7 p/ Z8 G' I* i7 ^    printf("The last one is NO:%d\n",*p);, p6 ^6 t9 v7 _1 A* a
     getch();
  P( @8 o! H* \9 W! ]8 e+ q8 f# G2 |/ x  S, x. _+ o
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;1 P4 t4 u: K) G. o) q+ B& W& K
namespace 又费马达又费电
2 D! H" O1 e4 @$ M7 Z# N( i# b, [{9 g1 b/ e9 }4 O. f8 T7 l
    class Program
4 A2 ?' C6 r# J6 Q1 s0 Y    {
( m+ @! C! m7 o2 w$ Q        static void Main(string[] args)
3 _0 M) p" k9 `5 J! k  d        {& V3 G( R) n/ i6 ?, L
            int m, n;' e6 ^5 T. b6 {
            Console.WriteLine("请输入数组长度");
3 `! K; l. M0 I! e            m = int.Parse(Console.ReadLine());//m为数组的大小
+ k2 P/ h- a7 i4 l1 D            Console.WriteLine("请输入要截取数字的大小");  t0 |/ a$ C& [& Y) ?7 M
            n = int.Parse(Console.ReadLine());5 D4 Z. x- M, |; j4 N3 X5 {/ I
            int [] numw=new int
8 Z/ n, L  P4 W. u  M& H& T6 u7 h# n9 D9 R; R5 \1 c) e, @
&shy;&shy;&shy;;, ?) a) U; C; @4 V
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
4 k: |* V- a3 _1 W            {
( o: C3 @# u3 S1 w9 N& y$ T                numw[j - 1] = j;2 W' K( O% G! X5 R
            }+ |" a5 m& [5 p) V/ `+ M8 ?
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
! o( G( `" z* u+ k' B$ s$ A            while (d != m - 1)1 N+ V" h  _: B
            {& f$ Z( O  A" z! j, G* ^4 D4 K
                if (i == m && d != m - 1)* o. I3 J) M, S* z. n
                {
& L! J% O& v; d& q                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
; T& ]; D/ k/ @/ t& J                    continue;, H/ C% `2 T+ B5 [+ n, j
                }9 }! w: [2 ]7 A$ J6 ^
                else
1 V, k6 W; x3 y, j                {
: N6 H5 _( |2 Q                    if (numw[i] != 0)
  ?2 ]/ l/ v+ f/ M                    {
: |2 l3 m: n# e# }8 p% {2 {                        i++;6 H( A# V# Z$ `% i
                        k++;" `2 X$ M/ G! x8 z
                        if (k == n)( w( a) R7 a4 q+ O* j1 x& G
                        {
$ h& x, i9 q7 E4 ]5 h                            numw[i - 1] = 0;//把在n位置数组元素的值改变了/ R. O. t. I: W# S" G
                            k = 0;
  `$ L& v3 v! R, V; ?, z3 t              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
9 I1 R1 n" X. D( P4 X                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
$ E( k$ X) W' k2 s+ r, G' |2 v6 V                        }
+ C6 x$ g9 f+ o( S$ w$ m5 a                        else//输出暂时还没有改变数组元素的值
3 y% P  ~5 H4 {3 @) ]                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
7 t& k* I; m" F* z                    }. }9 U# O2 u# I/ ~: a
                    else- e" B& Y8 T# T7 s  c5 |
                        i++;//数组元素为0,直接跳过,不计数。。。
1 L# P: {9 ^% X# }4 {                }, b' O' l; S$ r9 A2 F+ M
+ E& t9 N$ D, t( ~" ]
. U& j) @$ ?$ v& q4 r, J9 G9 y
            }//结束while循环0 l* l4 x- q, ~+ c) X) ]2 R
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
3 K! S2 o) }2 _' n. O' N) k           
  ~: |) f8 }5 h* L- z9 _. ?0 M                if (numw[i] != 0)$ ~' V$ U% U! w* A+ T7 ]
                    Console.WriteLine(numw[i]);
$ @# u/ H6 m; Z) R& @           
- B9 Q( C- z& A! ^- |% E            Console.ReadLine();
- R/ _* `) m6 X7 b6 ^8 P% c' T& P        }+ c6 @7 Z% v/ |
    }# s/ ?4 [; q# e  v3 v
}4 i0 c) j% G( \' |
小甲鱼最新课程 -> 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-15 10:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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