鱼C论坛

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

猴子问题

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

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

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

x
大家好!3 a  u+ f6 g) y: r- \+ Q& n
这几天我在忙着编一个问题,我用了一种方法编出来!
  Z5 r0 |5 f9 v; D+ S+ B但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
3 k7 O; [; n/ D4 z注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
, K+ h4 _- W- U' Z, U. |
5 \& }, r$ R. j+ ?. p3 U, k3 s( E1 m
1 X1 `2 h$ W$ L' E
                            题目
* y2 c# |8 ?7 Z( P山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
/ R4 t0 Z: |  t; o第一种方法:利用循环链表2 D" `' J; U+ [5 a3 W3 u5 A
#include<stdio.h>
9 I" R! K3 V3 T6 R; m6 k* w# T5 P#include<malloc.h>
" v0 M! C0 C3 I) f  V#define M 8            //共有8只猴子
, |. P! ]+ G* C# N1 t6 Y#define N 3            //数到3只时退出第三只5 }; n# n& @: ?3 l/ T- s; U
typedef struct monkey/ S' f" o% |; e2 J! x2 z' l
{int number;
8 T) W, f( Y. N$ _; N4 ?int flag;
: v# d0 T  t: M2 h; M1 b2 Wstruct monkey* next;% q) J- y# [7 `7 o" k1 f0 h& L
}MONKEY;
3 }  l7 P3 Z! L! B+ P7 |% S  l3 D& Mmain()& J9 G% n# j( V5 X/ d' F
{ MONKEY *head=NULL,*p,*s;
% g5 m; D8 O+ R: a+ g/ l$ y  int i,sum=0,count=0;& j7 E# G: [- u, }4 H
  clrscr();              //清屏
. E0 i$ R& y: K  w  S  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
3 O" u1 \" g, D; X1 F* f' J  p->number=1;p->flag=1;
2 ?! E( {+ a) J  p->next=head;
8 H2 Y* C! @) b7 Y. b$ k  head=p;$ G$ B8 n& M& A+ v  A( S
  for(i=2;i<=M;i++)
  B8 T( \. Q" M% d    { s=(MONKEY *)malloc(sizeof(MONKEY));
% L+ i2 y* j7 ]- n! ?' D. Y     s->number=i;s->flag=1;
+ d5 _8 a! v5 R: r     s->next=head;; r) J6 _! D- k$ ~0 p2 ~5 g
     p->next=s;p=p->next;. j  u! |5 D2 R" ^% A: N' ^! j* T
    }
1 ]; N) w/ Y# C2 L" X+ D8 g    p=head;$ T& A, R& _9 P. N
   for(;;)
- v* s5 c: a' M* C6 d) z, O" s    {if(p->flag==1)* G& E. F/ n9 n$ y( s* E% e! l. s: Y
       count++;
2 M9 k- }' i5 B. J/ U: Q     if(count==N)
0 s+ o0 L3 u% a. A* x        {p->flag=0;
" C  C) m  ~& B: f, G6 p         count=0;; r$ i7 S$ g4 b* I
         sum++;}
