鱼C论坛

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

猴子问题

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

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

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

x
大家好!. X1 {6 L9 p) q
这几天我在忙着编一个问题,我用了一种方法编出来!
* F7 `; G, j4 J8 L; T6 ~% ~7 U但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!& |) a/ c. X, v3 Z) O* d; E
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 8 a- i6 N- c; S( o, ^
( T3 f( b' e" l* K

5 b8 ^3 M$ i; I7 u
                            题目
- z) e2 R  z3 N山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。. b2 X; N0 K! O; u7 r
第一种方法:利用循环链表
4 i# o9 s9 n9 I$ u9 j: \3 _' x! I#include<stdio.h>, b$ T3 p5 ]5 M+ h5 S9 V2 B+ f
#include<malloc.h>0 n! S& I% w1 I- ~, R" S" j
#define M 8            //共有8只猴子  |! H3 C7 t; h  x! o
#define N 3            //数到3只时退出第三只
6 {  |% \: }- K1 {8 m% }$ x' o6 Z7 rtypedef struct monkey) a# I* p8 \$ U7 J, k, {2 F
{int number;
& D: M" E7 z  v. s$ W" vint flag;
2 w; ^! s& c5 p2 R1 ~8 lstruct monkey* next;% A+ ^2 \; C6 ^2 |7 l
}MONKEY;
6 v3 X# `" w3 m0 K; Z) _& o6 Ymain()
2 J: R; G# C2 u{ MONKEY *head=NULL,*p,*s;
: ]) o$ T: }# B. K  int i,sum=0,count=0;6 z% v* s9 `4 p8 t( }3 O* g
  clrscr();              //清屏
( l2 Y. y  Y- Q& o  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
+ b; i4 W! Q% s# w4 c" z( n1 y  p->number=1;p->flag=1;1 u0 D. c: ~+ R* W
  p->next=head;, a- B3 I* D: I% S/ T8 J7 v2 `
  head=p;' E$ A. D, q: r" l2 y
  for(i=2;i<=M;i++)
& Y: X/ p4 O% j; @, o0 ~8 F    { s=(MONKEY *)malloc(sizeof(MONKEY));
1 @* }; \5 R5 {/ l" R. y     s->number=i;s->flag=1;
0 g# Q* K0 Y5 b9 U; Z1 {3 U6 a) d     s->next=head;
3 T. W" m2 u5 q# S9 i! L     p->next=s;p=p->next;
; h3 d$ p6 L3 J    }6 I; a& _  t! z% d: ~
    p=head;
* t' R  w# v3 |+ ^- }   for(;;)  }5 Z. D% w4 f
    {if(p->flag==1)
9 m0 C6 d* W+ U, X* r       count++;% z# v$ i* P0 j; X
     if(count==N)0 K: f5 P. |) q% ~
        {p->flag=0;4 V; E$ R; W- X8 B; T4 i+ y
         count=0;
$ A* N. [; }# Y         sum++;}- W) B/ T% ]9 w# z
     if(sum==M-1)" S3 ~* X' D/ ^9 Q0 ~: T, j: a
        break;$ M* s: C8 O; l' q" w
     p=p->next;+ d8 ~2 F( R9 r$ E- r' |
    }
. y& D& R7 M' K- H9 N; O  n    p=* A0 `9 D( u+ [
    head;5 @7 k1 G7 O9 e6 t
    for(i=1;i<=M;i++)
  Q: |% B1 U- }; F0 @; `    { if(p->flag==1)
# @# A. {2 R+ U/ {7 }        printf("\t%d",p->number);
& K) \0 |2 E! [, t( E6 O$ G9 {6 d5 q      p=p->next;4 k0 O% @. @( z6 {/ f8 A
    }
3 {2 x+ b( }* [5 ?  T' n! v- J2 A7 C, B- P7 W3 H( E; X
- ]2 Y, ?& d0 `9 J$ }& A

& |+ Y. `6 ?$ [6 @% y. D}

# D* i6 F* G& s: o' m% ~( C第二种方法:数组
" V7 ^; {4 `' t# E4 [#include<stdio.h>+ f# ~, @8 Q# K% F) G
#define M 8+ F0 v/ e; i1 m3 ^
struct monkey
4 E, f' ^- }- x/ v{int number;
- ^9 I! t; J# A/ }6 t% v+ bint nextp;7 M* _; D& l. N' b# o
}link[M+1];; z* [( C- e+ v" L- j

+ R2 {7 q, V, b3 l" |. j; C5 d0 }void main()
# J0 U5 Q1 S* Y- i3 x{int i,count,h;! H0 G) G( r( s, I# k% |
for(i=1;i<=M;i++)
) R5 N* O  C3 [% p( S! A4 f; J* J{  if(i==M)
6 I( ~/ P2 P* Z   link[i].nextp=1;9 X/ L7 W% r2 C. D
   else
) U$ Q; K. O! X+ A   link[i].nextp=i+1;$ O+ t$ I8 u$ J9 r4 Z. C4 ]* V
  link[i].number=i;
- b- I+ }* p1 b2 l" C+ z4 o}$ G9 t6 t; E( H. W1 W
printf("\n");. k/ e) o  ]/ `, V( [- w0 m% X
count=0;# W4 S9 c$ f  Q7 M/ u# m
h=M;
& I: N1 G+ d, V% g. jprintf("依次退出的猴子: \n");
; e- N5 t' u$ y5 K1 fwhile(count<M-1)
! W8 ?& e. f# o{i=0;
  `# d* O  x0 }. n& |6 rwhile(i!=3)
$ W* I2 |$ L* G. c! I  X! H{ h=link[h].nextp;
* E9 Z% L- N. o) E2 M2 k   if(link[h].number)" i8 d: B1 V4 _2 m
     i++;}
