鱼C论坛

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

猴子问题

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

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

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

x
大家好!
  Q! m6 Y; F' R2 O2 U/ K这几天我在忙着编一个问题,我用了一种方法编出来!
, i0 f, N: l; k( [7 M) S但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!, e" Q+ E* }3 b; z( |4 O
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
! j( Y3 @% w5 Y( |( R, w; P/ D4 g. G- J( b; G& A- e

  ?5 p0 b  z  ^. @
                            题目
/ Y( }- U2 I4 _山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
9 z/ ]5 ~: n7 P第一种方法:利用循环链表
# t2 r# j6 `3 e$ q#include<stdio.h>
" s8 W, l+ f- J1 C3 O#include<malloc.h>
( a& o* i/ ]( j! L& D#define M 8            //共有8只猴子4 m5 i  P. B1 i3 B
#define N 3            //数到3只时退出第三只' @% C! n) B9 d
typedef struct monkey
; O& l: n) \* r1 T6 S) P( |8 i{int number;
4 ~* o) O3 V" g; v) B# e4 vint flag;
( z9 K/ D( Z: m; Q( {3 gstruct monkey* next;
6 L( z7 _2 I  v}MONKEY;8 E  `- h: [+ ]! d
main()! E  Q  p, E( l2 \! y! i. V8 T
{ MONKEY *head=NULL,*p,*s;9 R& M3 ^* w, P
  int i,sum=0,count=0;' p0 n  W. V: e  ~2 b+ D+ N, [0 N
  clrscr();              //清屏' X* J& X% _7 j: K7 ]" V
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存: q) b7 G- ]/ p$ |% S" r0 k
  p->number=1;p->flag=1;
4 D( H3 `( _) v' \+ Z  p->next=head;2 O/ c& X$ A" O  }6 E# k" U  b" n
  head=p;% a+ j; U) N3 ]. h: d" _1 U6 G
  for(i=2;i<=M;i++): m5 s+ T! z  h3 U% W0 a2 ~
    { s=(MONKEY *)malloc(sizeof(MONKEY));% U( j& }8 W) ]
     s->number=i;s->flag=1;
  o' `7 U" V6 s     s->next=head;
) o1 R% j+ m' [# U3 |     p->next=s;p=p->next;; g% o+ @; E) d
    }
8 e5 F" u& F9 Q4 [1 B5 j' R; s  y8 c    p=head;
$ E3 v) R) c6 i% @   for(;;)
. d/ e( @4 g$ z* U0 x! o    {if(p->flag==1)
, v3 ?! }* v/ `  D       count++;
! o6 N9 U  d- H     if(count==N); \1 j8 T1 N' \1 R, v
        {p->flag=0;# l2 ~* ?* H/ [9 f3 G9 q
         count=0;2 }  c* {! V$ O0 M3 x- Z
         sum++;}2 _3 b" x) _2 V: O  P
     if(sum==M-1)- d, _* n( B  j1 T1 @; b: A
        break;; Q/ R$ f$ Y( H4 I. X6 F4 a3 I
     p=p->next;
6 d1 a, h8 `7 I1 T( I) s7 c+ m    }7 x. j9 c6 e5 [7 X. O' N: I
    p=
: D) x2 K8 M0 _# l0 l: B0 N* ]) U    head;+ |9 y& ~" i2 J- l/ r2 C
    for(i=1;i<=M;i++), h2 I9 S7 G( P: Z2 j; u
    { if(p->flag==1); j0 X. r5 |& d# l. o
        printf("\t%d",p->number);
3 c" ?# B! `7 l3 c( l      p=p->next;
  @# N9 t) w# ^- r  r) h% T# k( n5 o    }8 N  [; i, G0 l* Y

/ f- E+ W- f3 {4 ?3 A/ w2 _9 D" b( w) b7 ]
1 h' l, _) k5 {, F- Z: _
}

/ w8 ?7 s6 P" Z第二种方法:数组
! ?6 }; H& N6 e9 F/ U$ w/ _#include<stdio.h>
5 N  h3 B9 n  U) ~0 F6 j#define M 8
: [7 I" B3 o# n7 x# Q# bstruct monkey9 }; o8 `5 ~& ^# x6 U
{int number;1 f2 w' V- c! b7 L" Z, k( Q
int nextp;1 p2 N  t' i4 \
}link[M+1];
, e% S8 Y1 |& B7 x( ?, D, j; n5 F+ Q9 V  I4 K, g( K
void main()
4 s0 v* X; a/ V* |! [; ]. ~, D. I) a( C{int i,count,h;6 H7 `0 I2 T% L' Q0 f
for(i=1;i<=M;i++)6 {9 V$ R- l- @- L! C. P# I
{  if(i==M); U  \9 y3 R% y7 W3 v3 E
   link[i].nextp=1;/ s; y$ H) b0 h' m( Q
   else
8 n! I; Y' M3 N" j/ J( r9 |   link[i].nextp=i+1;
6 N6 l: @: P) j' P0 c  link[i].number=i;" l' w  r% Q! S9 U
}6 h. @" h$ s( ?
printf("\n");  F( b: V$ D$ i' t" a
count=0;) e8 ?/ h; @1 S
h=M;
( l" k' s- p8 l% ~printf("依次退出的猴子: \n");+ P7 H1 E: a* K
while(count<M-1)
3 [! A, f$ i# e* J" Z. X{i=0;
, Z* E1 C- E5 B, xwhile(i!=3), ~# h  _: v6 v" @% I3 i' w7 |2 f
{ h=link[h].nextp;- l0 L$ P4 ]6 c8 `
   if(link[h].number)1 m8 T# o8 V; M$ x8 t- \
     i++;}2 ]5 }- E5 E' D9 E. t2 E
  \" M% n3 `9 ]* H; K( V9 h
printf("%4d",link[h].number);
/ K0 x9 w. h  ?- s9 _% U5 _link[h].number=0;
) j" H! l9 U# E+ Q* x/ l% qcount++;
* c& P' c: q+ C5 h. E}4 u1 y: \  Z0 Z& {% w/ x! y
& M3 U7 N' I6 k5 l' R
printf("\n大王是:");
8 f2 f* p" e: n  for(i=1;i<=M;i++)
% B2 |) B, L; c- R( i$ q$ Z  if(link[i].number)
2 I* I; s) q: m! ?& C    printf("%3d\n",link[i].number);- f/ R5 v$ L7 O+ c9 q" n# j

# ]/ g. v0 C# f2 N
  n* b* Y1 D* f}

