鱼C论坛

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

猴子问题

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

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

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

x
大家好!
6 _& j7 W: R7 x. a+ P- L. |这几天我在忙着编一个问题,我用了一种方法编出来!
0 K7 j$ F4 X% K但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
6 h! M" t: g4 W- b7 S7 X注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
0 Y. w. `6 R# L0 |/ I8 |. u! Z' e. W% w; Y/ N: z3 X, O

% \2 b% @: B9 p
                            题目' W5 [! H0 A% C5 a; Q
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。# {, Z1 t; q3 ]7 L. M( ^7 s
第一种方法:利用循环链表
* \/ x. I8 w3 r& ^#include<stdio.h>
2 ^, V  C7 J5 P" _#include<malloc.h>
! n) C7 I9 T4 _2 n3 R8 ^" K#define M 8            //共有8只猴子
5 P: F+ r/ i' h+ a* w0 ~* t: p$ x#define N 3            //数到3只时退出第三只
& ?6 A' U6 P7 P4 N# \typedef struct monkey
% u' S/ Q2 i$ v% H1 R) B{int number;
- Q9 R8 g0 E. e" n/ ?" ?3 Lint flag;' X3 F! Y" O& q) I. I2 y
struct monkey* next;
3 L5 @( N) l, {6 ?  t) H}MONKEY;* w, }  h: ^* I! d; ]% b
main(), z: G+ d+ m5 W8 d' w( R
{ MONKEY *head=NULL,*p,*s;8 W  ]" W7 n$ d% d4 l- s( i
  int i,sum=0,count=0;
$ t8 m* c" M7 d  clrscr();              //清屏9 B' {5 N& `$ z# m8 a9 O, f; T
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
4 ]$ i. b& J6 g* y" R% e7 w  p->number=1;p->flag=1;
8 {. |, c4 H) o1 U/ s3 p2 K  p->next=head;
! ?5 `& J. S; v! W  head=p;
9 e# x7 D7 r3 T. T# Q4 A  for(i=2;i<=M;i++)
& j5 _( B( y+ a* A1 }# U5 R8 y    { s=(MONKEY *)malloc(sizeof(MONKEY));7 p9 g, p, `; w/ }1 {
     s->number=i;s->flag=1;' m* u7 n8 T, W3 D# t4 v/ R8 Q$ q
     s->next=head;
/ P6 c4 O& y  I2 Q$ N+ i     p->next=s;p=p->next;
9 G6 Z* W+ j6 L( C; G    }/ X6 N7 }! f2 j$ ?* t: b  |
    p=head;
% b6 K/ s, h& w9 h   for(;;)6 H  R. e* `  p. ]: }5 G3 F. t
    {if(p->flag==1)1 ^9 y: x) Z! ^( O% y
       count++;
: @$ s* ~5 K. N6 y* O. t- _$ E     if(count==N)& u! q9 ]% p& b) ]" R: V
        {p->flag=0;
1 g& D/ r5 m+ j         count=0;7 e" h+ B3 r/ m3 z1 b
         sum++;}5 m: [2 N' `) L2 `  b" s/ b2 K
     if(sum==M-1)
7 v1 z, j: E( C& [# J( r: N5 c        break;
+ Z4 \# d  G8 Z" E7 T( F     p=p->next;% V3 @3 z, Y4 c( O) Y% L% F
    }$ ^8 }( l( r: x* u4 o
    p=
8 |8 N1 g2 |# ?( b; ]    head;6 @- _& ?& b% J  \* r
    for(i=1;i<=M;i++)& G9 F  R- \4 w  \
    { if(p->flag==1)
, a4 O; N6 F5 @" Q6 Z- ^        printf("\t%d",p->number);. t4 J) L7 w  A9 m2 e: l
      p=p->next;
$ R& T" ^8 ~2 ~8 z" q7 F    }
5 W( R2 g: p6 v* k" H2 [  g1 C+ v3 E3 r* p
3 r: i3 S. o7 S* v

/ R/ Z; E# L( S: f; G}
( j/ v3 c, ?/ m( u4 a+ `$ t
第二种方法:数组0 M" z7 y3 U: k4 U: J  D
#include<stdio.h>
  t! a7 B9 H0 s( d) i! s' |#define M 8