2 ]1 D; {2 l/ ?+ T' b# L
! O. @2 \+ D& G) Z& Lprintf("%4d",link[h].number);5 Z4 u, ?! h: |
link[h].number=0;* J# i( R+ T( _" F2 }
count++;4 {2 @: L2 y$ A" F
}& z0 v$ b% I2 i0 S. f' b9 K

  {+ L* c0 c; ]. M2 p. x* Y. Sprintf("\n大王是:");
3 U4 f( |! P5 i- W0 L  for(i=1;i<=M;i++)5 X6 d9 s0 Y! k2 g
  if(link[i].number)
& J: {6 G1 a( i& z    printf("%3d\n",link[i].number);2 {4 \1 V& S# P! m/ K
. _  N8 x$ [/ U! R2 [$ D+ E4 w

4 c# f3 ?, [" t4 ~  \& B; q}

, H1 K& g1 B; L' g/ h( `第三种是普通方法for循环

( D' M% m2 z: n! P#include<stdio.h>
# I5 v0 f3 {" C& t" C4 S* i" Fvoid main()
+ I: P& t0 U# {{ int i,k,m,n,num[50],q,*p;
6 ]4 V0 {3 w% F; ~# D7 a    clrscr();
/ I% N* _* T/ y( ~8 \0 |7 u   printf("input number of person: n=");
( b- |8 m6 n! u" \: \/ M    scanf("%d",&n);! q4 J8 o2 O0 q, x  f; p$ K
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
/ V" n2 d; F6 _4 ]) p- e  P: u    scanf("%d",&q);
4 R9 P" j6 I; H! P' g   p=num;7 G  |! q' _& j7 I
  for(i=0;i<n;i++)
( C2 Y0 p+ x: T9 y5 U8 b    *(p+i)=i+1;7 k' s+ w) a8 L6 q; ?2 ]
   i=0;
( ~4 Q& Q9 \7 U% B) u! k   k=0;
5 i1 {, T7 ]; X: j1 o   m=0;
1 P- ]( e7 Q$ a: @! R( |  while(m<n-1)1 e  a4 ]. C. z
   {if(*(p+i)!=0) k++;' s8 }1 D1 Z' L' F$ m3 H2 L
     if(k==q)
) k1 h" g. _" ?: b6 J      { *(p+i)=0;
6 Y4 u8 l1 Y7 y. ?        k=0;
4 S- f1 C( M7 f: D! O" M* ]        m++;
8 v2 Q  c) n, E6 u5 o' I      }# G1 j6 y5 e5 Y
    i++;
$ A! m% ]% p6 o5 Q    if(i==n)i=0;
! I4 p9 s' }# z" d3 E$ H" s   }
- W* z4 M! r  c$ ]  while(*p==0)p++;
  k, S# F. w1 T    printf("The last one is NO:%d\n",*p);+ I. s5 Z1 S. o! P9 Z8 l" }
     getch();2 l6 m- m2 u6 i3 U7 F
. f9 \; W8 G$ b1 S+ Z, o6 Y
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
' w) L* i  y+ g$ l* n$ Znamespace 又费马达又费电+ R" t. [. T* [3 H0 ]' x) c
{" r+ p, @. r% m* i7 I% C
    class Program
  Q7 c* X" g( u% I    {' B. ]! u" I8 r7 b/ ?4 f9 H+ y- ~
        static void Main(string[] args)
( x' b! r) j7 O" n+ a        {9 x4 |& A$ W" {1 i
            int m, n;& |/ [+ Y4 m$ @; p& C% M" D
            Console.WriteLine("请输入数组长度");
" c4 v( S, l0 o) V  z$ t            m = int.Parse(Console.ReadLine());//m为数组的大小
6 ^% i$ |- n$ e) e7 H            Console.WriteLine("请输入要截取数字的大小");, z7 N5 h' l: j( M  l
            n = int.Parse(Console.ReadLine());  N# `$ ^' {6 ]+ d5 A6 g1 ?
            int [] numw=new int5 x0 r4 S7 D/ c/ U9 ]

5 K$ a, O1 h( a$ }&shy;&shy;&shy;;
2 U7 n/ x9 ^& h# I. ]5 w& Q  }            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数. |+ e, L# W' `
            {6 z2 {5 E% v9 @  f& f; z
                numw[j - 1] = j;
* G$ s/ q2 b5 @. z# T3 p, l! l            }
6 h) \0 ~8 }) i8 j            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!, o( s8 b* j: q' D
            while (d != m - 1)
1 q6 O4 l( ^$ s& l! E" K; e            {
8 e. X5 J) Q7 k/ \% m1 t3 i                if (i == m && d != m - 1)
/ N2 l2 a8 K3 l8 ^                {
/ A3 i, h- p9 b                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!: I" @# i+ [) {7 L+ N
                    continue;
- Z% L2 ?% Y' Q% h                }7 q  V+ V9 _+ n8 y
                else
+ H4 P, L' b! C2 Q# X+ Y                {1 G, B+ z) t- Y  l8 U# a9 |
                    if (numw[i] != 0)( o( w. ^' C8 K- x( c0 S- E6 j. }
                    {/ H$ N, k0 U* i" G& J
                        i++;
& U8 J2 v) o% d; {" f9 D$ k* m1 R                        k++;
4 ?$ F2 R5 s; M4 R8 C                        if (k == n)7 @, E" I& X3 T, {( M, O" N/ Q; z2 F
                        {5 c) X# A! u: n. q2 t9 K
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了% j% u2 \# k1 P  G# Y1 F
                            k = 0;1 B# ^( i9 D4 l
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小15 \& D* Y" r! n% Z$ U; o, @
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);. h  e1 O( I$ w) G
                        }
, h# |$ Q9 h' B# k' `                        else//输出暂时还没有改变数组元素的值; g7 O. R0 K: J* z% c8 M, @
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);5 U4 M5 I! W: S+ |* r) B3 Y7 f
                    }1 b% x# v0 o! u
                    else
, R2 ~5 o, |0 `) a$ \. M                        i++;//数组元素为0,直接跳过,不计数。。。
  z& G7 Z- X7 k1 \0 n  \+ e% A                }
8 J% c/ x. D" k1 H) @4 m, S + K* R& u! L: k3 y) V
8 u7 t1 y' q% F# D: b8 v
            }//结束while循环4 l$ V3 O. w5 [/ K
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦9 T8 U* e7 j' }) S0 z9 o
           
7 Y% C0 `) e/ O9 x. X8 \9 ~; B                if (numw[i] != 0)1 _0 I) J/ I0 Y: P
                    Console.WriteLine(numw[i]);# f# m% w# I( t
           1 [/ m4 @3 n2 |+ `9 P1 }5 l
            Console.ReadLine();
- \0 A0 q% h) i1 [: \8 G! ?# `, v        }' V# t8 P! B& `. _3 J
    }, N' Q/ x$ c, ~" B1 o9 [9 n: _
}' }, u" H) @3 k/ y& m1 G, e! x" K
小甲鱼最新课程 -> 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-3-14 13:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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