鱼C论坛

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

猴子问题

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

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

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

x
大家好!
/ h3 g! y2 f# y, k) g* |0 C/ H& w这几天我在忙着编一个问题,我用了一种方法编出来!& _- l% [; y8 ~3 m+ X, x
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
  Y: y* D: Y* a/ E, M注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
% l1 L8 C- A6 u" E! Y" p1 ~# S3 s" P" [6 s+ E

$ Q5 \+ B; s; A# `) Q5 Q) [* }
                            题目6 j  C* W/ j5 @3 m, e+ o% A
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
8 T; `5 Z# u# d( j' n% D第一种方法:利用循环链表2 p+ C+ C- t- @; S* q( T) s6 U! n4 h
#include<stdio.h>
1 H" G% J6 \' \#include<malloc.h>3 z# x8 r7 j) S4 q
#define M 8            //共有8只猴子
$ U& z) C2 j* J: S& N2 a#define N 3            //数到3只时退出第三只
3 Y, c( J7 L0 dtypedef struct monkey
' `! w1 t6 ~" b2 V% o6 {/ S6 B7 B8 {{int number;* Y- G& K: _9 L  b1 h
int flag;
3 m8 t! y' y7 S/ }- R! V! Cstruct monkey* next;
% n0 |: o6 X, U, `}MONKEY;
8 g* }) v! A5 g0 w$ |9 b- O3 T  I4 mmain()3 P5 W" V4 e: z4 {; n+ B. O
{ MONKEY *head=NULL,*p,*s;' z: g$ s& Q9 Q6 |! I
  int i,sum=0,count=0;
; S- G# s& T+ w  clrscr();              //清屏* j! v5 D$ R, y& F0 v; P
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
  q/ |! p. }! I" o6 {  p->number=1;p->flag=1;
7 ^  g. Q4 c" Y: a* @+ q  X, O  p->next=head;+ [+ z, x# H6 B, {7 J
  head=p;& d, ^1 z% t- u" @. x) {" {
  for(i=2;i<=M;i++)
2 S0 L' Z5 I' K- a    { s=(MONKEY *)malloc(sizeof(MONKEY));
) e4 l$ b5 ?+ M     s->number=i;s->flag=1;0 T* w6 F# V2 C+ t& r
     s->next=head;8 X/ l0 h" t- A* q) s$ q
     p->next=s;p=p->next;
8 W5 Y( u0 d0 f    }" I2 i4 D! g) X+ b) z
    p=head;
6 L0 ~" V; L" ~9 n- M2 ?6 y   for(;;)# z! Y, P. f3 [/ [
    {if(p->flag==1)
( A5 Q. p  k$ r- R* i% m/ K8 B' `7 ^       count++;
/ e! j1 q' G* u) V+ }     if(count==N)( @) O- ?* u* Q
        {p->flag=0;/ Q4 a& H/ K: K8 y9 X3 R2 _, l9 C
         count=0;* M% _$ h% `# e% d! S
         sum++;}
) j0 E$ e4 |( k. X' H; B     if(sum==M-1)
! z! F$ ^( W( C0 a        break;
% c$ b" e1 a! q. ~: t" [' N     p=p->next;
: g* W: J3 _& A) P9 A) `    }. A4 e6 j8 H% l' G: M/ L
    p=
