鱼C论坛

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

猴子问题

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

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

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

x
大家好!( d8 h- B1 Y2 J5 p( }* S3 h# h- b
这几天我在忙着编一个问题,我用了一种方法编出来!8 f0 O0 r+ `; P1 E) g0 t; Q8 a! q
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
# ?  y8 V; C. y+ x注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 9 ]. K9 h, N6 C+ e: }

& Q  @' A$ I  Z8 p) h" p0 ~7 _2 X+ O: W. c7 B
                            题目7 j! P% u$ Q; ~: t6 x
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。4 I$ m3 S1 e* k$ g6 B
第一种方法:利用循环链表
& Z, w+ a' D/ T2 |3 B' i" L3 d/ \#include<stdio.h>5 `  a, V  j; S) Q1 W% {9 A
#include<malloc.h>) R' I2 W4 B7 I( h- y" c# G
#define M 8            //共有8只猴子
9 L3 f! a/ n/ q1 o#define N 3            //数到3只时退出第三只* x- J0 c/ G) H1 y
typedef struct monkey
1 x  }1 u7 {. c& {7 T- U0 W1 R- l* Y{int number;3 M# |/ Y! L$ B0 {, [5 s& P
int flag;
1 k% I' x+ G8 ]6 qstruct monkey* next;
. g/ U  D" y% I9 h' K( \7 t4 P$ _9 ?$ A}MONKEY;
( D1 W1 y0 ?8 z! _main()8 K. {/ Z; f, u
{ MONKEY *head=NULL,*p,*s;
; W/ B. j7 G  d: Y& J, b. x  int i,sum=0,count=0;1 z  O+ a% d) @. W1 M( J8 ]
  clrscr();              //清屏6 G, v; J/ L2 h+ T' z
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存& |* H: K: e3 q) g  j. M
  p->number=1;p->flag=1;" B$ T9 P+ ]: j( p5 s
  p->next=head;
* o0 ^0 M8 }  S, {  V) U8 {0 u# h  head=p;
. w% L% v' z+ X9 z( ?  for(i=2;i<=M;i++)
+ B. ^9 V  k1 J/ s* k' b  a    { s=(MONKEY *)malloc(sizeof(MONKEY));2 s8 ~- e: G% e- O4 |4 W
     s->number=i;s->flag=1;
0 z5 ^# [- k; D( p" \; {6 Z( \& d     s->next=head;
% l2 r8 S! K$ g. m     p->next=s;p=p->next;9 \0 F/ a3 m' i; ~) p
    }
" U& p3 {. M" P. ^. k* N" z    p=head;
  I, I, A! e" y9 c7 G   for(;;)
& f2 w; L# H& Y$ I9 Q    {if(p->flag==1)
9 W7 f: c$ X3 a0 z+ N" i; d       count++;- @: w: P% I3 R6 `2 j' Q, l5 |
     if(count==N)4 k: V6 E: B/ I6 s2 M4 C
        {p->flag=0;$ \! q, q9 w& {9 z; f
         count=0;
  e4 n$ j) K6 t$ @' v0 e         sum++;}
. P% s! d$ C, R  n6 Z1 @# o     if(sum==M-1)! A( i9 D7 v( o1 K0 A
        break;6 o: G! j  K6 m  e
     p=p->next;
  E9 Z* v8 o/ B& o0 E2 z    }8 s. m9 @! @8 R4 C3 M, O
    p=. ^9 S8 v* f" o9 H6 L
    head;
' l( ?3 p$ ]% R' _' j& Y% H    for(i=1;i<=M;i++). ~. k# ~4 D3 Y1 @, V
    { if(p->flag==1)
* k1 I, Q% W) h8 I- u        printf("\t%d",p->number);
9 S8 ?* q6 C" ]( z2 L8 j0 w  S% |      p=p->next;6 V! a5 n+ i7 [% H( x7 O  [
    }
7 t$ \+ Z2 g- O4 Y8 d7 Q
, L( _/ p& Q. o; f
# o/ D3 h( v2 l0 r: s- d( J! s2 f  e: ]3 |  a! j  u& Q- {
}
, R( G# a0 U5 z% V) h
第二种方法:数组
  s+ N1 q% G+ z#include<stdio.h>5 w5 v% l  C. M0 {
#define M 8: b/ H& {3 ]+ ~# L2 h9 u# k
struct monkey
5 G; ]2 C* i- [- l1 v{int number;4 A" I7 ~9 K5 f
int nextp;
: h- ?! s  [( W1 v) X}link[M+1];
. i! [1 n( K6 t3 b: l
" ], W5 n3 h" Y3 _8 Kvoid main()
! u% X5 _. s8 ^$ }: g7 s{int i,count,h;5 _8 J7 p/ a0 r9 f# N# G
for(i=1;i<=M;i++)
4 ~9 V: O" G5 K) \5 l{  if(i==M)& G$ G7 p& R) |% c$ B
   link[i].nextp=1;
4 v1 ^3 P7 s/ n4 J; ]& e' |& x: |   else
! T8 z+ q; O4 Z# @- D. G   link[i].nextp=i+1;! ]6 k; |4 k. @! n/ A' Y
  link[i].number=i;/ s' Q9 j7 S# B
}& Q* s; q" f! i) a, O
printf("\n");. ?% {, Z$ P7 F. `( ~0 K: {
count=0;! d$ _2 G, L) |
h=M;
4 n: L; l0 ?# P6 W. H& s* {printf("依次退出的猴子: \n");
5 D7 o' g% @7 f* ]3 Q: bwhile(count<M-1)
) I8 |& ~$ e1 h{i=0;
! _8 X7 `( f1 f) s! U) xwhile(i!=3)' q( j' Y/ U! L5 D( E+ L
{ h=link[h].nextp;
: Z; k" ]/ S, F0 u( e7 V8 X1 q& h   if(link[h].number)
/ g2 W% ]4 A7 |! j) r$ a     i++;}8 a3 _" S$ j$ R

) ]3 S# p7 f3 f9 D9 P6 Sprintf("%4d",link[h].number);9 h# h! y6 _8 v2 Q+ N, E: ?8 R
link[h].number=0;
. p, s( A+ f* }( I5 N3 I! Dcount++;% e0 {! V  w, X: {4 v7 G3 O
}; f, p) ~0 U  ]4 {; @: a
: _5 g! P6 H8 w
printf("\n大王是:");8 G* x- t& S8 _: G- j, D
  for(i=1;i<=M;i++)
) I" m  t5 ~, i. v1 K  if(link[i].number)
! O# L1 N$ X$ p& k" \* |    printf("%3d\n",link[i].number);
+ o' u; i1 e) m% M" R$ q
7 P/ e' Z3 F9 D4 U" b+ n9 B7 x/ H6 @/ t* q7 i
}

