鱼C论坛

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

猴子问题

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

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

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

x
大家好!$ r) I) I- M0 R" ?1 |+ Y, v
这几天我在忙着编一个问题,我用了一种方法编出来!& @! o2 |; f" ]
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
( V' G) F4 e1 A( T+ K! Q注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
* J+ Z% [" c3 o/ N6 M
0 }3 R6 g( v% _, I
7 s& m- B- ?6 E* `* d5 j
                            题目
+ N: q5 Y5 |0 \: Z  h4 A4 F山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。  X- G( Z* `. u5 D% C" o/ `* ~
第一种方法:利用循环链表6 \/ Y2 \" Q% L
#include<stdio.h>+ c1 [9 @3 O% t* g3 @% \
#include<malloc.h>
/ y  k* B0 H1 P! v' U8 b) f#define M 8            //共有8只猴子
2 G$ d( l! C) ~6 p/ y% h/ Y3 Y#define N 3            //数到3只时退出第三只$ B0 W' ]7 j1 T: I/ P% n- l
typedef struct monkey: B0 F! ?! b+ O: \1 Z& G+ Z2 {) {
{int number;  P/ f- |% e3 c3 p& r" T; M
int flag;% O! i! G4 N& d+ k
struct monkey* next;
) W9 m& `' d/ a2 n3 O: E7 Q/ b$ W, t}MONKEY;0 @9 V' t# s7 |$ @! J6 J6 K
main()
$ \% z# [) c9 ?1 R+ |# ]) Z+ t{ MONKEY *head=NULL,*p,*s;$ Q- L. Q+ b9 s
  int i,sum=0,count=0;% {9 a9 o' I2 E& s3 p
  clrscr();              //清屏
, U, }! s0 h* f  R/ B9 M  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
/ e  L4 a! x. |1 K1 V8 C  p->number=1;p->flag=1;: U3 Q$ l8 {$ A3 ]5 ~2 z
  p->next=head;" A! m9 `$ g  s: x; q
  head=p;
! @2 P" |( b! J3 ?/ x0 q  for(i=2;i<=M;i++)
: K) t! m* S3 _& ^& b    { s=(MONKEY *)malloc(sizeof(MONKEY));1 P! S; ~$ n( @+ B4 x# R$ e
     s->number=i;s->flag=1;
" s7 _  I$ `7 T7 ^- U     s->next=head;
; `# Y" R1 _1 e     p->next=s;p=p->next;3 y9 l2 Q5 j6 V
    }2 w, P# s' v: ^* I& I* \
    p=head;
" T6 n  C. f, \& S6 Z" y# P* W   for(;;)
; r( r. H3 A6 R9 t    {if(p->flag==1)0 E# J2 b' s  r1 P$ ~: N
       count++;
2 p7 x2 t$ t% f  o( D     if(count==N)
! g  {# r! `* g) f: X* q        {p->flag=0;
! X4 g( O" c4 _) `$ u         count=0;- g. D( G% L( ~3 c" J' l2 b# O
         sum++;}7 N0 U& T! w# ?
     if(sum==M-1)  s' k3 a& c" v5 M" A' O
        break;/ I) a8 W% \' e- A4 y/ v
     p=p->next;
1 q/ W! P3 G, |0 d4 Y, c    }
" ~# P0 o! `- _6 `: s) b! [- h/ y    p=
( M/ z$ \: P/ ]' M# f    head;
  j3 [3 m5 r( j* i7 W" H( q    for(i=1;i<=M;i++)
0 U7 d& X# P" k& H    { if(p->flag==1)
9 k1 Y) V. p4 s. j9 V4 o        printf("\t%d",p->number);
/ @4 H7 }5 K) M# \# b/ o      p=p->next;& E! x# K5 X; _! `2 _& ^  q! j
    }
2 w; u( v: e, O' O# _0 r
2 m, [9 w6 P$ u  ]  d$ v/ T" C0 W" K+ W! {; q5 q
$ B) L' b2 R+ e6 q# S% z4 S# L0 Z
}