9 T) h$ V5 j5 D4 v8 `    head;
: y3 ^' _; ~/ f- i    for(i=1;i<=M;i++)1 ]/ T$ Y, I* A5 w' Z
    { if(p->flag==1)% f! M9 ~' B, q/ C
        printf("\t%d",p->number);
6 f0 t4 _" T/ r/ D9 L      p=p->next;$ G* J3 X6 v8 a
    }* D, a7 E  l) l* o) V8 K$ |

# t; T! ?: k: ~* F3 [4 v: D; c/ e8 G; I: d2 U/ e. u. ~+ L  ]

: G8 v) I) [/ `0 g}
" b0 N; F4 E# d0 y' q$ H
第二种方法:数组
- u0 l, N0 m' r' l/ W* |! k#include<stdio.h>, Z! o1 R  G, n" i9 q5 M3 N
#define M 8
# z* F9 C& j2 A& [% zstruct monkey
: x# z. l- W. K4 P( W" V! b8 `" B{int number;
! F0 Z7 n' x- F6 H( D5 \/ A3 kint nextp;
2 N: X! `: z7 q: x4 I}link[M+1];9 ]0 Y! \! S5 Y7 e% B$ z. B7 X0 u
$ s/ j, E5 U2 U1 w1 W# H
void main()
; b: L( z3 S1 P' D1 K. D0 |{int i,count,h;
+ f5 s# a! {( c7 g% C% F  k4 Tfor(i=1;i<=M;i++)
2 o9 d  i5 V% l$ p% F{  if(i==M)  d8 ~8 s6 P# F, r+ ^1 V5 E( M
   link[i].nextp=1;1 b2 i8 o/ Q# p6 v5 W
   else
/ {; k' h7 U" Q1 n5 b$ ~, V   link[i].nextp=i+1;: J1 e3 w: G' S# q
  link[i].number=i;" I6 W2 ]" s' P( [2 M( o  r
}
8 `/ a: a7 u4 a% h9 r- Tprintf("\n");
4 K+ k! B( T: ?& acount=0;$ I3 Y' W! }& ^8 j9 l
h=M;" |9 |3 ?* M8 I4 v! m  z& O3 s
printf("依次退出的猴子: \n");
9 ~  @  _. c9 C/ s5 \  iwhile(count<M-1)5 \2 k+ X, M( r* ]
{i=0;
% X/ D, b  @/ C: d0 rwhile(i!=3)
# w- C: [  T- S{ h=link[h].nextp;# n! a0 O5 y/ |) |$ Y
   if(link[h].number)4 ?) c: w0 N* x) j  S
     i++;}! U+ ^1 V) l* r8 @0 s- ^$ Z

  C6 h' Y" F, Z3 Z9 eprintf("%4d",link[h].number);
