鱼C论坛

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

猴子问题

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

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

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

x
大家好!
0 S8 n5 l2 m! e  Z$ ~这几天我在忙着编一个问题,我用了一种方法编出来!: N+ ^9 w7 Z, W
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
6 N( w9 {: J; Q7 L注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 ; j6 w* z  e6 H, m/ _4 d
1 e) v8 O" c$ k+ b
5 n& p$ w: n9 Z' ]& t1 e& c: H" N
                            题目
& ]" e1 A9 f, f( x) ?2 B山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
+ h+ l! s) P$ H' Z: b# I6 G5 @第一种方法:利用循环链表
2 t# s5 X- @2 g! w: t#include<stdio.h># M" N* ^. L' ~. ?% Q# t. ^
#include<malloc.h>
) }! Z3 X6 W3 M2 y" v#define M 8            //共有8只猴子# B4 ]1 C6 Y8 C* m, q2 |
#define N 3            //数到3只时退出第三只
; L, C9 A5 ^, B4 r; S8 ftypedef struct monkey' e  H1 |8 W6 \2 U8 M$ I1 M
{int number;8 g0 Q8 W; v5 d& M+ h
int flag;
, P& C+ f" @# Y! Ustruct monkey* next;
$ V" j( F5 d2 ]  a, E/ ~7 O' w' v, u/ l}MONKEY;/ K( [  l2 l7 g
main()3 I/ X& R4 k. e' E0 t
{ MONKEY *head=NULL,*p,*s;. w: e) g  n4 ~% z# J" ]) y1 u
  int i,sum=0,count=0;
: m: r1 M, N) S5 K7 P% @  clrscr();              //清屏
( a0 Y  T. h3 {4 Z  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存+ Y! @4 ~! M$ t' C4 D  i! |
  p->number=1;p->flag=1;
  P) N- U% t  k# c) }$ q  p->next=head;2 D: M  }) ~" _' s9 Y. @2 F5 L
  head=p;
1 s4 s' p' v2 ]2 s3 @+ z' }3 u% T  for(i=2;i<=M;i++). I1 |) E1 Z0 y- ~7 b  z
    { s=(MONKEY *)malloc(sizeof(MONKEY));
( q! H& w; u! H+ V     s->number=i;s->flag=1;0 h' t2 [6 D3 p6 w
     s->next=head;- {* h8 K( f2 \+ B, `
     p->next=s;p=p->next;
5 B; Q* _0 n; v& |5 g5 x. k    }
2 F( W- F6 f$ i( x/ N    p=head;
) Z+ w0 W' K6 C1 u5 Y9 j# d% A/ u   for(;;)( O+ ~/ ?6 N- p) r
    {if(p->flag==1)
% T; F' c/ T. K7 k% H+ m       count++;
# b( G( E. A, Q7 `7 ^5 X     if(count==N)
/ v- a* E% M; X$ c; ~. r+ I0 j        {p->flag=0;
; b+ B- z. a& Y. F/ c8 i' r         count=0;2 w8 |4 s1 r: E( M
         sum++;}
2 a+ Q% w  s. c3 Q( p7 f" u+ N     if(sum==M-1)
. A2 n+ I  z$ s8 ?        break;
6 N: l, a! c+ u& Y7 K; h( }     p=p->next;: D* O9 z) S. f, m' i
    }3 h+ o8 h! U/ ~$ K. l
    p=
+ M. L' m6 t/ x    head;
5 F1 \% ~1 J  |    for(i=1;i<=M;i++)
; Q6 ^0 N( T6 r( C3 U$ y5 b    { if(p->flag==1)6 l. i, q) a$ W9 N# v
        printf("\t%d",p->number);
# C; Y& c* |4 @! F. {9 m      p=p->next;/ L& F/ O5 _2 Q$ y% O
    }" Q5 f( o. n: ~2 M0 a
# `* D: D# l) ?( O. \
, v9 S( V1 A( g* ^
9 G( l$ X9 ?5 W
}
2 R/ Z* j  T( |& \/ ?  J
第二种方法:数组
- K& z. t8 T. O6 r7 J#include<stdio.h>$ F) x- X, C5 f. v/ J! `
#define M 8$ v5 L4 c( R# ?) s; Z2 |
struct monkey( Z- @0 B/ j6 J$ A+ a8 H6 b
{int number;
  _" u% ?5 z' C2 `' e1 ^! Jint nextp;
7 L& d2 ]' K/ ~}link[M+1];; V& C6 A, N. J

$ q% i) p$ _( W+ j$ Gvoid main()
2 P. N6 Z: Z7 y4 z! `0 ~6 i{int i,count,h;; x: h- x! j7 Y+ ~2 E/ r, j0 v" ~
for(i=1;i<=M;i++)
) M" T* e0 Y6 g1 y  k{  if(i==M)6 Q% R$ h( U! p
   link[i].nextp=1;" E0 i- w; k5 ^% L& {! L4 s; C) j
   else
; n3 Q1 C$ X# n' b7 `. u   link[i].nextp=i+1;9 q0 i/ h# z4 V# z; {! k
  link[i].number=i;! D9 J/ X  l3 i+ G1 p" {  i; I1 j
}
3 W% M0 S. Z! n. p- x/ U: ^( d9 ^9 sprintf("\n");& l/ U& w( b0 j, l0 y9 s' v
count=0;
0 P; @5 W4 {& z- D& Yh=M;
' [, Y5 M' @$ K. l/ d( ]printf("依次退出的猴子: \n");3 J3 r; ?7 s0 W+ C! y% s+ {
while(count<M-1)
3 f! k, X) v( O: g9 C: k{i=0;1 C/ s5 f1 Q8 R! E$ @
while(i!=3)
4 A! W- j/ N3 t( Q! H{ h=link[h].nextp;( `7 J8 f9 k& z/ c! z5 T
   if(link[h].number)
; R! Y( L) ?6 B" P$ A5 B$ k     i++;}
$ x8 M8 N: G; P2 e- g3 G' S/ i1 K- k! H6 {" T/ p7 j
printf("%4d",link[h].number);& E) M, m& V* g. m; m
link[h].number=0;8 o7 m% p2 F1 }
count++;
. u9 z% Q1 C  w}  h2 E4 g, n8 N
9 n8 R+ w: J6 A# O% n. \) G8 o6 V4 e
printf("\n大王是:");
6 {3 r4 ^9 |" {+ B  S; `7 `( j  for(i=1;i<=M;i++)
5 k  o" M; r  V( Y, K& C4 ^  if(link[i].number)
3 x4 t) z3 J) b+ f: M    printf("%3d\n",link[i].number);
: [7 p0 I* Z- u  b& Z
# n6 m( ~7 s' f
% D! }3 X6 R% |& z}
" z) j" i2 z  `* b7 h: T6 L
第三种是普通方法for循环
# a* a* a$ l. i8 Y3 |: k/ R
#include<stdio.h>: b( T+ G: _# z) n
void main()
- ?7 y4 ?/ I; R- o  [" |: [4 I/ B{ int i,k,m,n,num[50],q,*p;& U- _: k* g6 c8 N$ Z( H! t
    clrscr();8 n% c9 @$ w% b
   printf("input number of person: n=");
6 `" r8 f4 x- d  o+ D    scanf("%d",&n);7 C4 b" L8 i2 x! s0 |: W
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
4 P  o3 J( p# W! C9 N: ^. [    scanf("%d",&q);
6 P1 B$ Y; b& }   p=num;. H4 f+ g; J' ]2 O" S  s0 B( @, C+ e
  for(i=0;i<n;i++)
& K. |( Y; C4 J# J/ `0 _    *(p+i)=i+1;
. p" p" }! Y" R2 v* d+ Q   i=0;$ z' i  q) @/ `7 A
   k=0;: X' _) A5 O5 a2 r
   m=0;
! ?4 ~- y" o; D7 C) m$ v  while(m<n-1)+ q: F; ~9 p9 Q- L
   {if(*(p+i)!=0) k++;+ S1 Z. a. P5 S
     if(k==q)4 V% }) z7 \" e' Z3 Y+ t  _
      { *(p+i)=0;
1 [( |6 u8 l5 b  o8 r        k=0;9 v$ w/ j6 B3 f4 H7 P
        m++;% ~4 P( @8 Y  D! [# Y
      }
4 o8 K! c1 p: D& c5 v& I( @    i++;6 F1 L/ d* K) d' n: \" M
    if(i==n)i=0;
  i$ ^2 S: O/ E$ J8 _   }
! d7 O! Z0 u) ^2 G, F2 N  while(*p==0)p++;3 V% K. T4 U% L, T
    printf("The last one is NO:%d\n",*p);2 h1 V% \9 E, Y/ m, D$ ?
     getch();
5 z, f9 W) E; @6 |
$ g6 f# R$ m& ]5 F# B. k! }}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;% Z! d9 y3 H* K! }- O
namespace 又费马达又费电
% ~+ v; O+ F6 A{
, K9 Y( d0 w) b    class Program
6 Y! p' J7 ?$ C4 g# m    {
! C# c( j& `, d+ ~        static void Main(string[] args)7 o% Y$ X% ^4 w  ~6 C
        {4 g$ y9 E! d" D. ^/ v6 \
            int m, n;
8 Y! L. g' w0 r8 D6 e! I            Console.WriteLine("请输入数组长度");
- p9 z4 C$ A) c" p. }- t            m = int.Parse(Console.ReadLine());//m为数组的大小
3 ^6 L3 g7 d" G7 D0 u) Y+ P. ]8 ]( K            Console.WriteLine("请输入要截取数字的大小");
4 x: ~& |8 U) M! m+ E            n = int.Parse(Console.ReadLine());" d$ H9 O, A6 W0 A. g
            int [] numw=new int
. q+ F4 C7 i( z) u. c$ r1 F5 l3 y. g0 n+ W$ `
&shy;&shy;&shy;;
) r3 V. \7 ]. G! S' R' S: }4 F3 @            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
/ N5 S1 n5 _3 A. W            {! U: M' Y" H0 X' ]7 \# }# {* n5 @5 d
                numw[j - 1] = j;+ W9 Y5 h2 @% s
            }
2 T0 b1 t/ c, U! Q7 b# ]2 e* p- {            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!0 B3 Y; c$ c6 j- r- P0 o
            while (d != m - 1)
$ o$ j) _* X1 Y5 V/ h; R$ H            {* S+ x5 J8 f: Y& ^- ?4 K
                if (i == m && d != m - 1)/ m$ i" P) y$ |+ l$ Q$ C( h
                {+ j8 `. p2 z* J3 b
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!/ `$ C" Z! H4 U5 s' |
                    continue;2 E  L* C" H3 D( [+ s% a2 n1 C
                }! `3 V0 |; s4 g$ e" J; q8 `$ z
                else
# ]1 @. z- R8 O4 n7 R+ @                {) r+ a( X: K$ @, k* W/ i1 Q
                    if (numw[i] != 0)
& _; h! ^, w: x7 j0 ]                    {) l- A! P4 Q  q% l: j5 G: w' p/ N1 p
                        i++;3 B" g. Q" w$ E  v* T3 s$ m
                        k++;
0 x2 {! l5 f* a' U# j) D) |                        if (k == n)
$ S4 `, h# A' v% I- g  T                        {
0 z+ Q2 H' Z& v& |0 }1 l! `                            numw[i - 1] = 0;//把在n位置数组元素的值改变了5 S3 _7 Y" R0 r' S$ S
                            k = 0;
6 u0 c8 V+ L: j( w3 m- _, y              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
6 ~5 a6 Z! b' n* u) g' u% B                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
- X, P4 k4 l/ l* v# ^( y' i# l                        }
) K7 ~0 n# T( ~  z                        else//输出暂时还没有改变数组元素的值
* g! M; f2 z5 [' I                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; k1 ^6 S4 E7 Y. f! L                    }5 V3 l% I: ?3 J3 v3 [" [* P' S$ _
                    else
  h3 A( K7 F" f                        i++;//数组元素为0,直接跳过,不计数。。。
0 R7 n; ?- n% m: I- g" U4 _. o! M                }; S/ z& R* i/ l: C! S# D

! o. Q$ q/ e# x0 @; `3 l  T
. c4 r( L* z9 j8 u8 n- m            }//结束while循环
/ v3 |8 q8 b  A( N! n1 h! t            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
+ @' t& O8 @, l. L" k( K' U7 h7 `           
+ z1 }( {9 Z2 V# G, |- x3 ?8 g  D9 C                if (numw[i] != 0)
+ M0 @5 ]7 V( R& K                    Console.WriteLine(numw[i]);
8 G* x8 I# z& R% V8 x* @" Q           - b, Q) `7 T: l; {; v, @9 g) j* D
            Console.ReadLine();
6 X/ U0 T, Y8 z2 J        }. h8 b) E+ V9 @# n6 H  r) q
    }
  u( [6 l  V7 b6 ?6 m}
' U  @. k4 ?9 B0 D' G# 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-10-11 07:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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