( v& A; q4 O- `& d( v, `第二种方法:数组
- [; q, k5 H/ C% t: e0 Y#include<stdio.h>
; X: S/ a4 y2 @# P& y4 [1 W#define M 8
9 W/ B0 G: c& l$ Fstruct monkey
3 {( X8 ]5 _# P  U, L/ _% p% m{int number;
; Y! m. e5 B: `' Fint nextp;
7 [" H1 `: r3 H( a  W1 C}link[M+1];
/ I7 p* v0 a" y8 }
+ d1 a. @1 K3 y3 kvoid main()
1 v) k* ^) o( d4 B5 j{int i,count,h;
# R, ~- j, T' K6 B% Q( r# N! gfor(i=1;i<=M;i++)
+ m+ Z$ L. G  l% `3 h! M- b{  if(i==M)9 B/ x1 T! R2 N: y/ ~, ^
   link[i].nextp=1;) a" l5 @6 q# |& @& ^  y  Y4 _
   else& K$ |7 i1 ?' x  k
   link[i].nextp=i+1;
( G' {+ g- _  q& P6 K% i  link[i].number=i;5 B9 @# g6 O, c: V
}2 |9 X: o) Q7 D- Z6 T1 r
printf("\n");
" H/ P3 c, _' k5 A6 F9 Jcount=0;
' V( y" U4 k! q' {% S7 q1 ~* Yh=M;
! M' r6 s$ f: l1 m4 fprintf("依次退出的猴子: \n");5 L$ H2 f7 j; o
while(count<M-1)  {: v( b) I0 G9 i% v
{i=0;! B1 i" J' c- u7 C( I( j
while(i!=3)% F  ?. H* M# V; y8 V* ~& u
{ h=link[h].nextp;3 \' g9 R" @: B2 {
   if(link[h].number)9 u) G! I6 q8 s7 {! R
     i++;}8 ]- w2 h+ s) L* ?; s* ]
: b& s2 Y( P" o
printf("%4d",link[h].number);! b$ _+ w* N/ G  P4 b
link[h].number=0;
3 M6 S3 G' L. ?/ @count++;/ h0 X2 N' {4 R# F1 O" S1 y2 O5 ?
}
8 |. T7 O9 G6 C2 `3 |% m# n5 E2 p, ~* ]4 J. e8 J
printf("\n大王是:");
" m: o% {; D3 d# u: ^- x( f' s% b  for(i=1;i<=M;i++)
! H  z- h# {) F  if(link[i].number)
! Q; l9 L6 @& _0 N/ x    printf("%3d\n",link[i].number);( j$ E+ g  ~9 g0 f( |

8 X; G8 a. N2 B- m* Q6 \
( S0 c3 N$ v$ d3 n: i}

- A9 Z& G+ m9 i6 f$ m第三种是普通方法for循环
4 h- f5 G4 B& o! P) l  k
#include<stdio.h>7 ?6 W! q5 A# P6 ~9 K3 p
void main(). V/ T8 m1 C3 a: O% o" M
{ int i,k,m,n,num[50],q,*p;
6 q8 b% R$ _$ R" W+ s3 P, K    clrscr();) A" u8 [5 k% K$ R
   printf("input number of person: n=");' J# X/ `( d' i  |- n" }
    scanf("%d",&n);; B/ i& D- z  a% ~5 x
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
5 y) V3 L1 v  _; D/ H    scanf("%d",&q);
' c, n& ~' l" s/ h   p=num;
6 V; y# e9 x6 X0 w: L8 B2 s  for(i=0;i<n;i++)0 U& I4 M2 E6 e4 b' g/ g1 [( s, P
    *(p+i)=i+1;
" B( f8 E6 F" R( e$ k/ [/ o   i=0;" o6 J; v5 k+ R
   k=0;
1 N3 b! J; K  W6 ?0 H$ b1 u* t& Z   m=0;1 @% N7 k- q! H4 t( `
  while(m<n-1)7 T" w6 C) n; w% K
   {if(*(p+i)!=0) k++;
/ a. v- P. j  ]6 ^2 U     if(k==q)
( ?6 l( N" t. [4 \      { *(p+i)=0;
6 o6 A5 P* _' X+ n+ s3 B        k=0;
: k; a/ e; _8 F        m++;
# F' h( v% n" N0 L8 k! n      }. E. k" b9 k2 T+ i* w4 ]
    i++;
/ x. \2 t' A& y4 \) u8 w    if(i==n)i=0;& A; v: Y( r; G* J% X$ Z3 i6 Z
   }7 \) n6 E' K9 N! G0 h
  while(*p==0)p++;& s. r9 j+ w+ M* v- D; M0 j1 O
    printf("The last one is NO:%d\n",*p);2 ?" e# m  j0 G; ~' A# Y
     getch();
; v5 E# n8 y( Q7 |7 a0 U5 d/ k0 V' X4 h. c7 W, b: r! S+ }6 H
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
2 c; D) ]& k3 @' _; znamespace 又费马达又费电2 y0 D1 V! I  S1 G0 _$ r
{
) j: G$ u* G5 b( a9 s7 U) h+ k    class Program! L" r- X+ Z" C6 j1 l
    {
: Z, f, H( P, W* x" }        static void Main(string[] args)
9 ~+ G+ q; n- G( p+ ?        {; T6 A! }3 G' v3 z2 }; M  t
            int m, n;1 @3 ^# @3 S$ d! H$ W
            Console.WriteLine("请输入数组长度");3 y7 D; w0 j4 T* i. p/ m$ L
            m = int.Parse(Console.ReadLine());//m为数组的大小; i) l# J- n+ P( y2 _7 w/ K. D
            Console.WriteLine("请输入要截取数字的大小");4 \+ ^% k. R7 w! S7 v/ v4 f( X! w
            n = int.Parse(Console.ReadLine());/ o8 d% D4 n( Z2 z2 @
            int [] numw=new int
- ~$ f" \( y7 c/ e
+ s. R- U9 V% _  H8 J% L&shy;&shy;&shy;;5 X  B4 }; e0 C$ j
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
) h4 ^3 j5 x. l! j9 F            {
3 G" P1 n2 G/ C) |( l* G9 C/ R  l                numw[j - 1] = j;/ a3 B$ t" b9 o! x3 P
            }! Y9 X% i1 R9 U! a
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
5 E" t, f! V9 w3 E& \- @            while (d != m - 1)+ K0 H9 v6 O" a1 `
            {# {2 q& ?1 d- F. z
                if (i == m && d != m - 1)5 F2 g5 ^: B7 d0 F3 p% r
                {- Q' U" _2 G% t1 q' P# O
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
% B. Y/ F! r' C6 k                    continue;
  z9 S) S6 N& s: }2 M9 i! d                }# R0 B$ x  G2 @8 t4 k, e7 v
                else7 ]# U+ M" V( w8 b6 J! ~
                {: g/ W/ U' A8 Q$ M3 x- m
                    if (numw[i] != 0); ?" k5 P' v, ~( P- j1 o
                    {
/ i5 n5 d) w! \                        i++;
, ~6 g9 k5 q6 Q                        k++;
. n! G6 t( E( _+ O! G- @                        if (k == n)
2 \$ j- e% ~+ k9 [* z/ H: K                        {
# K% F! b' J7 {9 N+ {: O4 A- [                            numw[i - 1] = 0;//把在n位置数组元素的值改变了6 z' a/ K# b: X! }
                            k = 0;
8 U- n2 M; X# M; X0 T* [3 B$ v" U  C& {              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1: \! B* O- [( w# x
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);! k8 O' k' l1 \' Q
                        }( s1 N" h) I) Z, C$ N/ e! ?
                        else//输出暂时还没有改变数组元素的值
( j0 d& i+ ^! Z3 I3 d& \                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
( p  [" ~9 j& |1 |$ e9 f                    }
/ B( h9 ?3 ]" a9 y( E5 t0 O                    else
5 d" D) k" c. T" ]9 T$ }- D+ n- I                        i++;//数组元素为0,直接跳过,不计数。。。/ F  l4 ]: g1 [& T3 ?6 u' m
                }
5 j$ e% m) ]& t0 n7 K" ^
- ?- y7 i7 a' _$ E  ]
: b& `' [, r- k$ ^) v1 K  B1 i; z            }//结束while循环* V2 \6 v2 Y8 \# k+ \1 D5 m6 G
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
" J- a7 l6 A' w7 c           & u3 Y. C# c9 V2 o! J5 J
                if (numw[i] != 0)
. r( l& A9 J& K( H0 R7 b9 S                    Console.WriteLine(numw[i]);
- V4 ~) z6 w- t0 y/ o+ i; j7 M           
' u; n, N! D+ D. x7 C            Console.ReadLine();
- ^" X5 M0 Q! g3 w2 F  S8 I        }- X" p+ d9 d; J. e/ I) g$ R
    }! o% c. v7 J; v) N  V& o
}
$ }5 X  K: A2 P6 E
小甲鱼最新课程 -> 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-1-12 17:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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