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

猴子问题

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

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

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

×
大家好!% e: W! A/ n- U; F9 E
这几天我在忙着编一个问题,我用了一种方法编出来!% S1 ~, e9 @% r
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!  m% S5 [3 m4 P# [
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
8 p3 L/ w5 a3 T0 A6 j/ ^- \  W7 u
/ {9 ]* ^2 z7 b) Y6 |+ k  w, Q- T7 R8 B
                            题目
5 F+ s0 j1 U. e. O+ g, }山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
  A- s4 Z6 G# j, Q; p4 j第一种方法:利用循环链表  E& y: D% h$ O
#include<stdio.h>4 Z8 Y( J1 M) N) L
#include<malloc.h>
  C' l* [9 T9 x5 \4 k#define M 8            //共有8只猴子$ \* E: @4 Y/ D  H! M+ ~: A( x( _
#define N 3            //数到3只时退出第三只9 D+ U* Y& P% ~8 K
typedef struct monkey* h; |0 I3 j4 [
{int number;( ^6 z) ]" \" z1 }
int flag;! _& Z, w: \4 c  s0 c
struct monkey* next;: ]# g/ Y. X! G  p$ G
}MONKEY;2 r; o: ]: o1 U  Z1 M3 f9 D) I% r
main()
" }2 O, m2 Y1 j% B$ y' S  g! P{ MONKEY *head=NULL,*p,*s;6 _9 `2 S% D1 y( U4 [/ |* ^/ C
  int i,sum=0,count=0;
+ U2 J5 S' l# x% g* l- n  clrscr();              //清屏$ Z$ d$ t% r( N; s% r" S! X" c
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存5 e% s! Y% ]% Q
  p->number=1;p->flag=1;
6 ^( c8 v% F' X9 z; u  p->next=head;1 w; m8 {& J$ m
  head=p;& P8 J7 k8 `+ f+ \
  for(i=2;i<=M;i++)
' e& e$ b8 L+ S- y. a    { s=(MONKEY *)malloc(sizeof(MONKEY));
, m  }2 q- Q$ V0 ]     s->number=i;s->flag=1;! v+ L  z5 `8 ]' E; n9 K
     s->next=head;5 ~4 s  Q; w$ u; [$ W- M, N
     p->next=s;p=p->next;, j6 v, w1 l) j* F# [
    }! n" }  D6 C& F* g2 u
    p=head;  @# I; D- a6 \' R& S' \) k
   for(;;)
% z/ c# I$ v8 r9 n    {if(p->flag==1)
4 n+ ?9 x' F% ?" H! u       count++;
4 v# O" D' V' }1 _$ [     if(count==N)/ X2 y% L. D8 _  B# Z$ l
        {p->flag=0;
' E+ @4 U$ B7 l         count=0;( A" m% h' \% W- O
         sum++;}
