鱼C论坛

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

猴子问题

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

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

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

x
大家好!
9 I4 q' R1 u# v" [这几天我在忙着编一个问题,我用了一种方法编出来!9 p# l6 i- P- N" y3 M6 J
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
7 |! G0 i, E8 A& X6 f* }注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
! R  O: d% a$ e$ f+ t$ F4 j  d' n7 B, y% A% w

& ?: L5 P( f7 R0 c/ |- Y& n
                            题目# W* y# v& f* w
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
1 E4 U: R0 k) [' X# t第一种方法:利用循环链表
( a0 P- f) C+ x3 ]! s#include<stdio.h>
1 q% R, s; n0 t4 i#include<malloc.h>
4 H8 m1 n4 f& d8 w#define M 8            //共有8只猴子
( {& x5 n! a' D- J9 S, ^#define N 3            //数到3只时退出第三只7 j- `; D' h. Q5 F" U* q
typedef struct monkey
5 l4 Q: C& O. t. l3 X/ f( N{int number;
* j( V7 H6 R; d, ]6 `( z' aint flag;
" O: M$ V* M3 b7 ^5 s* |, r) Lstruct monkey* next;
0 T6 u0 J. f/ E$ I7 `1 s" E& K}MONKEY;* {' f9 L: K7 J& y! j( U
main()
1 j2 D! p8 {: H' Q" C{ MONKEY *head=NULL,*p,*s;
) d) m: F. x5 @5 `! t" q; o4 P  int i,sum=0,count=0;, U& Y! [% E) F/ `6 B
  clrscr();              //清屏
0 Q5 \* U+ \. g2 D2 E) N" J6 H  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
' v: [( |+ i: C1 @% `  p->number=1;p->flag=1;
8 w7 T* }3 D& D6 d4 [6 B$ @  p->next=head;
' B3 l6 K4 X8 S( ~3 b  head=p;% l( b- `3 i$ o% W
  for(i=2;i<=M;i++)& m/ f* A4 y$ B& b, ?
    { s=(MONKEY *)malloc(sizeof(MONKEY));6 W/ u: F2 P, m, G' P
     s->number=i;s->flag=1;% F$ v5 N  b* d  M! K3 C- |/ M
     s->next=head;) |- ]6 o# A5 U4 J8 M
     p->next=s;p=p->next;; M7 h7 {: K5 K' |* t% X" a% q
    }
( i& V# t% S! e! Y    p=head;
. E3 \  _' x- {* l8 {8 U; p2 F4 g& T   for(;;)$ w# |4 {5 {& I# Y2 S
    {if(p->flag==1)
/ n/ K% d: r" S" `: [" H& c- M+ B  \       count++;% J! n. F- R- w# ^
     if(count==N)
) @  c: ?: [/ z9 A1 B& T        {p->flag=0;
8 x) [3 J% O: [4 _3 H$ g         count=0;
3 C5 F  U5 Q. U! [7 }         sum++;}
( K, ]# Q, o7 _! q$ }     if(sum==M-1)% C3 L+ w# f3 P9 K
        break;
5 o* c  q3 x% t* c: X     p=p->next;
( j9 Y6 T) r4 F6 ~/ \" ^( @    }( h9 M: O8 f7 n8 G5 O# [8 d1 Y6 U
    p=
$ g6 T" e6 J6 S" s2 p& L    head;: t7 W0 d$ U( X6 N. u1 [
    for(i=1;i<=M;i++)4 N/ n- n$ ~. \! k$ R
    { if(p->flag==1)
! t" v4 @3 K5 X/ e+ a+ k% F        printf("\t%d",p->number);
2 J* Y. q( ]7 B5 S      p=p->next;
6 d/ i, s; `7 i% o- Y8 w    }
% l* @. l8 y0 Q7 t2 \6 g
! e( v7 N7 M& V" S3 k+ J4 s2 e6 _3 I3 [; c0 I% Q4 n) W/ Q. h" I1 ?. l2 l
! [  G, C- {( e# q% B
}

, L! B: S/ L6 I% Y2 c' ]第二种方法:数组
' H: [" A6 O( i/ M' y8 U/ m#include<stdio.h>& O  f/ q- a( T% F
#define M 8, n" Z: q# R7 x( S7 v: _
struct monkey
$ n9 \! r" Z" Z8 K9 T& a{int number;2 s; U! T0 R6 \. G( t
int nextp;% V4 J' H6 W) v) D2 q. G+ i* d
}link[M+1];
7 K1 h# G* h& }  w8 {8 Q9 s4 W: L- I1 n: J2 ^
void main()! i+ A% U6 T+ ?6 `! ?
{int i,count,h;
" N4 N. \. c" G2 G; z0 `9 t0 ufor(i=1;i<=M;i++)
4 X0 K. A. y* P9 C/ ~3 b; X{  if(i==M)
% ]$ @( [- S1 l( [0 b& a6 f   link[i].nextp=1;
* p: N2 ?& R* V   else: n$ f3 {0 V% |, e! L  ~* Z
   link[i].nextp=i+1;( P' C$ j( ~  k
  link[i].number=i;
, c! V/ D( r* {, o1 O5 V& X}
" {  q3 P4 K5 rprintf("\n");
& u4 b/ N' n* ?9 d- T: G5 Dcount=0;" ^' }* O& ]; ?' \4 J; F) B
h=M;
! p9 x' v' @$ M4 k5 e- O' \1 Q. xprintf("依次退出的猴子: \n");
4 Y5 o% R- ?0 `while(count<M-1)9 @! E# i1 Q2 m
{i=0;! C& m" b1 _5 X" J0 V" u
while(i!=3): N/ q  f4 @4 K1 F7 t
{ h=link[h].nextp;$ N/ [# n3 t. s  m3 I' i
   if(link[h].number)' q6 i4 s& K" N5 V0 D( E
     i++;}
: K2 p& v) l0 _1 ~7 `4 a' X9 V4 ^$ u
printf("%4d",link[h].number);
7 w/ L5 F9 T3 I; _+ Slink[h].number=0;) s; o5 k8 W. O! e2 n0 L: u# y* J
count++;: }! @3 p/ m2 i1 I; Q1 A( X2 J" N! c7 r
}
" x) `) O( }& s3 o$ @
/ I" D$ f: t4 Q9 a7 R9 {+ Cprintf("\n大王是:");
$ V8 A  V# o. W4 C, `. [  `% K  for(i=1;i<=M;i++), D6 _) X/ v, F5 v% q
  if(link[i].number)
, S9 t7 `( w; n6 v# M8 h* e    printf("%3d\n",link[i].number);. g8 o0 }9 M/ f5 e3 ?

) x9 p4 s. y5 ?' X( ^% g" Y+ Z- ~
}
5 e6 w0 Y/ U( T. l' i, H! P
第三种是普通方法for循环

) F6 y6 V! C, @* }#include<stdio.h>
- b, U2 Q" v# o' l5 e: S' d: [0 avoid main()9 O4 ~; w) k, T- {# [
{ int i,k,m,n,num[50],q,*p;
" V0 [( i: Q0 j5 J+ Q4 v    clrscr();+ a( o+ b8 g! p; l, }
   printf("input number of person: n=");
) A6 e7 s7 Y" y9 g% K& A) ?7 B    scanf("%d",&n);: Z9 w# H4 f2 Q  w
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只. \8 P0 B/ W) p
    scanf("%d",&q);( [! J7 @' A# u+ U; _, S
   p=num;9 n3 \# O! Q3 L- n8 h8 V6 ?3 v
  for(i=0;i<n;i++)
' i# D# o4 S( x* g    *(p+i)=i+1;
2 d, B! w+ k% j( b. @: @/ Z   i=0;0 g8 P2 F4 ~$ n  I% o1 ]$ b/ E
   k=0;8 `  G5 u2 c; n3 ]$ Z' R0 S
   m=0;/ Q: H& ?5 _7 y' n0 j5 y' T
  while(m<n-1)
% k  Z# x% A, j0 U   {if(*(p+i)!=0) k++;
# ^7 N0 s0 b- D2 C4 a. t     if(k==q)
; d* }* A9 @7 i% [  I      { *(p+i)=0;2 u4 k+ c! \! h$ X6 A" i9 x
        k=0;
6 O  L9 g1 F2 O4 ~' c+ A2 x        m++;: j- S5 O2 ~& d
      }
* m, L- n0 j2 _4 F9 D2 K    i++;! Z( H) c' y/ O
    if(i==n)i=0;1 d5 ~% K+ a" U
   }
  W$ w5 K# l/ l9 n% p  while(*p==0)p++;
. c! Q5 |: e$ L; K7 D    printf("The last one is NO:%d\n",*p);
+ p! ]/ j0 _# |( {' n6 n8 J$ a     getch();
2 _9 c# u& R4 ]- ~4 @; [: P4 g  {, [' S+ M
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;2 R8 ?" f5 V' g/ ]
namespace 又费马达又费电) x! X+ ]8 K! A0 ]; o! R- V7 B
{) Y  l! b1 A- B# i; p7 |: r
    class Program4 v3 k' Z3 o7 s8 m7 t; `% J  z' p
    {
! r1 D3 ~& g+ h0 |9 R        static void Main(string[] args)
! q6 O  I: x7 R3 C) m        {, z! W: c' Q. D5 C  c
            int m, n;
) [0 F8 t! X: C; G5 E% \: H            Console.WriteLine("请输入数组长度");5 U$ Y5 G% G  p  K
            m = int.Parse(Console.ReadLine());//m为数组的大小2 t, k' x( v0 h
            Console.WriteLine("请输入要截取数字的大小");
0 i$ \" ]" l5 y& [# @; m            n = int.Parse(Console.ReadLine());# b3 r& i: b$ c* h  c3 y8 A
            int [] numw=new int$ h, c' H5 e! @+ ?4 e* v2 ^
9 t: N& }8 X" c2 O; H  U
&shy;&shy;&shy;;% Z" P! H( R# O! Q
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
# g6 J7 {& b+ t5 B            {
# z5 g( O8 H3 G0 X' I. ~6 g                numw[j - 1] = j;
6 P$ c9 }3 U. p2 W6 p' {            }
5 B# j' N0 h- @+ d9 M            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
2 Y9 [. L) V: @( b            while (d != m - 1); ^$ y3 j" h8 J' f4 z
            {6 L) Y% t" W  m9 z4 g- H5 d
                if (i == m && d != m - 1): _9 J3 {0 P& r  e# Y
                {
0 v! `+ a; J0 s$ M3 e, O8 e2 y                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!, F0 ~$ x- `4 v. }
                    continue;; I4 E  M; V) e/ Z4 A) I
                }
7 X! H8 B' M. A' u                else
5 |, d1 M/ R6 P! b, r                {
; @0 L9 A" V) t2 J& A5 A                    if (numw[i] != 0)
7 }3 F! \  a% A6 G" ?                    {0 ]- |; n) ^3 C- J
                        i++;+ o( x& [( Y; k; W
                        k++;( f  n% n+ f; a! ]7 k  a7 l
                        if (k == n)
5 I& A5 E4 m( n' ]+ X$ H" R                        {
) q0 U( U" p& r                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
5 |% w; a8 `9 g8 o, {; `                            k = 0;5 D5 J2 V9 Y6 I# T6 v* p5 v- o
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
# n( f. m2 X1 }$ ?  F                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);+ s& @6 ^8 M; {0 g, J* x
                        }7 o. M3 k, L1 |/ H. u' w
                        else//输出暂时还没有改变数组元素的值
- _. h. \3 v; W- q+ P  [2 K; A6 e                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);  ]; A+ ~% k" Z: t: b
                    }
8 g" ?7 \( h# y. }: v# v0 N6 q                    else' a* G5 R* z( ^
                        i++;//数组元素为0,直接跳过,不计数。。。
, j/ t5 ]& d6 s! ~9 h5 @" k0 _                }! I+ v9 q& u  Y" G

% b+ k" c+ }" Q
/ R& d: c* z$ S' C            }//结束while循环
! k3 S" c+ x' P% K, Y            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦5 y9 G% N3 I) O& R( I- `5 ]  z% {1 `
           1 E4 D) ?4 A$ n8 Y& I0 ]9 D
                if (numw[i] != 0)
8 R  R" g  w( \0 s, p' a& X1 M8 l                    Console.WriteLine(numw[i]);2 I3 ^9 N7 g4 a3 y
           
5 U3 p  F% `6 r! q" @            Console.ReadLine();
. O2 H" C  Z, d; N- d/ I        }
6 D" a$ h8 ~1 K: A2 p    }
: ?' x/ m* d$ [8 |1 j( X/ s5 d}
  z: J" v5 u5 W5 f5 V' ~
小甲鱼最新课程 -> 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-9-19 21:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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