鱼C论坛

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

猴子问题

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

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

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

x
大家好!1 F6 d, P$ U; P& i4 k
这几天我在忙着编一个问题,我用了一种方法编出来!
+ Y( N! n" L5 }7 S/ C# O6 L但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!/ [8 v. h: h$ u1 d1 p; T$ g8 v
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
$ Z7 T) g6 M! S9 h7 @/ u' L+ W" x& o3 r4 Z$ y% u
. N1 ]) M  x2 R2 R% \
                            题目9 L2 V# ~" ~4 \+ Q" D$ D9 N
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。% _+ ^) n( S  }$ G% ]2 P
第一种方法:利用循环链表
: [) ]: c5 d( h6 O#include<stdio.h>/ m6 b# r; ]( R% @  Z+ G, m0 g
#include<malloc.h>
& k: x8 ~9 }+ ^. ^" o  H: x#define M 8            //共有8只猴子
0 e+ B/ }! c) w5 H#define N 3            //数到3只时退出第三只
; o& K  }3 q. O% [0 g( h8 z! Etypedef struct monkey
2 P1 F" `& I- _' I{int number;' [, W" r2 n2 o5 w% X# s; E; o' j
int flag;6 T( U0 H) f& O. z' N) v
struct monkey* next;
/ e* D' Z5 [: u* P/ J  [}MONKEY;
: u: o! C3 S* y) Qmain(); \% C: g. d" _: v0 P
{ MONKEY *head=NULL,*p,*s;
  p( z' H7 R3 u; h0 f7 \  int i,sum=0,count=0;
$ m; H, p! K* C6 \2 r, Q! Q$ U0 A  clrscr();              //清屏) v- I4 n% l5 o5 P8 p6 U( A, r; f
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
4 v. _1 {8 ]3 f2 j- Q  p->number=1;p->flag=1;
8 t: i9 E, D( s  p->next=head;" H3 R0 A3 V0 r5 b: @' [1 u- _
  head=p;
- \' r2 a  w! N2 [9 o  for(i=2;i<=M;i++)
. n) {/ v6 W- x* m, i    { s=(MONKEY *)malloc(sizeof(MONKEY));* z: `4 F' N# ]1 t+ q
     s->number=i;s->flag=1;
4 T/ g- G% a. d6 l1 G9 b$ N( M( _7 w     s->next=head;
2 Z4 U. g6 u) \. {$ A$ H! }4 j. r( l  A     p->next=s;p=p->next;$ A9 o, R) k# S! h; Z0 \, x9 m
    }
: ~* R4 V# p: r3 _1 m! T    p=head;) Z* f8 P3 n" H  v, m& t$ i3 ]
   for(;;)* `- p2 }4 B- G! H& G
    {if(p->flag==1)" n9 S9 ^, w* K6 }) U, V3 R
       count++;- @0 b: ~" D7 H7 P$ i
     if(count==N): l) w4 r6 @! K1 I9 z
        {p->flag=0;/ D# P+ |% w& s# E  p8 n
         count=0;" z, Q- ~# \( ~4 Y9 y5 \2 Y
         sum++;}% `# m- G3 m2 t) E
     if(sum==M-1)
: j, ^/ z, M8 C1 J        break;
" S! U5 k* t7 j  h' c6 a' _3 x     p=p->next;
5 J% G0 P6 V3 @' E4 h) R/ v    }" `9 [" r- _' d+ R. f# K! f
    p=: _6 E, K! c6 ~
    head;0 T6 x  h8 |# }/ }  |
    for(i=1;i<=M;i++)8 r1 g5 t( N* o& D# G
    { if(p->flag==1)& H9 `* I" B  s6 c
        printf("\t%d",p->number);1 e0 s. n; |" s5 c1 Y
      p=p->next;
7 B1 B; A; t: ^5 U    }7 d+ ]" n. y- D( |$ a
- t% H+ `0 R. G+ y& G+ \; n+ s! K" g

3 `$ j2 s7 @# J! g2 b( R4 \/ B0 l7 k- }
}
" v) @) o- s6 K. A8 K
第二种方法:数组
* q+ g: A6 d  C  }0 Z#include<stdio.h>% r) n7 O6 R  _$ T6 G0 I
#define M 8$ ^: V  b# f5 A9 S7 \
struct monkey
$ T" m+ E/ f) j7 w{int number;- m% ]. t1 f- t# Q+ @8 W3 q
int nextp;- w$ ?+ P! g) V7 I% D, f! Y, v7 n
}link[M+1];# B3 }- G% e' R/ S9 x, M2 M# W2 K& {

; X+ O; R, n& D- ]) Ivoid main()
/ f' M6 F" ?! R2 `" M2 m8 I! R{int i,count,h;
7 g& E/ |. q. ^0 v4 B7 m2 E3 efor(i=1;i<=M;i++)
! p  Q/ G: h+ r0 Y( s{  if(i==M)6 [# k, M1 |" o5 }
   link[i].nextp=1;
$ }. [6 y! }, s   else# B1 T4 z& b4 R- a: }% n
   link[i].nextp=i+1;
. Y8 k$ e" M, E  Z% n# C% h6 F" {. V  link[i].number=i;* w# z3 Z- z+ D
}# t& Q& I, u* r6 j! ~( t1 h3 l
printf("\n");
/ h0 i3 W6 y% p8 [  t2 ^count=0;$ Q! q' e( s: p* e0 k: E
h=M;
/ E2 N) a+ I/ X2 [7 Xprintf("依次退出的猴子: \n");4 [/ t5 ~  f( W5 z
while(count<M-1)* v2 W: u& M4 v6 p" |
{i=0;
! `: K2 _& y# b, d3 r- Kwhile(i!=3)0 T, e' Y! U* i4 \" @
{ h=link[h].nextp;) I( c0 x" O  _6 g. w% {3 \
   if(link[h].number)
& j; a! I0 G5 \* z- m% s8 A     i++;}
1 W: p2 X4 K. W9 |3 s. _
9 w; h. ?$ m- Aprintf("%4d",link[h].number);# j4 z8 k7 ~3 D, b. _
link[h].number=0;
& X& Y9 s4 n+ Gcount++;; Q* D' P. S! [. n: t! f
}6 x' y/ f. G6 C. f1 f2 v1 l

% x6 s; Z! O8 V' Jprintf("\n大王是:");
+ c/ [' z% ?3 Z& D  for(i=1;i<=M;i++), h0 r5 X+ ^9 e- Q4 Y- N
  if(link[i].number)
3 D; ^* `4 E" J1 M' _5 M    printf("%3d\n",link[i].number);4 I5 h/ T6 f, o, R' _

% d0 L( C3 A, A& f( N) y9 \' ^: |, r* _! R1 X3 X
}
/ [! x- m/ q8 B* q! V5 ^0 n
第三种是普通方法for循环

/ O7 W1 ]8 c3 Q* g#include<stdio.h>" ]0 [% u( @3 j8 |9 }
void main()4 j+ K2 y" j2 W  s
{ int i,k,m,n,num[50],q,*p;- U8 x7 B$ v& _! ?( W' i
    clrscr();0 O( R; }$ i* q4 r8 f& T, s5 P
   printf("input number of person: n=");) X# @% r8 h! w! Y8 M" O/ _
    scanf("%d",&n);
+ Q+ {+ M" M5 y4 mprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
4 h1 ~( D9 J, r  V    scanf("%d",&q);
  Q0 d& ^, R( |- B   p=num;0 }7 d/ a9 K" ]
  for(i=0;i<n;i++)  h& L) l8 L1 [, d8 U  |9 d, {; D- h/ y( K
    *(p+i)=i+1;# h9 X6 k# [; `$ |! K5 @% [6 e
   i=0;; {7 y9 w+ E) E; j, |5 R
   k=0;
! d3 j  o7 b. r) W   m=0;
4 t# t1 N- ^" W9 O) ^8 s) y  while(m<n-1)6 f, |' ?( H1 r+ }( Y% R! m
   {if(*(p+i)!=0) k++;7 {" ^$ b! J/ [
     if(k==q)
5 n9 Y, U& H3 s% k9 q/ J      { *(p+i)=0;$ S) r. p/ Q: q
        k=0;
3 L. C: @7 _# D        m++;
8 x  N7 @/ n3 \* i  i6 O& x9 T5 Y      }
0 z3 g( V* O* L4 K2 {    i++;  A4 O! ^- X1 v8 X
    if(i==n)i=0;
8 k/ ?: A4 }6 A; l& t" `: n   }
0 G7 r/ k1 K4 I4 V8 p. r6 t  while(*p==0)p++;
+ X: M7 V3 l- F0 N" ^# ^, x    printf("The last one is NO:%d\n",*p);+ r; n5 x2 |8 v5 t. ]
     getch();: B$ P( D) h: _! l% J+ h8 O+ r+ N3 E
# [9 z0 d# O4 J' A+ U, B# W# w' o9 V% R
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
4 e) R2 C) f/ d, L, Pnamespace 又费马达又费电
( d7 `8 m' ^, h; B5 R4 S{
  X5 Y+ ^7 h( |1 U+ u. l    class Program
  k6 j6 W8 ]- [9 i    {9 o3 [# i$ k$ g, K. B
        static void Main(string[] args)1 G5 t; ^9 ~5 p4 ~' E
        {
2 n3 ]4 _- w+ S* d% h; {8 @1 l            int m, n;
0 M8 F& k/ o% V9 U2 N9 D            Console.WriteLine("请输入数组长度");) \3 W! P2 @7 X+ `1 U2 l7 p
            m = int.Parse(Console.ReadLine());//m为数组的大小
* {5 B8 r4 a* u+ G5 i/ X            Console.WriteLine("请输入要截取数字的大小");3 p  {* [  J+ H& @/ R$ {! H& N
            n = int.Parse(Console.ReadLine());: R2 K* V" A2 }7 M" J% E2 s8 f! f# a
            int [] numw=new int
3 y3 t: }( K  }# `" Z* n( [# [- B- ^8 z6 X) g8 V) L( ~# G) E
&shy;&shy;&shy;;
: R( `' G# _! q( I% b6 U            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数4 S: C7 r) n: m; U, Y, H
            {
+ S2 B% c" p6 K. N: A9 W% v                numw[j - 1] = j;
3 |; ?( }9 R8 J( b; T, ?) ^2 [            }
( k8 a. D8 x0 O/ f+ e; s: j+ }            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
1 S4 F4 p5 x5 N8 f            while (d != m - 1)
5 P( d8 h3 |; I! k  F! B; o            {3 V3 J# n4 r0 b: [  c6 u8 t4 ]
                if (i == m && d != m - 1)
- Y! k8 o2 j2 ?7 o* w                {
! t0 R' D1 i& r8 t- `- q                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!3 |0 D3 \! c0 x. p
                    continue;9 f( S3 P3 b3 c2 E/ U
                }& ?0 P; I& @. ~$ b
                else
) W. ?+ v# i9 P$ x! H, p                {
1 Q! K2 e9 A4 G) F' U& t- M                    if (numw[i] != 0)3 j. ?$ j: E  ^) e0 J
                    {
7 p) z: c# k; Y, n2 Q+ N                        i++;. m" O6 g7 o/ \' r7 \' O
                        k++;
) d6 q+ H) }/ h$ r; ?                        if (k == n)
8 V! I2 D4 U6 l% E+ V  H                        {4 [; k' i* e9 \0 u, a# h
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
- r  j- F# @- m                            k = 0;
' }! J& z) O$ c( \              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
, P. b% c$ G7 X                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; W; `; e) g9 q0 }                        }
( Y3 H1 x, J; c9 Y9 d. s                        else//输出暂时还没有改变数组元素的值
1 M% f; l6 s- r* B0 l                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
7 e* m: r* a  m( X, @                    }( J8 l$ F8 p5 u
                    else
( |, s# ?6 r8 q8 Q                        i++;//数组元素为0,直接跳过,不计数。。。2 `" l6 {. g7 k8 |4 t/ a" A
                }
( x3 |7 C7 C6 a+ m: z; s, {3 P: ~
3 z# q/ b' ?, ^$ [7 W( s
" c5 E5 a* Q, c4 A! u            }//结束while循环
* J- Z. w. \/ P1 z9 Z% k5 ?            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦- R5 B/ V4 S% X
           
" H; z$ z. i4 k& n& P                if (numw[i] != 0)
' J* U- Z/ A8 ^0 p5 a6 b0 ~                    Console.WriteLine(numw[i]);1 ^3 m% a$ q# ]$ {4 |" f% Q0 ~; F5 G
           % W1 L5 q. x7 u( L/ c) u& \
            Console.ReadLine();
/ J& [' z/ u; j. D: b+ A: f        }: v  F+ n! B% Z9 @: S: Q; j
    }
0 \9 t( X: a/ E) B* ~" J2 Q}
! g& _! E1 d8 j+ R* x2 q+ j
小甲鱼最新课程 -> 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-4-1 19:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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