7 ?2 Z* q2 a% j4 T# Y9 e第三种是普通方法for循环
, k* ]6 h( \; ^- ^3 X( Y5 b
#include<stdio.h>
2 c6 |+ M, M! Z' H6 Z& E$ I. rvoid main()
3 t4 c# y- a9 z4 P- |/ ^4 v* k% ?{ int i,k,m,n,num[50],q,*p;) r2 H' A8 k  B/ y( f
    clrscr();, K0 a- E8 e& _( p$ X& y/ T; a9 P& r- k
   printf("input number of person: n=");; `* v; d3 O# N
    scanf("%d",&n);- X) h+ Z4 h7 L" e
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
. K& d4 s) F; L& ?. u% v0 P& [6 h, u    scanf("%d",&q);
1 |* n- Z! }7 [; e  J' |# p3 L- U   p=num;
5 [5 w- c# D! l0 Q2 }  for(i=0;i<n;i++)) S) I% Z  H3 r, U+ ]3 j$ i" @
    *(p+i)=i+1;
& I0 f# y1 R3 ]( F" G( Z   i=0;
9 |; y+ i, ~  U: f   k=0;
7 r" h# T' k  P8 G: z+ }0 E) F( E" o+ L   m=0;
5 l& L( `4 y$ S7 l4 R" O! y# P- T  while(m<n-1)! Q: G7 q8 p6 d  N; S% R; m
   {if(*(p+i)!=0) k++;) ^  Z3 ~% C$ K0 o4 }
     if(k==q)
) P2 K9 {* g0 P" ]& J      { *(p+i)=0;3 r2 c. E. T3 o
        k=0;6 M! {+ V# _" J  }# H" u
        m++;
/ o0 o: j3 N+ ?% u      }
% c2 e! u; P4 ?- A) @) Y    i++;
8 M! M" F9 q8 L- S% v* y  o+ ]! [    if(i==n)i=0;+ p0 z: p) O! ^
   }1 q4 d; O9 b3 U$ \) S
  while(*p==0)p++;, m3 u% T8 e) v# P, H8 |9 B- u4 C
    printf("The last one is NO:%d\n",*p);
