鱼C论坛

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

猴子问题

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

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

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

x
大家好!7 x, R5 N7 ]8 O0 O3 }& J
这几天我在忙着编一个问题,我用了一种方法编出来!
, Z4 U+ u( ]/ c但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!* x2 F5 X6 D, O# X/ Y
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
8 B, K9 v2 j. m/ H0 @. J
* {7 \# b/ b3 k8 f) P& A# ^. M6 @1 k0 O. C- r* M
                            题目% o! U3 \+ F- R  k; i4 L8 b
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
  L! C/ y1 f& G0 D第一种方法:利用循环链表
  U1 d. t/ _  Z6 A#include<stdio.h>! y. d: B8 J+ y8 {3 o; [
#include<malloc.h># A# D& i! `% b$ ]
#define M 8            //共有8只猴子
: R* o: A- R% M5 a* M#define N 3            //数到3只时退出第三只
7 J. Y9 a* J, xtypedef struct monkey. z0 W% U8 w& _! N
{int number;, s' e% f( I' c% ^4 Y
int flag;/ B3 ~7 L' C$ Y/ m8 n
struct monkey* next;
$ l2 V9 e7 c& Q+ `}MONKEY;
& m6 l8 s: |0 |, b4 R; emain()
* L, C/ i( b- Q6 @{ MONKEY *head=NULL,*p,*s;& w$ S" _4 o& S& E0 z: R
  int i,sum=0,count=0;( f4 V0 z: @/ y! a) `
  clrscr();              //清屏" p' R9 p9 Q, @& q6 |- n
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
2 x' i. o" J$ L( |9 ^! W  p->number=1;p->flag=1;
9 o/ A& {0 ^4 [* t+ v9 Y  p->next=head;
  t. z" O9 K1 \1 h  G8 Q# o  head=p;2 s+ ~6 s0 x4 b9 {6 I
  for(i=2;i<=M;i++)
% n9 A! A# p% S/ ?    { s=(MONKEY *)malloc(sizeof(MONKEY));; m5 ?$ X5 P1 @$ z2 [
     s->number=i;s->flag=1;
0 R5 j& s! V+ W( z0 Z     s->next=head;
. ]3 u- m# ^1 C; H% ~; C     p->next=s;p=p->next;: U. {( m8 R& N- Z' `. t2 g
    }" ^  E" c) ^$ M: q/ {+ `
    p=head;
4 h7 [: Y1 S( K8 U: ^2 G' n   for(;;)
( x% M" U7 u: ?2 L* X    {if(p->flag==1)
, I0 N! G  X( k# T" i       count++;
0 `/ a1 o' k. ~& b  K     if(count==N)
% ^3 ?* X9 ?( i        {p->flag=0;
$ r) L8 K7 i: l  P/ z+ N$ Z         count=0;
2 D" d- r8 ~8 Q; K. w         sum++;}
, T: z! u' l8 }, i  s     if(sum==M-1)
8 P+ H) f: ?" j# M: x6 g        break;6 N. I; L9 R' y
     p=p->next;' G+ ?" J' R% R
    }3 o  k/ M: u$ h  G
    p=* k# `8 ^3 ~; W- }: c1 J
    head;
4 \4 j" w  |' j6 Z% H3 R    for(i=1;i<=M;i++)$ M0 B- A  O* ?2 B- m: f
    { if(p->flag==1)
' Q7 J( c7 A9 j8 @( g# |        printf("\t%d",p->number);
) d4 a/ p: p$ k6 R) U, \4 u4 }      p=p->next;
! p/ x/ q- l' d: e6 r+ t* c    }' O' \( ]; _+ \: y9 i

9 A' T0 J* u3 m% s7 L3 |/ F- a3 G4 y: p
* T5 K# c5 [0 @2 Z
}

