鱼C论坛

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

猴子问题

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

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

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

x
大家好!
9 R* B( o2 k% v0 \0 |这几天我在忙着编一个问题,我用了一种方法编出来!& m1 }3 a$ O5 [/ H  X
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
* l9 a) R$ d3 P0 Y! j2 R注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
1 {2 \) b+ Z5 J' R2 i; l; h9 X& l9 j5 X" a' _& r, M# a# O4 @

& S5 S" T1 a- C2 a& b1 e6 M
                            题目% r: [) O% [5 M: J3 b8 }: c& v
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。3 H# m  A* V, [0 o8 n) l5 Z
第一种方法:利用循环链表3 S- K) f# V; y5 g, x# d- O
#include<stdio.h>
  h+ s3 E& h9 ~  a1 y#include<malloc.h>; s0 U, s& Y& {" R  [( D
#define M 8            //共有8只猴子3 @! Q$ U, f8 a9 R
#define N 3            //数到3只时退出第三只$ c6 g* E$ i2 p  t/ [; Q! G
typedef struct monkey( [5 g. w8 f/ S9 H6 w: l
{int number;
3 |7 Z" G* _9 w1 ?int flag;: @7 v, Z' q% y- l4 z
struct monkey* next;
: T8 U  E6 A2 F% D( n3 B}MONKEY;6 z9 f$ A& M9 O6 v4 |2 ?- ]' x
main()
& {0 M) Y! Q. n6 [{ MONKEY *head=NULL,*p,*s;
8 `+ I/ x8 H4 l3 a5 P( ?& I( F4 s  r  int i,sum=0,count=0;( a: m- R2 X$ j
  clrscr();              //清屏! E/ H6 x6 j$ V$ }
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
/ Q4 r1 ~  l) D7 m9 d; r  p->number=1;p->flag=1;( E) k; @' \4 m# U% s1 g
  p->next=head;
- a1 Q. t2 [, ?% h8 Y! x  head=p;
/ z& F4 B- A+ Z! W* E. b  for(i=2;i<=M;i++)
5 F* `' ~8 ^' p9 }    { s=(MONKEY *)malloc(sizeof(MONKEY));
* g, h1 ~) S, W  ^) R* x     s->number=i;s->flag=1;
6 o7 J+ \% H0 q: Y6 ?     s->next=head;7 f( P  Y& m$ c2 v* G5 O
     p->next=s;p=p->next;6 Q: t- B1 \: e
    }
- J/ y* I" n1 w    p=head;
/ ^. Q4 g& _3 Y! a3 t* O" |# z/ j   for(;;)
7 u- U. r( M9 o7 ?! ^! R    {if(p->flag==1)% G- X8 ?0 ]* c0 T0 [
       count++;  W( M5 ~7 u- m, n% m5 X& s
     if(count==N)
' B0 l: i9 {9 U/ |, A2 s8 ?        {p->flag=0;9 h3 z& w% U: f5 _0 R: t) O$ p+ C
         count=0;8 q0 ~3 B9 @; Q8 l
         sum++;}- q' x% N6 ]5 C, l& e4 y$ J
     if(sum==M-1)/ \$ r0 t& f- J- f: v& Q
        break;
9 H' V, F) ~" Q. [8 H3 M     p=p->next;0 s* ]9 [; y' C3 x* a
    }, _+ R& h# a  d6 T* h
    p=
1 _. M3 D3 K$ Q    head;
/ f8 C8 O  s( P9 U' Y8 C" s    for(i=1;i<=M;i++)
( n& U( k; L7 O    { if(p->flag==1)2 }" }4 F, `6 H2 F
        printf("\t%d",p->number);) @$ h9 G4 S$ U) U9 C
      p=p->next;
9 w, Y# d6 X! ]8 n4 B( B/ R    }2 N" ?! v! Q3 H; _) M

0 n" v: t* c1 i' j' n) Y$ v: \* f5 {6 c1 X  [" t

$ i+ D2 M: r3 V. b8 g* u; {}

) L) F3 W7 |, _: t/ Y! C第二种方法:数组& P  x& P0 K" B2 Z3 q
#include<stdio.h>
2 c. x) K9 ?" W#define M 8- t& X% h* r4 M- ?1 m# P
struct monkey" s$ g  k# O5 g. q0 ]8 e4 _
{int number;
: r# b- {* Q5 N' p, |int nextp;' X: D- j" f$ G- {
}link[M+1];0 L9 g+ G1 f7 Y8 x/ w

& r! l( U  T- jvoid main()
# d4 q2 e0 h1 k- o6 O5 _{int i,count,h;
# Z* M- k, p9 _for(i=1;i<=M;i++)
8 f; X& P; K* x{  if(i==M)4 Q' J$ o. @, u* h5 P/ E7 H0 j6 a
   link[i].nextp=1;
5 Y! D5 B  i% U) e2 j8 [. h, `# @   else
4 w! ]) k2 s# N: a, ~! V" R5 l/ A6 c   link[i].nextp=i+1;( Y5 e0 H# y" U# O! }0 H6 }
  link[i].number=i;
, X4 B# ?, M9 C- Z/ ^/ E- q+ v( C}& R1 E* A, V4 q4 N$ h! N
printf("\n");
- N! D8 C, e! v4 Y9 c9 pcount=0;
/ {  ~5 o7 ^0 U7 g1 p6 ph=M;
0 @9 Y& s' Q8 }( X2 e. Cprintf("依次退出的猴子: \n");
( I! s' W6 s" a# twhile(count<M-1)
1 `- f  e( b1 ?: v* x$ @{i=0;
0 r2 L7 ?* P1 C9 b! o9 nwhile(i!=3)8 R+ A, Q9 G: j. E
{ h=link[h].nextp;# o9 t% y6 z) h( c' T  I
   if(link[h].number)
1 {: h, `) `+ x+ k. t     i++;}3 X; L8 O5 r4 L+ y& D/ i7 q' R

) W* O6 w1 d$ D7 u* ^printf("%4d",link[h].number);' o) K/ c( P5 T
link[h].number=0;5 {- |* F) ~! c! a
count++;
6 D) o# a: C8 p: w% Z: o9 E1 F}1 z( S- ^4 `6 @1 c% z' _
. j" U9 F8 D5 i& |- v1 L, _
printf("\n大王是:");
- C: n/ v1 R; y/ e* O7 [( y# ?  for(i=1;i<=M;i++)' r+ k2 T* [8 d. n2 x; ?
  if(link[i].number)
+ X! t1 p" w2 Z  Q) `    printf("%3d\n",link[i].number);) t5 y- c9 r$ u; R: Y5 G

. M' Q$ I. g2 s6 o# j  q4 L3 J* p! u( K' W5 S  T
}
; @6 o' T% Z, X# _1 m5 U! Z
第三种是普通方法for循环
0 m$ |  z. _  y8 R' \5 z
#include<stdio.h>
! a- U9 e" o4 Mvoid main()
. Z, ?3 B" F8 B{ int i,k,m,n,num[50],q,*p;
; N' \9 d% N: D" @. F    clrscr();/ F4 S1 v3 l6 b
   printf("input number of person: n=");) @1 x% @6 R; P4 W+ U
    scanf("%d",&n);
+ I+ \0 X3 h% Hprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只+ J, i$ O! L* ]1 {( `
    scanf("%d",&q);
* V1 H7 g: y2 z* e7 B- F   p=num;" l: \: T0 @8 X) F5 {
  for(i=0;i<n;i++)$ U  m, T5 L- c. X5 K9 a4 A% O) w
    *(p+i)=i+1;1 }0 |1 Y9 h/ k9 p1 c; [0 o
   i=0;
. k8 h' s; Z+ J: J" \# ]   k=0;1 Z. \. \: H& B
   m=0;$ e/ q! H/ i2 ^
  while(m<n-1)0 k3 O$ G" ?4 w% H% C, C
   {if(*(p+i)!=0) k++;
' U( H7 V$ N( d1 i$ _     if(k==q)( a, W5 H1 l4 W9 {8 B
      { *(p+i)=0;
3 n" o$ k1 @- b+ N3 {* z/ P        k=0;
& i0 e$ K9 _- N# O1 ?! [        m++;
" I0 V  O9 {+ g      }
6 Y2 L7 P' C- ?# }8 I    i++;
* M* y& L- P5 [7 n' `    if(i==n)i=0;& {% O$ Y; D2 s" P( |/ X! W8 b
   }1 z4 n) L: N7 x/ ?- t* F
  while(*p==0)p++;
) X1 Q% n. a  G* `3 C    printf("The last one is NO:%d\n",*p);
* r# ?5 I5 o# t, ?5 G: n     getch();0 B8 ~* l  X: @

: G* q$ f4 e8 e$ }: v! j}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;  Y# m% `  S! g8 Y% Y5 Z$ [1 J
namespace 又费马达又费电  q7 o8 q" a6 c* Z8 D: ^
{
* E# ^3 A9 e# x9 C  k$ }    class Program
( h! m* A( K! P. p* B4 e    {
7 a  G  i' m9 Y        static void Main(string[] args)+ N5 h+ R* z6 F. ^
        {
9 f* V0 T; h4 Z% `+ M            int m, n;
$ J  b6 S' z; o( J            Console.WriteLine("请输入数组长度");9 L  E& g6 [, i6 b4 S) F
            m = int.Parse(Console.ReadLine());//m为数组的大小( v- n; w7 \- \
            Console.WriteLine("请输入要截取数字的大小");
2 f9 H4 n+ n/ m4 i  w" t% G& m            n = int.Parse(Console.ReadLine());
2 W! |0 r- E5 z8 l7 H            int [] numw=new int
: }! d% X1 N( i7 T$ J/ E9 n
  P1 o7 B- T1 |2 l&shy;&shy;&shy;;
" i" P0 s7 q- J2 G! C5 y  Y" d' }9 h            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
& s+ y$ G) _" {9 z! \/ _( T4 M. i            {+ q8 m+ X6 O7 ~9 i6 ^2 Z
                numw[j - 1] = j;
6 s/ G' q, K0 t  x1 g, S( k) `: U$ S& D            }2 @3 }- r2 }8 L. `/ D
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!0 Q2 _5 n* M, \/ I3 {! V/ e0 {
            while (d != m - 1)
; N# f  w  t) E            {
8 Y$ ?7 [+ |7 V3 j6 S) [                if (i == m && d != m - 1)# }/ B6 K- m0 A6 C3 ^
                {
7 q# b' }* u. E                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
. v9 G+ Z7 z3 T8 D* ]8 z( \                    continue;
* B! y" f2 ?: g* y+ @4 s                }
; x. T5 I1 Z, K$ a                else" m3 D, L; ]* }
                {+ N( T3 H! S3 I' Z
                    if (numw[i] != 0)+ o* V* @! I/ z
                    {
# U. n! ?! H, }  D' s  p0 j                        i++;
' h; ?( r2 R9 n                        k++;
/ Q) G* p9 f9 L" V                        if (k == n)
% _5 B& a; ]& h3 i8 S$ ^4 k                        {6 x$ q* e  k2 Y) Y$ O- V0 \& C* `
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
# V9 e3 `' ^2 e7 |" g/ P) s                            k = 0;8 u, Y1 y' K0 L. Q: \$ X
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
/ c0 ]# s# B! J; y                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);3 Y8 I: R' x( p  E% g
                        }- ]' S$ p$ U* f! l0 m
                        else//输出暂时还没有改变数组元素的值( v, ^: _7 ?; R
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
# q: f7 r" S6 L2 @3 i                    }  ^! m; v  k3 `4 {- ?9 q
                    else
% i9 c3 K/ G% H5 j                        i++;//数组元素为0,直接跳过,不计数。。。# n1 A* i2 T  Q" A: S' r, w
                }0 I: X8 z3 X3 T( R& E# Z

7 f( {/ J9 ^% ?
; b  l0 R- B$ O  ?, _. ]4 [            }//结束while循环
  f5 i5 G0 E2 ?% |9 N( C            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
% e7 Q# O1 y  d) L' R# G. R# X           
8 v! m1 D6 z: w3 u' f6 H                if (numw[i] != 0)# z9 S; g) n6 B4 p  `" @. x
                    Console.WriteLine(numw[i]);
3 C; t/ A- j  V3 d0 F8 M           : Q" a: k, y( \0 w. m7 w
            Console.ReadLine();
* J2 r( E8 W6 s        }+ l5 {8 u/ V, l0 a
    }$ L: R! |. n0 n
}
. U) o7 E* P. M0 Z* o9 g
小甲鱼最新课程 -> 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-26 19:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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