% _" k6 `8 o2 T8 Kstruct monkey
4 ~. ]7 S) L9 d' I' H{int number;7 F* i( K. [; ~; x. N7 w9 D
int nextp;  }! Q3 }! J* ~) f) i
}link[M+1];
) F9 ^5 X9 p2 M6 V9 o9 |
( W) N8 N, t5 Yvoid main()8 t2 F7 s  }$ ]  @. O
{int i,count,h;- c! S! f. S2 f7 k, P$ F
for(i=1;i<=M;i++)  z1 E9 v$ ?7 Y4 O7 A3 L9 w
{  if(i==M)
" [; w/ Y$ i2 M2 V   link[i].nextp=1;, h2 a$ I( m6 M6 z/ s. A
   else6 [) X* W) w7 i4 \1 Q
   link[i].nextp=i+1;
' g6 B. k" _# d5 l3 x  link[i].number=i;# X6 ^+ _0 f0 S% Y, v) g  ^& S
}
5 Q  W3 K7 V8 V( fprintf("\n");! T6 h$ w. L3 j5 Y2 |
count=0;
( K# i) ]+ k0 ?( p& U5 W% C0 Oh=M;" P; ?2 w- @" i$ ~, z1 U6 ^
printf("依次退出的猴子: \n");7 s# {7 ?1 y/ K" [
while(count<M-1)
0 I) i8 ?3 N0 r  I{i=0;! H% V: v5 y3 M: z
while(i!=3)/ ]! `9 `% ^$ i3 Z
{ h=link[h].nextp;. h' A6 j# H- b* ]3 a
   if(link[h].number)
# |+ }1 m+ ~9 u7 [7 H8 {; _     i++;}% J2 G  @$ L+ W+ j& t

! I; s; _$ q+ M5 F8 `, m' iprintf("%4d",link[h].number);  L( G7 M# B+ Z5 u" R" D) _
link[h].number=0;
- i: G+ ]5 D* A; p7 Mcount++;
/ |+ Z  b( }* l& [4 p# n}
( _8 Q1 w: w1 i( E; W
2 w$ h: v" o3 t/ ?* `. N' mprintf("\n大王是:");
7 ~; m. D5 I' y& J  for(i=1;i<=M;i++)
) r  @9 ]- r6 v! F$ {: }5 e3 ~  if(link[i].number)* F0 E- B" W, {6 K' V
    printf("%3d\n",link[i].number);
0 J4 ?* a: q: ]( J, A9 H) G2 [9 s4 f
7 d4 v& O3 L6 `" Z" \- `- ]: \' T  B; H$ n0 k
}
& x' L  J; l3 B) y/ u% y5 A) _
第三种是普通方法for循环

9 Q/ r& b# d) n" i#include<stdio.h>5 O$ r2 D3 H, @; I
void main(), E% q2 X: q: N( s5 H  j  s
{ int i,k,m,n,num[50],q,*p;
1 P: ]( t" j" a" J6 T    clrscr();
6 ^+ K* w% y. r+ s7 |' X( a   printf("input number of person: n=");# P1 A9 R' v8 N' b: w1 s1 h3 Q8 \4 p$ d
    scanf("%d",&n);# ]. P. v# y$ g5 S6 L3 t
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只5 t) \6 _3 ]5 T
    scanf("%d",&q);
/ p( s5 a  S- Y' ^+ I   p=num;0 }  K+ q0 ?8 f  k5 H
  for(i=0;i<n;i++)- e3 @; y2 F! C
    *(p+i)=i+1;7 |" T4 ]4 |. J, A2 {
   i=0;0 U, l5 a( X: f7 I, m) Q2 }3 j: f
   k=0;
4 X5 k& d1 C) u3 L" N: ]   m=0;) x' D3 U. t, ~) I
  while(m<n-1)
( k) X6 F7 R4 y8 R) t   {if(*(p+i)!=0) k++;. X. i) W3 q3 s! J% t3 k/ Z
     if(k==q)5 }0 O9 K2 v3 E' `' f
      { *(p+i)=0;7 a7 Z. `$ ?* q1 E; y
        k=0;
; r/ Q/ D, N8 X! F1 n$ P        m++;; B; D2 H1 N3 K7 z4 V0 d  K) _
      }
: w" C7 W" `/ c, u/ G    i++;# x9 _$ I$ I) s8 W* K
    if(i==n)i=0;
/ g6 m$ c+ i. Z   }
. w7 J; A6 z# F8 P' J; |  [" }  while(*p==0)p++;
+ N/ P, {) K! e3 g    printf("The last one is NO:%d\n",*p);. E9 ~- r* y8 g2 G9 n( L& u/ p7 }
     getch();