1 T3 T# @$ h2 d6 j+ t/ i2 G     getch();' F6 \6 Y& i4 B4 ?  O
% i- P* C5 I. s7 w* }! C
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;: c5 x- b7 h7 V6 i  A5 l* I
namespace 又费马达又费电
' r. e! ]" A) l+ ?{
0 {7 s' K! X% ^    class Program  w# u7 S( s1 \4 {% N
    {( M7 |* A& o6 B6 \0 [0 U
        static void Main(string[] args)9 a' |  J! D# e$ Y( r
        {
7 R' f3 |. n8 F! j  z" ?& H            int m, n;! X+ Y1 M9 X+ X1 [3 }; e9 v# w
            Console.WriteLine("请输入数组长度");
5 x* m6 O$ C1 D7 h5 w/ h' r9 D            m = int.Parse(Console.ReadLine());//m为数组的大小
4 ^( u3 e) _. J; P: E0 S2 M            Console.WriteLine("请输入要截取数字的大小");
, S4 H' i8 G, ~            n = int.Parse(Console.ReadLine());
6 E* |5 `  i* m1 D( L            int [] numw=new int- A% d% K6 X6 f) O* A
/ }/ Y( O  s) `) ]! j
&shy;&shy;&shy;;" f% q! e! c4 t" l
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
5 Y  ~, D0 X9 d+ F/ h; [            {
, Z( ^# A4 T! N, K" G, H* y                numw[j - 1] = j;# I+ i6 t# o9 D( b. T$ W
            }$ r" u9 Z5 m! M" r
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!3 c! ~6 L6 G: Z7 P7 e0 M/ \
            while (d != m - 1)
. W: t! U! M; J. m( U0 m            {
9 }: J0 U& }* s1 M$ N+ _                if (i == m && d != m - 1)3 _4 I! \0 h+ H; q6 R
                {
' z1 z- u9 |+ {2 r2 W2 y! q                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
1 I9 H# g) l- U/ c" i" t# y! ]                    continue;
1 }9 i2 z- [% a4 i# `: y0 N                }, ]7 I9 w6 C( T
                else
# c3 u$ z& [1 K2 O8 U4 J. e                {
' G5 Q# d; B4 c9 q6 I; Q& R                    if (numw[i] != 0)
, u! q" X7 H) i* Y7 Y- s; j                    {  W2 \8 I$ a" y  @! `* Q7 b
                        i++;
3 r% O. Z2 h  O" u3 h( O6 s: |                        k++;
- W: `" w: N) P+ V5 T3 }1 i$ k8 s                        if (k == n)
! X5 l6 E3 h( m  e, m( C, x8 F6 O1 \                        {
' C1 B7 S' d* S, m                            numw[i - 1] = 0;//把在n位置数组元素的值改变了' y+ F$ P$ e5 E; `, a$ A, x3 Y
                            k = 0;
2 {- _# W7 T1 x              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1+ m- l) ]/ F% W, ^/ \
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);; U  p/ g1 f& }/ i9 u  x
                        }
6 l3 {9 X& C. e" v/ v" m+ H                        else//输出暂时还没有改变数组元素的值
. F( W* O' |; s, ]- n; t                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);9 ^  C% L( c0 {& H' M* A0 Q. a$ ~1 v
                    }6 ]9 @4 z6 }1 L7 a. k
                    else; m; F9 Q& h- c. v# N0 ~2 C0 r
                        i++;//数组元素为0,直接跳过,不计数。。。# [: u4 p$ Y$ t: Q6 T% l( F
                }, x+ R* ]4 @; A$ h" H9 r3 E. v  P5 \7 e* {
( W4 s' P( l2 q; D
/ Q8 D% e% U+ K5 O
            }//结束while循环$ z. g7 E& K, L$ a1 C, I
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
* R7 h% p* L! g) }, s2 M( v           " p- `3 b+ q# Y  R
                if (numw[i] != 0)
; h: h1 ~* V; h. R3 H( x                    Console.WriteLine(numw[i]);, K6 K) c) y3 u9 [
           
4 j2 k  r/ `0 H1 u" z- Z9 R. e            Console.ReadLine();" Q! Q2 m# ?6 n. _# R% G6 r. T
        }6 C: z, U% C2 g4 `1 F3 A( Q
    }
# O  t3 l5 @5 E: d( k0 g; @/ ^& Y}  L1 @  y, n2 ~; [/ @9 W& S7 A: H
小甲鱼最新课程 -> 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-7-11 06:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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