$ h* D' J7 V- q" k" J4 q第二种方法:数组
4 G8 X# N+ `0 Y# T# Q#include<stdio.h>
7 u4 {% z" e" ^$ v8 o#define M 85 ?( C! N2 ]# Y  w4 W4 ^9 H
struct monkey' n; |6 G. V6 E
{int number;
7 L3 v" B7 k# wint nextp;9 C  h; u( e, U& _
}link[M+1];4 G- ~4 e/ z: L6 D( e: A

6 C3 A6 v- Y$ S, {  ]5 [2 kvoid main()) h, F7 p+ X, J* [9 e* H& Q6 @. L  Q
{int i,count,h;+ @3 L2 U5 X* I: R* n* g. |2 k
for(i=1;i<=M;i++)5 d- d' a- G$ h! w
{  if(i==M)
5 g4 V9 \3 g4 y( r   link[i].nextp=1;
6 e- O5 v1 S9 m   else
& N# F- W; i# y" N2 o7 y   link[i].nextp=i+1;
$ Y6 W* m% y# y  link[i].number=i;5 p) ]; q( u0 p1 y& z* S  u
}6 F+ Y- n( j2 b5 y. ?8 @
printf("\n");' t0 C# s4 n8 I
count=0;- A2 L, p+ U, o. M
h=M;+ D+ z; w  J. E  T1 `
printf("依次退出的猴子: \n");( a% K. ~9 e+ ?! k" }; r
while(count<M-1)- M$ @& N" w( L5 e3 C0 R5 P
{i=0;" F" c% B9 L* i9 K, a
while(i!=3)% H# |/ Q3 @4 B; c
{ h=link[h].nextp;
" K7 J0 m, e# c0 B   if(link[h].number). b% ~$ H% P* f- ~5 H
     i++;}
* @& V7 w+ p' D% X" T& T0 z
6 r7 ?( l; \* R0 ~5 Nprintf("%4d",link[h].number);9 q& @9 F$ D+ m9 v6 ]) y# r) T) {' g
link[h].number=0;- R( O* X( q7 P* f( I7 `
count++;) A+ `% H3 Y7 J7 c7 h, T  G# l
}
% s8 r0 `$ W$ T% F% g& Q! ?9 f
" A; o! i, t3 l0 }7 E% O( t; L" n% lprintf("\n大王是:");) e' V- @/ f4 k) K
  for(i=1;i<=M;i++)" ?: Z: P: {8 i- n# j8 ~
  if(link[i].number)
# v& t# m! k+ s/ ~; ~    printf("%3d\n",link[i].number);
- t3 G' ?3 Q9 l$ F2 p0 _! u2 d! T! K
1 I) _9 Q9 T1 ~* M: V' Z* F- i7 o" N" T8 a$ }. F+ L! D
}

$ o" F% K3 ~  j  O5 ~& z. ?第三种是普通方法for循环
4 p2 G1 Y% E2 _: s6 x1 J. v
#include<stdio.h>
" p  T! n( ^  n! K1 V' tvoid main()
3 V1 t  U2 A& W! ^- {( X: @# O{ int i,k,m,n,num[50],q,*p;1 G" {) T. b# m. n
    clrscr();. C9 e- v" X6 c- {7 D. c
   printf("input number of person: n=");
& c; V( B; c. k% a2 J# {    scanf("%d",&n);
% k" i4 {% a3 S% ~3 n+ Xprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只& J, V" h9 ?4 I& u' u  ^
    scanf("%d",&q);  }% z* R3 R% D
   p=num;
: F5 J8 M' V2 x2 a9 R  for(i=0;i<n;i++)) X, P) u$ H  P  E/ D- x9 B
    *(p+i)=i+1;( U% o. n. F1 c. G5 z/ P- ~
   i=0;% A/ o7 T4 M8 P0 D
   k=0;
+ |% c% k8 _( S! L) E1 ^- F   m=0;
% z$ a1 X4 W9 ^0 s% U* k  while(m<n-1)
# g. @) ?7 J6 h2 x   {if(*(p+i)!=0) k++;
  z1 G7 l& `* i' K% T5 w# f4 f     if(k==q)& z1 }+ A+ P$ K+ D- m
      { *(p+i)=0;
$ I; I0 W7 ]0 T( d        k=0;: j, K- s# e8 j/ }% T
        m++;2 c. b8 v. `) J2 x
      }) o/ ]0 f4 W, c: S1 K" y) i" \- ]
    i++;- N% g3 l. w  E' k) C" Q# G/ s. K) h
    if(i==n)i=0;