+ ~+ ]; a8 ?- X第三种是普通方法for循环
( ]2 }4 P  Z9 m/ g, O3 d8 d
#include<stdio.h>
7 C- l  F: f. {, a0 Fvoid main()
5 m" }2 \" j2 _0 l8 y- R# {% B{ int i,k,m,n,num[50],q,*p;* J3 u: k; V& d% l: |
    clrscr();7 A$ G8 @3 V) Q- }  W
   printf("input number of person: n=");- n$ v8 A+ n# n! u! I( I3 n
    scanf("%d",&n);
+ L0 `3 x4 G+ e3 J; j$ \% hprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
4 Z+ ]" U& M0 A6 S* U    scanf("%d",&q);
7 y( D) `6 b+ T5 P   p=num;
1 m, B5 G( g1 h$ a. d0 V* j  for(i=0;i<n;i++)
, ?, x- p- q) }( [    *(p+i)=i+1;9 J+ {) \2 y( S$ ^, h3 @  `
   i=0;
6 N! c# s% v5 n6 d, u( ^8 x0 |: m   k=0;  F" x- b) L) b3 J  ~* G
   m=0;
$ q) ~) u- K0 b# G' [  while(m<n-1)) c& m$ l3 ~+ \1 G9 h: n
   {if(*(p+i)!=0) k++;/ I; W8 L. Y. o. @8 A& }2 L
     if(k==q)
$ c! B  H1 x8 e( s4 x9 S      { *(p+i)=0;+ W; {: k% n3 {9 x; Q
        k=0;
2 L2 t8 l( D) h: z! F3 e2 l        m++;
% \$ M( Z: M; a      }- I% R4 |( C9 E* c
    i++;
5 W3 v$ Y* X/ h3 H! u( }    if(i==n)i=0;
& |5 u  A/ s8 r6 O! ?3 r   }
0 z( Z& L% Q! o3 B/ O' T" B  while(*p==0)p++;, _' B$ W/ }; P
    printf("The last one is NO:%d\n",*p);
! i5 b' T$ [7 Q* f     getch();
8 ^" _4 L7 H) ?2 W
+ U- Y! b: o# x) G8 v6 X}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;7 M9 L2 u& L8 ~' E  s
namespace 又费马达又费电4 o& d! `! s  f/ Z
{% k* \- I- @' Q1 O3 |" P$ e4 z. w. M
    class Program
, u, v( N3 g! {) j1 i    {
+ e4 J* N* T- U$ \        static void Main(string[] args)
9 ]8 e8 i# D/ r& m4 Q! x        {- ?. N* F$ ^& s" Z3 e6 V( A7 m% `, E
            int m, n;9 t. D; y$ \  I
            Console.WriteLine("请输入数组长度");
5 M; C; i0 e' b6 n  A. x9 s            m = int.Parse(Console.ReadLine());//m为数组的大小
* \7 p4 w0 X) B0 m            Console.WriteLine("请输入要截取数字的大小");
$ W* D4 X0 o" ~& l            n = int.Parse(Console.ReadLine());: m/ R# Q8 s% z; t
            int [] numw=new int
( \( ^7 e; \. L
/ |+ n8 [% c2 i  f&shy;&shy;&shy;;0 D  w$ [% V) n% `8 B/ C/ _4 L
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
4 |) s9 G6 V5 x8 G# Q            {
. N. }  u8 n. v! k                numw[j - 1] = j;; s# V4 H$ F% j; [, x3 @& B
            }
; _$ x/ }" w& D/ `2 N! j            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!' A* M+ w" I* G. s/ g
            while (d != m - 1)
6 M+ O/ |" Z* G& F            {
5 G+ a- T* x2 I. `1 f/ R7 k                if (i == m && d != m - 1)0 o# _+ K- }$ m' g. I' ]+ e+ y
                {
9 R. A! _9 D* s3 G! W- \+ B                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
6 x1 L) z. U' ~  ^3 a! n                    continue;
" C* F0 C: G& c                }
: c: k+ ]" y. ~' T8 T                else
; K( u4 N2 u$ Q8 `                {
" k2 b: k9 A( E0 f: u: t) y, Y                    if (numw[i] != 0)
. i, q% h- a& V+ W                    {
9 L" c; ~9 O5 {# v% e                        i++;
, H. u) X. c8 I# `                        k++;
$ p( d2 `" |' q$ c$ T" K8 o( ^: U                        if (k == n)/ m, e4 m. ~9 I  R) A1 x
                        {
- X4 @/ x, d* A3 _. C0 c: M                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
8 a/ @$ S+ T# v  _/ {; I                            k = 0;
0 \+ U% M; h; l& ?. X1 P              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小12 o$ `  R/ n. Z$ J
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
) \3 T9 c7 m: R) d- W                        }
# N4 R  O" l2 l. x                        else//输出暂时还没有改变数组元素的值
$ V- p8 T0 i8 m3 G2 S                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
/ X: q( F1 v7 k+ Y+ B' N                    }$ |  c/ K8 c! p  U0 o- }
                    else& d, p( U% k/ ^8 h) V
                        i++;//数组元素为0,直接跳过,不计数。。。
% F; l( B) g+ {4 ^/ p% Z) L                }
# U6 q2 O* L  f! y " Z! n! c- }: @% _$ F3 ]
: e- Z: i) T  E7 M
            }//结束while循环
4 g$ @! }; x# y            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
6 N& S( B/ \' s# @1 D5 s           
! t/ k  E2 f) r2 C                if (numw[i] != 0)* h7 q, k0 a, V$ f" u: r
                    Console.WriteLine(numw[i]);
. F1 z+ I( N& }4 E8 T, s: V8 N+ S8 S) {           
# Y& S4 @) `* w; T5 |( J            Console.ReadLine();
/ s  T# _5 R0 B) j) j$ k        }
! L3 Z: X7 e& T# e    }
2 s, ]9 c2 d, y}
( V, X4 M& n. D- Z* ?5 L
小甲鱼最新课程 -> 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-6 20:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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