5 d  Z1 j# a1 ~6 p$ M     if(sum==M-1)
& U4 `! n4 D% T- f8 F) [        break;
& f4 f' W$ b9 j* e/ H% K6 W8 i     p=p->next;
  O' E) Y9 O: N$ Z8 l    }1 R2 l& r" l' K1 Y' W" z5 O% q
    p=# k/ @8 n2 m! S
    head;
( j! u7 g: s  h    for(i=1;i<=M;i++)
( R0 X: Q7 V/ U& f    { if(p->flag==1)! ^" t% N! M9 U) Z
        printf("\t%d",p->number);/ `3 J6 N) D: `
      p=p->next;5 m1 ?  u) z6 _4 a; C
    }
1 }, e" @7 L# Q" G( }9 S( t: b
% P' l! @  y) b$ m. W
3 v1 p2 X! g+ H: B3 M8 Q9 n: F. ^6 D0 f$ L; M  Z$ u- x" J( L
}

) \, o+ G! a  G( h第二种方法:数组
8 i" g7 W8 {$ r4 `#include<stdio.h>5 R+ G0 J" D$ l4 \9 F0 x
#define M 8. q% a+ }3 N# ?1 I; K
struct monkey
% M, D- _, k/ B5 c{int number;
, B0 m, n% K  g3 e) \int nextp;
, {% c* Q) H7 s6 ]! @1 T6 E5 I5 i}link[M+1];0 y( ^8 G" ]/ I1 S

: R6 c. i5 j' l$ P( U+ |void main()
4 O* f* j5 W5 d. [( k$ [{int i,count,h;
2 U0 w$ D7 J4 Kfor(i=1;i<=M;i++)
! j7 T. Z2 R1 s0 L{  if(i==M)( n+ D3 b- a2 p$ R' Z
   link.nextp=1;
7 R% I- ?3 B2 E& _9 C% z: L& e7 M   else5 z/ k$ d# c- g% R
   link.nextp=i+1;  s* q$ [* t: ]7 M+ A, A
  link.number=i;$ |; L2 B$ y4 ?9 F8 p7 \2 R
}
; c2 E, M6 C, Lprintf("\n");1 G& F$ O) _6 H9 P
count=0;) x# }9 `& s7 T% U5 H8 x
h=M;
" p+ B- x- v) F' [9 u! B! H) cprintf("依次退出的猴子: \n");5 y8 x) r5 s6 \& W
while(count<M-1)
1 k. R9 B+ ~( z: S{i=0;
) {2 x8 t7 N3 H: ?while(i!=3)  f5 x# A/ r7 y0 ~5 w7 V! I
{ h=link[h].nextp;) g3 n( j( C- X
   if(link[h].number)$ w8 W: N1 V, w  ?% s( K" E" T
     i++;}7 }* u  c/ m* k# x7 ^! @4 ~

5 H. [( \  d# C4 c$ [printf("%4d",link[h].number);
# T) n% R) S8 N5 n. J: Ylink[h].number=0;/ I0 I3 g6 t. H4 O* A
count++;
' x' C1 l  t, v! y) U, D}, ?' Y: Y4 t& P; }: P* Q

  E. t) d# q6 ]* H, x0 _printf("\n大王是:");& ^% O* x* Z/ e% X( g, B8 {! R
  for(i=1;i<=M;i++)
% W+ C' f# S9 M# L! D6 n  if(link.number)
: C7 {1 R: H* W$ U  A    printf("%3d\n",link.number);
, k, r! x) X2 v  l# k) X4 f8 A5 n; w. D
+ G- I0 {* R& F4 x; E
}
, _9 W4 ?; {" g9 g3 y
第三种是普通方法for循环
/ |$ p7 w4 [& X$ O) z
#include<stdio.h>! P7 p. r, S* ^* d" [9 ?. v8 X& ]2 B
void main()
2 \6 W: d( w, L{ int i,k,m,n,num[50],q,*p;9 T2 Q+ Z/ a" i
    clrscr();
6 i% O( ]) i6 S& Z0 \0 y% q' A' O/ _   printf("input number of person: n=");
: V3 \, r+ q4 o    scanf("%d",&n);3 e0 b7 K, B" u5 `# o3 \
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只& W$ x7 t  k1 W& j* v1 G
    scanf("%d",&q);
4 L* U6 r& J! `2 T   p=num;
9 p% K. [$ q5 W6 \  for(i=0;i<n;i++)
/ o3 h# K4 _2 S  H! f, R    *(p+i)=i+1;: P) n* q  Z3 f  [, h2 Z  s$ K1 l
   i=0;4 {' C0 D' i4 e' r
   k=0;
# f( d+ j2 p3 p& [0 j0 |   m=0;
8 b9 y' \4 z, b+ b9 _' \  while(m<n-1)0 b. H' X  ]* F- [3 S2 r/ W
   {if(*(p+i)!=0) k++;
6 {% A: X$ q% F     if(k==q)( x: J- ~6 ~  `6 F
      { *(p+i)=0;1 X4 ?5 [5 `) \4 |
        k=0;5 Q6 I/ F5 o6 P7 }
        m++;
* q5 N) G& Y0 M7 L      }
$ s; i& h  ?8 P% f- Y/ I    i++;( n0 I; O: J9 \( G
    if(i==n)i=0;- v) y- B, P9 ~+ y
   }% R2 i! N/ [! q( ~( ^% q% {
  while(*p==0)p++;! X/ U: [9 h: Y% ]2 b  @
    printf("The last one is NO:%d\n",*p);
* D: U; C7 x/ Y     getch();
# {' U+ T; {9 @' c. A5 I; e" r; t( y& Q+ \7 p2 y! v  V2 O
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
) W' u% _4 a3 v. v% n8 G4 F/ Inamespace 又费马达又费电/ E% n- O% U7 O/ _& d& }2 R7 g
{
, c3 |) z% T; V    class Program+ V* Q/ B* z1 z) p( |
    {
$ p3 ^9 A- M& m  O0 J) z        static void Main(string[] args)
* g5 @- `/ a2 l! U% K        {/ }1 B5 U9 r# y/ J  K: t
            int m, n;% V3 J& f9 q, F  {; j$ W! R; e
            Console.WriteLine("请输入数组长度");
3 f4 [/ T. \7 C0 I            m = int.Parse(Console.ReadLine());//m为数组的大小+ V# q) {8 r) z
            Console.WriteLine("请输入要截取数字的大小");/ C3 |% @. H2 B/ N( s
            n = int.Parse(Console.ReadLine());
2 ~6 `! K1 A) ~! _            int [] numw=new int: g/ H7 T5 c) `) |; G! D8 {

! V* f; V; h. y4 @&shy;&shy;&shy;;6 i) d( j* ?) H$ ]% V
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
; o- P3 e8 Q9 ~- x4 e$ v8 ]! S, W            {
! G, E" m* X4 }                numw[j - 1] = j;
& j/ |" y$ K4 d' x            }
6 u) V5 o+ |2 g8 j            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
( j& Q( ~4 N' s# N. M3 K            while (d != m - 1)' }% l7 b% X9 A9 M: t$ o$ \
            {, X  M/ J" k- |& S# }) h# v  d
                if (i == m && d != m - 1)$ `( e8 B: Z+ M+ s" u
                {7 D2 z4 z9 E7 `
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!9 R, ~' _. v( w; `+ ?
                    continue;
) W6 Q3 ?: u2 m( d5 ^. }! }# M                }' F  |$ f( F) A$ y: M. j6 X
                else; r( W! d5 u$ _) m" `# T/ k5 C' I# v  i
                {
& ^0 w8 J3 N; C. R- }, r" k( a$ r! n                    if (numw[i] != 0)$ ^2 T( n# v1 J- ?1 ~
                    {7 X( ?. L9 M) }1 }4 c* {& ^2 G- Q: n
                        i++;6 O, J9 b4 D1 B; ^9 l# n; _
                        k++;# `, t6 K8 Y! n" I" ^0 g% \
                        if (k == n)/ \1 C  C0 U6 }
                        {7 }( `* J; u- ]" ^5 }
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
! X) Z1 x) |; @' v1 v$ T) D                            k = 0;; }$ b4 G% A& f8 H* ^
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
/ I6 g3 X2 P. v3 E& n+ L' M                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);) D8 l0 S* X, Z% J6 x" R
                        }
+ W$ \2 x. R  G8 \9 L                        else//输出暂时还没有改变数组元素的值$ Z+ d( L" d9 S. }" p: J2 l
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
6 }: i' ?, W' k. `- [. U                    }
' q# a; ]$ Z7 ]' A                    else
0 S) P' b4 G( D" E* u7 z                        i++;//数组元素为0,直接跳过,不计数。。。6 H0 g: r1 Y/ M5 T- D2 W0 u( r
                }! u0 P4 A/ H1 g' |/ C" J
" E9 x+ ~: U! t- `( ~# U: U

; W/ |& t0 B! j* m            }//结束while循环8 w& P" R5 j3 @, O
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦) J& {2 J! k" E$ m" _; P7 q& _# h
           * C$ F$ o6 O+ j5 E! N
                if (numw[i] != 0)4 N' T. j6 {! D8 O, U3 l! ~
                    Console.WriteLine(numw[i]);
. N0 k# @8 @1 ?7 B           ) @" K$ |+ N2 c$ W/ o3 q
            Console.ReadLine();
6 v  s' D6 s' q. E: _( _        }: B4 S% x8 q8 N% T9 w- U
    }$ {0 ]! `3 a( ^* D' z
}
/ ~" f6 e/ J2 M
小甲鱼最新课程 -> 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-11 13:00

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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