/ L- U* v* V: t& v5 N+ W' Alink[h].number=0;
9 h0 G5 X: U5 G' E% N9 Ccount++;
$ c+ w5 T7 o! e5 {}
  v* B+ L3 _  @4 L* Y$ t5 r( l
printf("\n大王是:");
9 R* {9 u- {5 j, ~  for(i=1;i<=M;i++)
5 f2 `2 D+ G! D! J$ m  if(link[i].number)! X/ {# U" k$ H" l2 P9 u
    printf("%3d\n",link[i].number);& Z/ x3 X* A( W* ^5 {7 L  g7 G
* R  Z5 v9 p2 q' f0 m

4 I$ i& ~" [3 x: u* Y7 i  U- o/ [}
* @3 K9 E6 C0 g6 l
第三种是普通方法for循环

; f' [7 y3 y7 n#include<stdio.h>
# o/ D& n( T& pvoid main()
. Z1 _, _( g) U5 ]{ int i,k,m,n,num[50],q,*p;& @. s. E  D& K& d2 K' @6 `/ ^; |
    clrscr();
. H" d( P) D7 h" y9 V   printf("input number of person: n=");
# n, b6 W- w& t) T    scanf("%d",&n);
3 X, \0 L( Z6 \) F% i. a) Sprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只+ S9 J' @: j- ]) l. L. T) _9 l- g
    scanf("%d",&q);- |4 B# y& Q9 z6 w( Q- I% b
   p=num;$ L5 O# f% p( H6 `
  for(i=0;i<n;i++)
* l3 f: Z" B* ~/ s    *(p+i)=i+1;2 }; v+ c6 A' k+ J( T) b0 E
   i=0;* q+ i6 C! {, S+ U$ \+ E
   k=0;
; @" k0 N# c9 X3 n6 D- Q   m=0;) \2 ?( @: U1 Z9 V0 B5 \
  while(m<n-1)
2 v- |  r+ \- N4 Z% H4 c) k. N   {if(*(p+i)!=0) k++;- I1 t# C1 p4 ~" r. w8 R' a, d
     if(k==q)
) P, c, e7 e: [      { *(p+i)=0;
  v" B# G1 ^6 H& D5 J$ A        k=0;
9 G5 w" c  j6 H& C  S4 s  E5 V( t        m++;! J: K' I" }+ E9 g. l
      }
% k' j( x5 B$ f$ y- h) y4 }    i++;: \0 e$ E. Q7 L" c7 i5 B% b8 v; m8 H
    if(i==n)i=0;  C% k8 S* p' y% W$ C+ @
   }
# Y$ E" ~1 ?( H% n: m  while(*p==0)p++;
6 F. G: }8 L4 C' e% g    printf("The last one is NO:%d\n",*p);
) o5 k! ~7 h3 E2 ~% g     getch();
. `$ `7 H, u/ S/ S9 i8 i- N  |! \5 r0 N. L4 ]/ `) `3 q
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;( R) d5 H% y. x& ^0 T% m
namespace 又费马达又费电# v3 O6 m6 N3 x( _* h
{3 O; A- W. P2 \7 ~) M2 q
    class Program; D) X3 w0 u) |+ I& s. u" j  u, K
    {
! G$ _) F- M  A% E        static void Main(string[] args)
! J& ~3 x: w! Y& B        {
- |; _, g+ X4 C# a8 E7 }            int m, n;
0 R9 @! w: a, B/ x: o9 @4 ~            Console.WriteLine("请输入数组长度");( U" M  U" Z, H; t$ L" }$ s! u$ u0 j
            m = int.Parse(Console.ReadLine());//m为数组的大小
5 L0 t' M! A8 r' d* M. I            Console.WriteLine("请输入要截取数字的大小");5 e% s. B7 r" Q6 ?& W
            n = int.Parse(Console.ReadLine());/ _5 l, p& Z, C7 y
            int [] numw=new int0 E0 y2 d, ~/ x" q. n

9 |6 a0 \4 l# e+ d5 {&shy;&shy;&shy;;, A1 V0 a$ Q0 W1 s; v) N. F3 b) h
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
! a. g  P; k7 @/ _/ n            {
4 x  B! ?; ^7 s: b3 r4 q                numw[j - 1] = j;/ a$ b" R( G1 t. N1 T0 [
            }* e' \/ i" ~& h
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
# r3 s, ]$ h# ^1 A            while (d != m - 1)
! C: c4 V0 N9 k9 R0 R5 V- n            {
% W: _6 b7 [1 M7 s2 P( l                if (i == m && d != m - 1)
% e( H  t$ }( m' X* Y                {/ r" g! C$ j% w6 I. ]6 S
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!, }6 Z/ R2 z% G7 T0 }5 z% X0 I4 i
                    continue;, g; w/ z& y' P, X/ x
                }# w" \. \$ L4 {' C7 d( Y) F
                else$ o) F2 T- k5 c; g; Q. Z/ E9 }
                {
( T  {! q+ T/ o: b, e  o                    if (numw[i] != 0)) C+ \7 O% x* i  `; o
                    {
% n& C, M3 ?% @# x& C                        i++;
5 Z, v  q$ ^1 X& S                        k++;
  M2 `- x2 s( O$ O! _                        if (k == n)
. Y2 p; l, q1 R( \3 h                        {
& K' g. Z- e7 f0 U                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
0 z# V# p4 ~( y$ `9 d4 Q& e                            k = 0;
6 M, R7 O. h5 V' q( B; g              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小10 \  o8 L1 x; c; d4 u; M
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);/ ?% g; C; q: W
                        }
% @2 _8 O. k/ @* G$ J0 e1 Y                        else//输出暂时还没有改变数组元素的值! j: F( Z  X, O) }0 V" G9 @& _! b
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);/ E$ Z1 p- K, C) V
                    }/ v# N  [: Q; d  ^
                    else! n8 y4 t! w) o* b* \
                        i++;//数组元素为0,直接跳过,不计数。。。$ W% E8 _# F5 x. f
                }
3 d- a: C1 q6 {# F6 x2 c( l6 D
8 P# W0 f% m" j7 u, {  q  A( w7 Z1 U$ L5 P
            }//结束while循环! c7 k/ h+ P7 U1 h4 g0 ]/ q
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
5 K7 ]2 V0 y" c; D, @" z           
: [  C+ N2 \- ?2 O. D2 `  i                if (numw[i] != 0)5 z# s  O' N. R" v% e( [
                    Console.WriteLine(numw[i]);
0 v1 ?/ c% G4 W$ B5 }. h6 X           
9 Z% g( D/ E) o            Console.ReadLine();
0 V' S' ~$ S: P        }
+ e; N6 W+ G2 l" @% S    }0 J+ v: |4 _, j1 y0 B, H$ w/ B
}* F4 M. u6 a, G' F  ]  r
小甲鱼最新课程 -> 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-7 02:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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