鱼C论坛

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

猴子问题

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

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

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

x
大家好!
4 C* T4 t- H; L& L8 _4 n3 u这几天我在忙着编一个问题,我用了一种方法编出来!
" l: R. Q% ]+ J: d1 \但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
& b# N1 O' T' \- F# d注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 . S' _$ ^  M; C, Z$ l
: `% a6 i* S# J& Q' K1 @3 o/ ]

7 Y' S4 x- H( I$ s! x
                            题目2 }! e: D) l( u3 o3 L. w- C
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
, ]: s( [6 Q8 n# {第一种方法:利用循环链表
7 v- M$ N. F/ E! G#include<stdio.h>2 C, [. p$ D/ P# t; v3 s* P
#include<malloc.h>
4 T* V3 t# H) S& D1 U- `  N- e' n; i#define M 8            //共有8只猴子6 _( Z) g) w0 [
#define N 3            //数到3只时退出第三只8 n* A0 v0 |; a# [1 {2 k1 I* e* z
typedef struct monkey
  U1 R; k; [4 G/ F' C; r{int number;) C3 `' X4 ]3 H9 D, F; y
int flag;
/ y# m0 E  g5 _struct monkey* next;
$ `: q: K* r! f- s% B% V' m7 E# s}MONKEY;
: Q" C4 @. Y3 D; o3 ^8 }main()
2 e* T8 d9 X7 c* U* g; }{ MONKEY *head=NULL,*p,*s;
# t6 P- v0 @& ^! Z. e  int i,sum=0,count=0;
) s7 s# L6 I1 d+ [  clrscr();              //清屏
) L+ o& N- R# m* q' n" {/ ]' A1 t( {  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
- S6 x. P1 `* x7 {; e, b3 O  p->number=1;p->flag=1;
) ~6 a4 v9 i) ~- O: [% [  p->next=head;
7 r: n9 B+ ~, g$ Y$ V  V; h# w7 m  head=p;
" P6 c/ @- H; C  a  [  for(i=2;i<=M;i++)
8 n9 D9 _& _" {0 e5 v, g    { s=(MONKEY *)malloc(sizeof(MONKEY));
. T  s# i# `0 e0 k& E% d6 k     s->number=i;s->flag=1;
! K" D  u- m! R: T, z* \: m5 Y# e1 a     s->next=head;. s9 |* o2 T7 }, \( o% f5 |! {! o: W
     p->next=s;p=p->next;
2 Q- C/ ~$ K8 V5 N    }
( x0 {* d8 E! K; \1 u$ c    p=head;
1 E7 H. s+ S, K- `( Z  u6 t4 x& l   for(;;)
/ L- g2 k# X( Z$ {+ l( I    {if(p->flag==1)
; |; ?9 A( r. g& N       count++;4 h8 h: y( b7 a* Z
     if(count==N)
8 c" v! |% {1 B5 _! F        {p->flag=0;. X' l7 `2 W! F8 I9 M( _
         count=0;
  G& c0 I  e, F" w. v/ [8 F4 I; v         sum++;}
$ a) X& B* g0 k# C7 q1 t     if(sum==M-1)" X. b( W. f: N- `* I, g4 a
        break;
$ \' q- T* u* r* |$ g0 G* z* Y     p=p->next;3 w4 o8 v& Y  k- L3 w
    }
/ Q( e+ ?, ], T5 b    p=
3 i( m& ^& p+ B1 f0 Z1 Y6 N    head;6 o$ Y" B" G1 A  f( D- T6 |
    for(i=1;i<=M;i++)
$ E2 [/ _% q* v    { if(p->flag==1)" ?! ^$ A) S% O* c
        printf("\t%d",p->number);0 e. X3 l3 _- X1 o8 u
      p=p->next;
4 s* }# A$ i) h2 i    }" h5 i- k* G' A/ t9 l. h: _
0 w3 z3 l7 b3 Z5 j
( c) l0 b  |1 O: r1 W9 O! b
; H4 W+ C9 E5 T
}

* ^- V. R5 ?! I  s第二种方法:数组
) `; f1 x( Z4 u5 r#include<stdio.h>
  B" k9 A  N* L! l#define M 83 D+ w) {+ c4 a/ ]! K  o! J
struct monkey
" W; O% c8 O7 t$ M* _7 Z6 o{int number;/ O4 ^# z, h/ c( _7 E8 @2 H) P6 W% U
int nextp;
% K' M' K  V( u2 [}link[M+1];. H" _4 V; e& e
6 i* H5 O* I% f" q2 ^
void main()  v0 R/ ^# p: V& s' ]  B0 W
{int i,count,h;$ s: B7 y( U& N' ~4 j
for(i=1;i<=M;i++)
- ?8 R% |1 ^( C{  if(i==M)+ [2 ]! l! u- v2 \" k# r5 Y" Z- \/ p
   link[i].nextp=1;0 r; I9 }+ u& ]9 |, W
   else6 R* h. y+ a: d$ z6 v* a9 l7 ^
   link[i].nextp=i+1;
5 C5 S# I: S+ q+ B. Y/ l  link[i].number=i;
. s& Q$ N0 m0 a$ e2 \4 X( |}& l3 V1 ?7 F5 ]5 i1 L$ }
printf("\n");
1 g0 d( `8 X# y# [count=0;
9 `% [+ R, A) x/ {* rh=M;
  B3 S2 x; f$ Pprintf("依次退出的猴子: \n");8 Y3 a. O& A) k) W
while(count<M-1)
8 ?4 `2 p, g8 A- V{i=0;, b  S! C4 a, Q4 P! f6 T. e
while(i!=3)5 z0 j4 _1 w2 j5 d
{ h=link[h].nextp;2 {) P! X* ?4 \
   if(link[h].number)
& V# Y$ U+ M" {- R     i++;}& }2 P9 X5 C) `5 Z

- \% D. `/ {, zprintf("%4d",link[h].number);
' t* h8 H4 l6 x5 z5 T+ glink[h].number=0;- n  e7 }( k, I3 Y) d/ ?
count++;
( `5 J1 N6 h0 ?5 M2 b  w}
+ _5 S- m% _' |: R- m
1 g( G8 \1 z4 x- B8 \" Jprintf("\n大王是:");- o, a2 J8 [; }
  for(i=1;i<=M;i++)
4 n/ ?( E$ ^" t" R. n* d8 K; N  if(link[i].number)
* }- P: k+ T9 P6 t6 Y8 S+ s& [    printf("%3d\n",link[i].number);2 l. Q2 F( [7 T' ^. ]

4 X8 j2 @* o6 P2 @- h2 @4 }  l. n% Y1 o8 K& e$ D5 ?
}

- G6 z) x/ S2 r9 ^7 z. s% i2 K. m第三种是普通方法for循环
& N: G6 o) ~4 J: ~
#include<stdio.h>
: t1 V; u$ t. N2 K& t6 w/ Fvoid main()
: `  d* O6 \; b  y5 r{ int i,k,m,n,num[50],q,*p;
  o4 P8 g' K$ q2 I3 M4 A    clrscr();" X: @2 D7 t5 `
   printf("input number of person: n=");, `6 T1 p* H7 w
    scanf("%d",&n);( |/ Z+ E9 I  \) {! ]1 A
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
9 h7 h2 e) C- Z    scanf("%d",&q);' J# r! z0 V! [4 V) h
   p=num;
* y+ s9 Y4 Y1 o; }' p; T8 x$ d/ w, t  for(i=0;i<n;i++)
4 a( @5 O* d/ \  G  y" u    *(p+i)=i+1;) Z5 v- P, V# L) A; D( Z
   i=0;" l( Z- k5 R) t& h4 M
   k=0;
& H9 }) ?7 k1 d. R# F   m=0;, W% `! J$ i' `+ q+ C; |$ x6 C, O
  while(m<n-1)0 i( J# }3 x6 J( V
   {if(*(p+i)!=0) k++;' p' F: @% R' Y! ^
     if(k==q)
$ ^" h- D$ b* q0 t3 e  |      { *(p+i)=0;
4 X' d" v2 X% I6 B        k=0;
# Q3 X9 M* a; w. h        m++;0 h% ~& w1 v  T4 C+ {
      }
1 f. v( o% ~. X0 C8 X    i++;4 {9 t" L& J/ \# {
    if(i==n)i=0;
2 h8 [0 y# Y% X   }; R; K! S/ C* ^! K! C3 e
  while(*p==0)p++;
" J" i" W. w7 z* U5 u; X+ L' i( p& o8 H    printf("The last one is NO:%d\n",*p);2 i7 N3 {/ ]$ i$ E9 D- L2 M
     getch();
8 j; t6 ?; o2 r3 ]8 T" D+ J8 L+ }0 _3 G* `& ~8 u% B
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
  [3 \6 @, M' H( S3 C& J; L! knamespace 又费马达又费电
% M% d  o% C+ _& e( c% Y5 D# V{
  R; S4 x2 S# F# ]    class Program* H. Y5 V  z+ U, \' S' Z, R
    {
' K, C6 h" q; {: ~        static void Main(string[] args). |/ k( n( m9 R$ p1 r0 o
        {  `2 \. R% H) J' U
            int m, n;
3 u# C* g, l  a6 ^) ^$ T( _9 {7 G            Console.WriteLine("请输入数组长度");
' _' _7 ]0 D  m- k4 D! [( ?7 S. B            m = int.Parse(Console.ReadLine());//m为数组的大小2 z2 h& Y1 Y( q5 t* P
            Console.WriteLine("请输入要截取数字的大小");
6 T5 v5 C. G' v) g) Z3 a            n = int.Parse(Console.ReadLine());( g3 D. g; e$ e# a
            int [] numw=new int
. {$ D/ B  c# f: }) ?1 R/ w* K+ }. P0 d: i
&shy;&shy;&shy;;
1 D  S' K) \1 s& w) g            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数& F0 n/ u. G+ k' R6 K. r
            {' \& ]" @+ e/ ^+ S$ q; S8 S
                numw[j - 1] = j;* ^! @1 O: n! D7 o& d
            }  F0 {: p' {& H
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!" r9 D% Z$ o0 w  n) ]# w$ K& ~
            while (d != m - 1)# p4 i  P+ q; P/ a& Q- V/ R
            {
9 N2 o8 q$ l7 K' U                if (i == m && d != m - 1)6 m* A: s$ q) Q# I1 `" z  o( @  T
                {% o  T) Q( M3 r3 k) Z$ S
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!( _; o: H9 q# ~" A# ^" o. ?
                    continue;7 |) H. S% Z! C' T3 {
                }: S  P! W" F( _
                else* r# i1 K1 A' H+ C
                {
8 V: ~( d1 r4 l9 u) t1 H                    if (numw[i] != 0); z2 W; }# o1 o$ V3 C
                    {- O% F3 ~. N. {
                        i++;
' x2 h4 v7 U& L" ~: ~  H                        k++;# Q4 `6 U) H( E$ ]# z
                        if (k == n)
0 x- j7 g. _0 M  T- a$ r0 z3 g                        {
" N0 O1 d, y% B4 I                            numw[i - 1] = 0;//把在n位置数组元素的值改变了$ I5 I+ e* G5 q: b7 C) o4 D0 {! L
                            k = 0;
  {& p& G. v" C, y: U3 [              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1' n: I9 Q" {' `! s/ ^+ o
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
+ l; d$ |* ?6 |                        }
! R7 b+ E% `( }+ c# w9 P! K0 Z) ^                        else//输出暂时还没有改变数组元素的值9 f% |6 o  J! f
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
& E4 E1 h8 [2 S                    }' P/ b" S$ \' X; P% [
                    else
' ?: s/ C) f2 g# {3 P) B- J$ f9 C                        i++;//数组元素为0,直接跳过,不计数。。。7 q0 D: h9 U$ u+ i
                }
& N- S$ O' {' x( ]# ?. a! R9 l$ A' u
+ m! C* V. \# c: O9 F7 b; N
- z: L" X& R! [, _9 E5 D            }//结束while循环# ?' b, T9 k" d, Y
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
0 i" }. F: R  [! v# {" f           
; b' x( s: m4 t/ {  p2 o" [                if (numw[i] != 0)- P- y' F+ w9 e* Q2 `8 ]
                    Console.WriteLine(numw[i]);
* q5 z( g, b: x# _: `! z  b           ) M. j' W" f$ {2 O3 V
            Console.ReadLine();* ?, o: @, z" l
        }+ v) K/ `  n% w5 L- _
    }* I$ S4 Z) `! }2 u6 _
}
! y# Z: z% R5 c. @3 e4 _8 B
小甲鱼最新课程 -> 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-3-26 12:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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