$ B( F1 [: b- p% m     if(sum==M-1)2 A5 [5 M' k7 Z8 j0 [# z' A
        break;/ `6 I; T% }. t1 D; V9 _1 A! J
     p=p->next;
; V- n$ c6 m- m* k2 t    }5 u3 F+ d4 Y* r9 [2 T9 M
    p=! ?  d% B! h; d  T6 {: {2 M
    head;
$ G( Y: w- Y# a5 H, Y2 Y    for(i=1;i<=M;i++), l/ K* e- R8 q% I9 \- ?1 R
    { if(p->flag==1)
* Z$ @6 V+ V5 c: n        printf("\t%d",p->number);
# ?$ G. t% @! J" \1 d      p=p->next;
' j- I7 r' V3 l! f9 a$ F    }
1 Y% z0 P5 p) p
/ y8 N4 C4 H; s% O( k$ K0 j  P1 L* S! [

; ^8 z. |9 z. z7 x' E- |* C* v& ?0 X}
$ T$ ^7 Q, M$ Q
第二种方法:数组
3 Z; P7 m- t" P' _3 `#include<stdio.h>
- S% e( m. G1 M. r  p1 c% T$ U#define M 82 F2 F, a$ e) U0 G* H
struct monkey
" _; N4 c! x; A8 M) L6 {{int number;2 O! {  ^/ j, ^7 ?6 w2 z  T
int nextp;: {7 t% a' l. N8 }) [$ a% o
}link[M+1];
7 N9 i7 t; X8 _* V, t4 ?2 R
. V+ o/ _& `" ^& p; f4 h2 }void main()9 `! R7 i! a- P+ ]  F
{int i,count,h;6 A7 [, O% V$ D+ S, j
for(i=1;i<=M;i++)* U* \" [% d0 s
{  if(i==M)
" m% y- F9 S2 @3 T5 A   link[i].nextp=1;6 h1 f& c0 q, d9 n9 i
   else
: ?2 @1 e; V, d# T: i! i   link[i].nextp=i+1;
0 G$ y3 O& {) S) X& i  link[i].number=i;
( Q" `' t- y6 }}
- x: |% q; j( f& xprintf("\n");
( H0 y' \9 s2 m3 P$ j, acount=0;
: m/ x& ], j! p; Bh=M;( q" D( a) \- e7 f: G, `* D/ E
printf("依次退出的猴子: \n");
/ e# d) b. X' o* _while(count<M-1)3 P) F( A, D: o8 e
{i=0;! J( x! q' G+ e* p
while(i!=3)/ s, K0 k$ C6 }2 E
{ h=link[h].nextp;4 y$ @7 {/ }. `6 B) s/ u
   if(link[h].number)! I2 Y) }% L' `( }. P! r9 S
     i++;}
$ }9 l7 \- e% I# G! D
+ s( Q( R: `0 U" [/ R: ]0 U5 Yprintf("%4d",link[h].number);
0 N+ H% H  D/ E5 _1 k5 ilink[h].number=0;
% w3 e5 D3 E' }" Q8 H/ ^2 f0 zcount++;" A1 ?4 H' A4 j" P7 B; C
}
$ ~4 m. w; h! _1 S+ H
9 J  |' w$ }+ R; _! n% gprintf("\n大王是:");+ M0 B% b/ ~# e
  for(i=1;i<=M;i++)5 k! I8 \$ N0 C
  if(link[i].number); E8 L6 {7 j$ V* q0 M
    printf("%3d\n",link[i].number);# g1 w3 e4 y! i2 v# H& B5 {

; O! J! F4 _, w3 r# T+ S
' l+ q) S5 m0 b9 C$ h% Z}
8 l2 g& H& a) _+ ]& s
第三种是普通方法for循环
% D0 p" ~: M5 f: `! Q# w
#include<stdio.h>* j& q  U+ [( n7 P4 v
void main()% f! x+ E2 C3 }" F( Z7 X
{ int i,k,m,n,num[50],q,*p;, c% Y7 g$ j( j' B7 b2 u3 ]
    clrscr();1 b* w. z# w, O$ E
   printf("input number of person: n=");& ?- s' B2 s" f  z
    scanf("%d",&n);
6 @; y8 e8 e9 [1 f" Bprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
- |( l  S- ~3 K4 g& Q) N& X/ c! s    scanf("%d",&q);
' [- U# t. y) r$ `( Q2 |   p=num;  ]+ v' A4 a$ h  T$ V
  for(i=0;i<n;i++)
9 a6 p. x, @! I6 n& N1 T; Z% h    *(p+i)=i+1;
  `; {* I0 D5 p5 h! r1 [8 h9 T* m   i=0;: s' z5 M3 S# ^
   k=0;+ Q# g, {1 h- ?
   m=0;! g1 E+ k  ^" Z- j8 I2 \" G
  while(m<n-1). I/ v5 @6 t. n/ C
   {if(*(p+i)!=0) k++;- J& i4 _7 l! A0 c
     if(k==q)
% T4 V3 T1 b* L; w      { *(p+i)=0;
) n2 f& r; \% p5 m! M: L3 M        k=0;8 y: {7 N; \5 u
        m++;: b( w9 C% h4 m
      }
: `- e, h7 d+ C9 I+ N    i++;
; g0 i8 L; H, R7 F8 M    if(i==n)i=0;
0 {# t  F5 @- H4 c% C8 _   }7 l1 ?& ~$ b$ G' G% y" ^# M
  while(*p==0)p++;) @3 L6 |- n' q& I, G
    printf("The last one is NO:%d\n",*p);
; H/ _9 o+ B- k/ A* T' _     getch();
8 M8 }8 M- n" w; g7 s) @8 w- E5 v* f+ h4 a& t
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;3 ~; Q. i1 |( y
namespace 又费马达又费电
! F9 r3 U* P( U% |: b{$ e, N4 ~) O' V& z: V2 ^; d' R
    class Program6 W- S7 i6 @$ O6 i0 ?2 J5 L( e7 M& V
    {
  |6 U9 g6 P) S3 i/ `# `        static void Main(string[] args)
1 O+ u7 ?" {( t! F1 v        {
8 A  {# ?8 e# ]  w3 h9 T; L2 h            int m, n;
8 R+ t3 W! m( p; X9 o: {            Console.WriteLine("请输入数组长度");. H, W& F2 }% i1 U- C4 }# N
            m = int.Parse(Console.ReadLine());//m为数组的大小! J, f# s# V/ N, u" s
            Console.WriteLine("请输入要截取数字的大小");0 G3 I$ @! D, z- @
            n = int.Parse(Console.ReadLine());
# `# O% C0 a9 P5 i0 p            int [] numw=new int
3 o0 A' j0 A8 W2 Z; C: W. }7 H9 O
&shy;&shy;&shy;;) C; u$ B& I% W1 u( w
            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
% _1 w) _. n& \* T- t            {
$ Z$ a" p0 M. b4 j6 |* `                numw[j - 1] = j;: g4 g9 M/ ~6 r
            }+ C/ n# C, m+ p) E' ?/ R5 ^
            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
" P8 T9 ?2 _, V            while (d != m - 1)( K+ s3 N  ~0 ^6 P
            {
9 i) Q4 X0 \  O$ I  a) R                if (i == m && d != m - 1)
" G" {/ r% i+ m$ ^0 U                {- f+ f9 @7 n  k4 B$ e2 Y( f
                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
3 k3 K+ [* m( q+ P1 c0 o% B+ P                    continue;
  a- \# M8 e0 z( W" ]' }1 Y                }
6 }& v3 j6 f* y; U9 h                else
+ R$ L* u' X. G) o, \; \9 R7 n                {
3 T4 Y% m% R) x, ]) A. g                    if (numw[i] != 0)
1 C4 t2 W0 O4 |9 o3 z                    {
( ~5 |+ }. e; p                        i++;8 x% O7 i. d* B+ o
                        k++;0 @9 T( I% }4 M: a. C! i
                        if (k == n)
, t2 C) R0 _+ V2 j                        {
  _, `; X% ^5 v! X                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
. p* F4 ]. G8 e3 K: G+ \' V* x: s' E                            k = 0;
# I9 p( M% }# {- M, p2 s+ t' K0 m# Y7 o              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1- q8 j9 F0 Y4 N! r1 k# W
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
; V% Q: q" l7 }! r$ g, i                        }
7 F' T% p0 Y- y# S& n/ ^5 P6 k0 z                        else//输出暂时还没有改变数组元素的值
8 R# g& e: n7 |# F6 K; q+ {, b2 o                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);% l, W+ T, Y) J3 c5 ~
                    }" d5 j0 g  v1 P6 D# @0 |7 G; \# W
                    else9 L1 K! O* W6 ]8 Q
                        i++;//数组元素为0,直接跳过,不计数。。。
6 A# [8 z5 x' o                }
; [, ]- W+ S' A+ J6 D' ~$ ]
  H/ w1 m3 i7 `$ L( c, S' P5 N
7 p5 T0 [' g) a2 y5 w" n            }//结束while循环* D3 T- }+ F! E
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
' n. W: G/ y$ n: C7 d' x! N) c% U           
4 g) R: b, p7 i# G                if (numw[i] != 0)
' P& n4 @9 F+ R                    Console.WriteLine(numw[i]);. ?& Y6 M' w4 @2 U$ Y
           
* y/ N$ v# X- t2 s( F2 r/ Q) w, A4 |            Console.ReadLine();
& W  @$ m: z' O        }
4 h! {; y, q1 G$ S    }/ r7 v9 m2 A4 R
}
/ W  n) x1 {1 V$ Y! y
小甲鱼最新课程 -> 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-5-25 06:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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