' M' G5 M" _+ L% h  b
: m" o3 @; w9 u* `% y) \}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
/ H1 k% @1 i! S: `1 dnamespace 又费马达又费电; ?  i# R7 K6 j' {, D" y0 D
{2 }3 z% ~8 L% m8 J; M$ [
    class Program
6 \# W& T" e) S+ b; A! |    {
2 G) h9 N- l+ y% @, f% H, i$ g/ I9 z        static void Main(string[] args)
8 |+ k( W3 P! \8 a$ z! C" H        {
$ p, @7 d8 `* t/ E: e/ S6 H# v            int m, n;
2 V  N% G) h! r7 M) T4 v            Console.WriteLine("请输入数组长度");- h1 W( E7 |/ a9 V: A2 M0 C1 [  j
            m = int.Parse(Console.ReadLine());//m为数组的大小
& V5 N& p# H; O* o            Console.WriteLine("请输入要截取数字的大小");, b. ^# ?8 L7 J0 X
            n = int.Parse(Console.ReadLine());
: d" u+ M2 K5 d7 E            int [] numw=new int
! H; C* a2 [9 N* j' e/ h. u, ?; F
&shy;&shy;&shy;;! A, y; ~! C9 V" a. k. S
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
/ m  ~4 r( d% c! j% b            {; M% P' B; K& S+ V
                numw[j - 1] = j;! r" o2 W5 n4 ?$ L! `  Q; O
            }! J3 M+ @5 ]  P' t& u4 a. S
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
! y$ I9 @+ k" ?6 e1 _. M, }            while (d != m - 1)
& s5 u, L) T' I* y* O            {
; z0 d# D9 G( Y  R% Z" M& i                if (i == m && d != m - 1)
0 K& x, d" E) o" r9 U5 Q. [                {
. f0 f5 Y2 Y& m3 B                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!9 [, ]6 \4 c$ H8 M9 k
                    continue;, }6 ^' @! O8 `4 x- `0 q# d  x
                }
+ H) }! v. }( r" z( Q                else
7 s4 J; }3 {4 L2 p5 e                {
  R5 c- \  F/ S2 Y9 G                    if (numw[i] != 0). a0 f4 [! v$ @, i% N$ z: v
                    {/ B% C7 k! v: M0 O; o6 L9 o& f
                        i++;
" p1 d+ T$ @! q4 E                        k++;# x2 X$ M0 u$ R. }8 j6 Y
                        if (k == n). @: J7 t7 ~  [) a& x
                        {/ f& W1 f* O  g: p! ^
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了2 P9 D9 |" ?) d  w2 V$ }
                            k = 0;
% v+ L  D0 X3 U; q2 g1 ^! ^              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
% e; K8 v; I! E$ V0 \7 J) f                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
, E1 V# i4 z3 U                        }
* v5 H4 F( K( Y8 X/ w' K, G1 L                        else//输出暂时还没有改变数组元素的值( r# {/ R! c" k9 B7 \1 P
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);' b4 [( v* U0 k6 c* v
                    }5 b- B; Y, ~$ O( z5 C' L# a
                    else8 x& Z/ c- t1 b; l' ~5 h
                        i++;//数组元素为0,直接跳过,不计数。。。
: m" a4 ~. h4 R% m+ m2 i- @                }/ [4 |4 C& a' F; Q+ {; }

1 ]$ R% X' y( X: ]' k( w4 _7 G  @0 a. L2 _/ ~7 N# [9 V8 C2 d
            }//结束while循环8 Y& S7 m: ^% l0 ?3 V% o- Y
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦# H2 l7 f! R! U$ H
           * G& A6 ]5 u7 I7 Q; x3 w# O
                if (numw[i] != 0)
# W  g* V: N8 V5 R                    Console.WriteLine(numw[i]);
0 V4 A- N$ t8 F( H, r           . V; R" {4 y! _2 H: f! b- I3 f
            Console.ReadLine();0 l8 i# I7 V" h3 z3 m+ p
        }
  F: \7 Z  ?, P" K  y, l    }
+ ^  Q6 ?; E) ~) j2 O. o}
  P6 u8 `3 t$ ?
小甲鱼最新课程 -> 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-22 18:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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