6 P8 Y. R/ K7 u8 ?   }4 m) I( u7 G9 @. V& K8 p$ u* P
  while(*p==0)p++;/ v' w6 U7 t1 s0 e1 Q, P+ l
    printf("The last one is NO:%d\n",*p);
2 y2 `1 I5 p  e8 y; ]     getch();6 T6 E) C% R6 e0 e: h+ x

% o/ _+ o+ E; S# I" d# |, e0 |}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;: @1 r! G3 k( |4 H8 Q
namespace 又费马达又费电
; J" `6 m& G$ y( R0 k. i! m{
; I+ V5 C+ ~+ h4 x( g+ G" e$ ^  c! l    class Program7 x) W& H8 A2 V$ M! b! k
    {+ L2 n: E, y$ z
        static void Main(string[] args)* q& |8 H: {2 [  \  T
        {
3 x. ^8 h  F7 O0 J6 t1 d8 Y            int m, n;7 }  j. q5 s' _2 a- @% K. M" X
            Console.WriteLine("请输入数组长度");9 q+ p! ^) T4 G3 |3 k
            m = int.Parse(Console.ReadLine());//m为数组的大小2 C1 X/ J' C: ?, E$ d0 A
            Console.WriteLine("请输入要截取数字的大小");
, r. B+ \, ~! E" n* V$ ]            n = int.Parse(Console.ReadLine());
$ I! i6 j0 h0 G% K$ l. D+ b' I            int [] numw=new int
* T1 k9 Q3 b. k* f: B( |; n& B& t
+ N7 }6 z2 H7 H&shy;&shy;&shy;;# |' b! b) G. _5 ]* I
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数# X( U0 e+ \; w, E1 s* n4 P
            {
  z( o" {: h: q' m! ~2 b( G+ ~                numw[j - 1] = j;
; r, N% t" p! s            }- U# P8 t  [5 e; V& y6 }
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!0 h, t, w7 p; x  t/ n( T
            while (d != m - 1)
" i7 |" h7 ]  \6 X7 \) K7 g            {- N2 O/ f. f3 L2 L: s6 r1 k" w
                if (i == m && d != m - 1)
- n) I3 `5 k8 v' z1 f2 K6 x                {
. [; _9 O* w2 z5 U7 T                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!4 a$ Z8 l8 D% w, W' p: g0 P
                    continue;9 d: g) W9 s& S( `' ^# q0 z
                }
* O! B2 B/ y" W! _) ?. A3 b                else
0 q- |% D6 j% A. M                {" F! Y, A7 G) J% H
                    if (numw[i] != 0)
2 y- L' f) v# H" ?+ \                    {
$ x0 v5 O9 H. k7 q( I                        i++;
: w  ?' t: ~2 a& X4 G; D" ?                        k++;
0 |: x# R( s7 F3 j' Z+ F9 b                        if (k == n)3 G, U- D/ N( t9 z
                        {
. \- ?4 t" L! R1 V( h8 r# ^9 s+ E                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
! F6 d1 e" p  O) ?                            k = 0;
5 M) U. W% n4 }- I, W              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1: p: q/ G! g" J, [+ m* C* O
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);8 ~8 E; ^- s! K9 W) T+ `: z
                        }( \% m$ T8 X7 p9 C8 w$ ~
                        else//输出暂时还没有改变数组元素的值2 z' l- Y2 Y5 `0 m& T9 O4 |1 {+ _
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
- r* `( {! Q. V6 }+ y, V) v' w                    }
: u) V$ n9 w$ e, D4 i9 j; |                    else) Q6 R: x+ B% u$ A- Y# M, J2 C
                        i++;//数组元素为0,直接跳过,不计数。。。
) M0 `1 u( Y6 @" p                }
( i  F7 e: J# p
# x3 g8 a3 O5 o( x7 ~2 G8 ~( x) l- ~' x, ?- ^4 Q
            }//结束while循环! d/ O' w: M6 P; |$ }8 l
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
+ Z, S% p5 h( r5 I  B           ' R/ \. R( v) @& m( @
                if (numw[i] != 0)
9 w* H& m6 h% ]( k! O8 W# ?                    Console.WriteLine(numw[i]);
, z2 M: |/ a+ C6 ?- c. B$ Y           + S6 G; c* h. E; d% E
            Console.ReadLine();1 {7 Y2 x' o4 [  z, x
        }
! k0 l) F5 Y" J. w" q) f    }
0 X  C& u1 _3 O8 |# \+ v2 ~* ~}* M4 I! d9 i2 k1 _+ N: m
小甲鱼最新课程 -> 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-6-23 09:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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