鱼C论坛

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

猴子问题

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

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

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

x
大家好!! P; }* Q+ O# Z2 t/ Q. J& @7 T
这几天我在忙着编一个问题,我用了一种方法编出来!
" f' w$ H2 o" a: ]2 m; f但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
/ s. }: T9 K' \+ u注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 # A" Q, g  d1 E3 K) T7 x

* U+ w  l; d) A7 k, _" @! ?1 M' ^" {0 ^- c. C# a# Q
                            题目6 \8 _5 ?, \. L3 P6 g' [
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。" @8 s) h" z3 Z
第一种方法:利用循环链表
: k* ?. e) P/ |, j#include<stdio.h>
( r  \) b& h; S% v+ f9 L' W0 t#include<malloc.h>0 l/ @, P( G0 H; Y9 L& `
#define M 8            //共有8只猴子
& r/ R  K- I& a8 b#define N 3            //数到3只时退出第三只
2 E& @: t5 z; s) [* D0 q( Ntypedef struct monkey" a# B& z! h- [" j( U3 l( _2 h/ l
{int number;
% T3 m; W& @9 n# N5 }: [int flag;' c( O, F0 Z9 o9 v/ [, c6 W
struct monkey* next;& W! o3 Q2 B4 h- v( G
}MONKEY;) m2 t& n0 _; d/ D1 Y1 l- Y2 p& [
main()5 f* v/ w: `. n  t
{ MONKEY *head=NULL,*p,*s;* ^  M: `' D$ Q* S% @% d7 x1 @9 M
  int i,sum=0,count=0;# S; U$ O& I9 H' l6 ?) _% |/ g
  clrscr();              //清屏, D, }- L7 ?5 ^. E* s5 V* G" U! W
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
$ H- ]% e9 Y" o; [; B  p->number=1;p->flag=1;% g; g# w- @) R5 F' d0 B
  p->next=head;
2 ^, F: y9 M6 H) M5 i# z  head=p;0 c' `; U- A: Z( Y6 k
  for(i=2;i<=M;i++)
; s' z, M1 j" G+ k+ d0 @# l    { s=(MONKEY *)malloc(sizeof(MONKEY));
+ N4 e9 f% R& u1 q# v7 r0 M! Q! _     s->number=i;s->flag=1;, |2 B& W- {: E6 p6 g+ C
     s->next=head;3 Y5 r, {4 ]" n- N% m
     p->next=s;p=p->next;2 Z* K% i3 ^7 B# C/ \+ {2 [
    }7 |) t9 _3 W0 V8 m) P, ^- a0 R
    p=head;
) E) K9 r6 \+ V5 F% ?4 k9 B7 n' u   for(;;)
8 `1 C7 }$ U7 B: P4 u+ R5 @- `    {if(p->flag==1)
* ^6 D1 s5 @+ _5 _$ q       count++;* ~& s6 r( p& J! C, N4 W
     if(count==N)
* P1 [6 u. E0 D, G8 C        {p->flag=0;0 T) p, h. {  _5 v5 O
         count=0;
1 u0 K" ~$ z' j- Q; {% e" Z         sum++;}
3 y* h# d1 ]4 h% p: [3 o     if(sum==M-1)
! N  B+ }8 Q  t  f6 s; e* W+ t9 O        break;3 M( U$ `4 K# w+ X) R; _
     p=p->next;5 a5 d5 s  Z5 F2 O
    }+ u5 l4 l6 J  k# d
    p=
" X. Q9 a$ z- h/ o    head;
$ G4 l! [4 Z6 P/ T+ a! B9 j    for(i=1;i<=M;i++)
. p- c% H) G$ Z2 n) ~    { if(p->flag==1)- |% x/ X) E/ X" r! Y) _2 g
        printf("\t%d",p->number);" c0 r# l8 |6 D8 ?0 N: E8 P5 F  v
      p=p->next;/ H/ f1 M0 C, S- c2 M1 U
    }: t& N! i  C  d9 X

' i* N# R% c' r7 c$ {
: K6 s% h+ G8 b3 Q8 g% w8 Q* @1 q, [9 i; Q" y9 z; a
}
0 o; T5 G- n4 {
第二种方法:数组
* O/ o! K5 b) H- U7 E# a# w#include<stdio.h>
+ o2 G3 P+ L" a4 w#define M 8
( e: X% j! k( jstruct monkey
% W# z1 c7 l0 X( L- f' u9 Y{int number;5 g. E- X+ o) s) L. U5 G3 y
int nextp;+ B+ A3 z# o0 }
}link[M+1];+ j# k8 q5 _: Q$ g

! P, I3 |5 Z  @. E' xvoid main()+ q+ L4 k8 ?" u& h  o" g0 C/ d
{int i,count,h;
: j1 u$ l) n2 n& B7 cfor(i=1;i<=M;i++)9 j% j7 H! J! ^9 |
{  if(i==M)
  M  d# P6 k! |/ L   link[i].nextp=1;
5 B+ Z% d* C1 Q. e  e4 V7 Y6 K9 Z   else
7 _; B' L5 x2 R8 Z% g9 C   link[i].nextp=i+1;
! G, v4 o& p; \; I4 T: I  link[i].number=i;
% e" |0 c6 T5 ~1 _6 \. R" I}
0 ~; z& r) U2 R) P* _printf("\n");
8 I+ J: I8 r+ _, `$ wcount=0;
: D3 d2 Q9 Q! g2 @" Lh=M;
9 d' P9 O, X4 t% x1 R: Lprintf("依次退出的猴子: \n");' a" i: @# j1 b5 q, Q& |
while(count<M-1)
9 C! s' H- b) m1 i% t{i=0;
- ]% h( |2 a& nwhile(i!=3)
* ^' V2 T8 Z6 q{ h=link[h].nextp;
  \# t9 q+ i+ m6 k   if(link[h].number)
: L# [% |/ \1 o6 ]     i++;}1 w& B0 M. L) i1 {- c0 Z
5 i" E  h$ z6 r
printf("%4d",link[h].number);
8 w* B% t/ W0 {8 s( |4 G# plink[h].number=0;
* F8 {6 P* E9 T2 K: h; Tcount++;
. H5 u9 E6 `: c7 T$ H3 i2 @}! O4 y7 }: U  j8 O

, R( U+ D1 ?* Z9 ]printf("\n大王是:");
& z& Q4 _# M# r' p  for(i=1;i<=M;i++)
5 a6 D  b- L# V6 {3 X  if(link[i].number)
6 x% |( z. I" u    printf("%3d\n",link[i].number);/ G% C' s/ C/ j7 m/ z' c

3 w. B4 n+ }) {4 ?* f" d
6 x/ t" R2 u& q( v}

8 x3 f3 Q8 E- u2 J第三种是普通方法for循环
! Y, a9 s0 l( D* I$ ~6 h
#include<stdio.h>
, z. o. w% W" D7 `1 y5 L7 t% [4 [) uvoid main()9 o1 c" N) M  d4 \" |" x
{ int i,k,m,n,num[50],q,*p;; R/ i8 Q. G8 \$ \$ ]- j9 D5 C
    clrscr();  r. [* s& O7 r9 r7 D
   printf("input number of person: n=");
. F8 F/ {) f; v    scanf("%d",&n);
/ B/ A& f9 H) P+ O/ G) C! l/ s2 eprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只, U" D2 D9 _! y" V
    scanf("%d",&q);
$ n7 B, K* V* w   p=num;
8 [9 v* {. @4 b0 d  for(i=0;i<n;i++)
/ {+ B& I3 e7 S8 `; R  K' B    *(p+i)=i+1;
! M& y/ [# ?. q, ^! M   i=0;6 D$ Z  o3 z$ e( g- ^
   k=0;
: C5 {9 }( b+ _0 r   m=0;
' B2 v2 x2 J% z1 i+ ?  while(m<n-1)
) _, m% a- T" V7 f   {if(*(p+i)!=0) k++;
$ A/ H4 o* W0 }: s% L     if(k==q); k- D( L9 h# T$ u) R; n
      { *(p+i)=0;$ P; s4 @% w5 U" ]7 \
        k=0;: L' U; }6 v! O' v5 S# \
        m++;
7 O" M5 j# M/ l# Q) j' W: S8 g      }
5 c7 P  a- Z" o. r, R/ {( Q$ A: X5 H2 a    i++;
9 N0 f9 u1 s* |3 @: V& M/ q    if(i==n)i=0;7 ?+ b+ ~1 e% i' `/ b+ n; S3 l
   }
, S. H! L; H/ |7 |; c% r  while(*p==0)p++;
  a4 u, l$ q, p( I" [2 L9 G* f5 [    printf("The last one is NO:%d\n",*p);, I# m  u4 U. ?) P+ p& K' I
     getch();9 w6 C. L8 z7 @- t

1 D  c7 l1 o" Q3 w# U# e( x2 {% G}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;5 y0 o+ s1 N" d$ _6 S0 q+ v% b1 s
namespace 又费马达又费电0 |9 p4 V# |& c+ }& S: {
{
7 I- W2 K) l' B& y    class Program& J' N. S. W$ S; l2 b; Q
    {
% T3 d/ X3 s8 g- C# S        static void Main(string[] args)
( |7 ^6 j5 r( ~& R) z8 l; I5 ^8 W        {
" P) p% {, D8 h2 {            int m, n;
; [/ ^4 ^- R+ L            Console.WriteLine("请输入数组长度");
# F7 l8 I/ y3 J) I1 y9 H/ h            m = int.Parse(Console.ReadLine());//m为数组的大小0 P  s/ [2 L5 u. \8 y- P
            Console.WriteLine("请输入要截取数字的大小");
5 H, R" j" C4 n; W            n = int.Parse(Console.ReadLine());0 y" H- V, ~2 {( t5 G
            int [] numw=new int
2 r, |( b5 Y, U; ~5 y
8 E# }4 M3 N2 q+ R4 q&shy;&shy;&shy;;* G: U, p+ x# D# y- x9 O
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数* b+ u, T. [, c3 S
            {- P5 p. ~% h! Y, n
                numw[j - 1] = j;. D4 f) Z3 D4 i' U) b
            }' G9 y; c% m6 R6 n
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!& Y) ~  j# U3 [3 S
            while (d != m - 1)% N" s% N# M8 [' \. Y" {1 S6 n
            {
# I  R0 B1 j4 o/ @: S! w" ~4 ^8 f                if (i == m && d != m - 1)
7 i$ X7 [! ~2 [) J8 ~- U                {: F+ M3 p. h5 m' @/ j
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
  S% Y+ b& a, o                    continue;" a' K( f7 D5 y
                }
" b; y7 R0 _5 u9 ^  }/ Y; D. S                else: X  I& `) r' O$ A
                {* C! J9 }- t' s1 f
                    if (numw[i] != 0)5 B" z' K7 `6 a* b# q) j& a. F
                    {8 X) N+ f: V2 v4 u0 G/ C9 z
                        i++;8 k" S; v; o: x& u1 q& J
                        k++;
# {$ y7 a7 {( h5 u0 N                        if (k == n)
( D6 E* T; B* X8 C, J) A0 p                        {
/ d% K0 \% z% y0 i6 e# z7 }) ^                            numw[i - 1] = 0;//把在n位置数组元素的值改变了2 r* ~$ R% h; _' Q4 A3 H7 Q8 X
                            k = 0;7 b8 l3 ^: \9 J
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1& H9 A6 E1 E1 L; t) |) P+ M
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
# E9 ?. Q0 J9 A. K. n; U                        }
& D0 E! H% H7 w) I8 P                        else//输出暂时还没有改变数组元素的值
9 P! _5 o+ ]5 E+ m, k8 A7 c                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
' z5 ?1 i1 G( m                    }% e9 j) Q5 o( b0 t$ O( t
                    else2 M! e; \. Q+ \1 n9 l* R& [
                        i++;//数组元素为0,直接跳过,不计数。。。
# x# e4 b4 \+ L. r. w                }
9 O6 H* n/ k* q5 J3 q9 }" c& o4 P$ z
1 ~/ I6 `1 _& N. W; f
8 w* W3 e& Z. _            }//结束while循环
) P+ ]( j, d. |% _, d2 ^# `            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
) k; j8 x0 U- R  G$ h           8 F. v5 K1 U3 o. s
                if (numw[i] != 0)  t( T* W: {7 }) H8 g8 T
                    Console.WriteLine(numw[i]);, r7 f2 l6 o1 o) `, Q0 _. E' \4 y
           5 A' Q6 ]- ^% s% _8 E
            Console.ReadLine();
8 U( K* n2 Z- l0 g  w; ~" y8 q# a# Q        }
" @& I1 h8 H5 y: N% G1 ?    }
6 G. ?  @) Y6 |* T}
1 I* A) _% j/ Z4 v0 z' C  R: h6 Q
小甲鱼最新课程 -> 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-6 00:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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