鱼C论坛

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

猴子问题

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

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

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

x
大家好!1 M" l, Y6 A, A+ \. |
这几天我在忙着编一个问题,我用了一种方法编出来!1 n* `4 D7 W) S& {7 a  L. Z) Q
但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!
4 e3 H) O9 B* i& d1 @2 C注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
; W& w' ?/ [' `9 X/ a/ S, w) T( s+ N2 I6 ?, e
7 s5 d2 b3 g; C0 W8 G' c9 \' g
                            题目" g) _5 B& o* g" ^1 |
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。; R; I. E7 F: ?$ S6 g2 ^. x
第一种方法:利用循环链表
7 Y4 l- q1 R% U2 I: I#include<stdio.h>& D/ y: e- M" U0 T2 O: f! x
#include<malloc.h>4 R4 n/ o7 x# B, H
#define M 8            //共有8只猴子4 b* g5 p4 k: X, c* A
#define N 3            //数到3只时退出第三只
4 g* ^4 i* t$ f7 O% _typedef struct monkey% N" Z6 T( N" L, C: }- T
{int number;; P  m1 ]$ d; L5 C
int flag;
0 a# Q9 ?  q/ H- N+ ^struct monkey* next;/ s0 S2 r3 ]1 h5 A9 x0 t
}MONKEY;8 a1 m- A7 U" [7 G$ m0 S
main()
2 C( f7 S) ^+ D1 z% n{ MONKEY *head=NULL,*p,*s;
: T8 M* o. {4 z3 A; W  int i,sum=0,count=0;
$ \( _4 M# I( P% D8 z5 x  clrscr();              //清屏7 u; e# m  z: O; ?
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存( F* J/ [# q& F* a7 N4 J1 N/ A
  p->number=1;p->flag=1;
) X6 K7 L: G0 a6 @* l  p->next=head;8 h- L. d( T7 i6 ^7 n% h9 M
  head=p;% c6 X9 `& e& M2 G
  for(i=2;i<=M;i++): Q+ l& G, Z8 ^3 _# w1 c
    { s=(MONKEY *)malloc(sizeof(MONKEY));& B! F) z) X: R! E
     s->number=i;s->flag=1;3 v5 z0 P* S6 W
     s->next=head;) [) e, d& E7 D5 ]' Y9 I
     p->next=s;p=p->next;
7 z  y* y" {3 G' R" y    }
3 K4 w% O; ~: k/ O6 @& J% k2 O4 P    p=head;  M$ t( R5 o; t2 o5 y
   for(;;)3 d  m- Y: _3 b3 y! _* N6 ]0 y
    {if(p->flag==1)
- {- Z8 ^) e: e/ e       count++;9 Y5 i4 O. j# h) e" O8 }
     if(count==N)9 i9 A  @" i% V% }; X
        {p->flag=0;/ N- j9 Q# N! o; b4 H
         count=0;: ?- N! p4 e1 ?0 m* t) p
         sum++;}+ U: G- {3 m8 b8 J9 r- N" m. \
     if(sum==M-1)) p$ c8 Y3 x3 r# |6 g  d, B
        break;
5 r# S# n1 |1 \     p=p->next;) b' C' X, |( B
    }
: t: i! |8 c% W, K6 G3 @    p=
8 V+ E# T6 u# g& L$ g5 `    head;
1 [0 O0 f8 g" c8 X- z* r3 q    for(i=1;i<=M;i++)
4 z1 G4 k' {8 g4 c3 F# p    { if(p->flag==1)! p4 n* W9 y4 A. l. Y+ n
        printf("\t%d",p->number);
; R' {7 ^# o5 e" U/ C7 M# E      p=p->next;+ `2 J" _3 K5 |$ b, G0 t, k
    }  }( z  K7 o! A

3 D" x4 h# I! x" {6 n" V9 `1 ~* N3 _/ c! p" S5 i( l
- K$ F) \, v4 g
}

+ h6 B" L6 R0 ~0 y/ U' q第二种方法:数组0 u& I& k) Z; J8 d
#include<stdio.h>1 S, j+ ^! ^1 T, V! D
#define M 84 X4 G2 V$ o* {  q4 L- }1 l* }
struct monkey
3 u! \5 _' L4 O7 \5 I& ~{int number;) ^* Q5 R* R4 o# ], Y
int nextp;
' A" n, X7 ]6 S; a# E  u& ]}link[M+1];
1 f6 [6 p0 ?( `/ X
4 }# ]% h' w  \- Dvoid main()* S$ E! n2 B0 W
{int i,count,h;
3 D" h8 J1 K0 W1 n5 S2 [  l2 cfor(i=1;i<=M;i++)8 c" T( y- v& b7 Z* S4 [" G
{  if(i==M)8 N% h; _5 M( |, F- K0 d5 d
   link[i].nextp=1;
# X9 k4 Z; E) |- q6 X7 w   else
7 J0 X9 O) Q6 Y; h3 Y& N   link[i].nextp=i+1;% \2 w+ ?0 M+ O" O& x: b
  link[i].number=i;
& o7 ]0 t1 H- e1 G" ]" v' E: t( t" n}
' p: \5 a' d+ R- Kprintf("\n");9 c* x# u) z" `0 v1 {
count=0;
, U/ j. }, ^5 G7 X( o! ah=M;
8 s! r& K3 q& e8 G6 q3 ^& sprintf("依次退出的猴子: \n");* A2 t1 o* F7 R, V' T
while(count<M-1)
7 W6 t+ H1 o5 T$ _, X: Q$ ~8 H{i=0;
7 V: k, x5 B1 F0 {while(i!=3)1 s5 g6 e3 \) s/ C+ q1 M" |
{ h=link[h].nextp;
! F  }. v6 _- t+ F' C   if(link[h].number)4 \- u9 j# N7 u4 l4 d3 S9 Z
     i++;}
* ~, F& k; L. X0 q3 r- P. m& R9 D* K7 r& V1 P9 x5 ?
printf("%4d",link[h].number);
( x8 j- j' A+ M  j9 q" ]* m  T7 alink[h].number=0;
6 |4 \8 U& {5 }% V# i9 ^! tcount++;8 _5 D9 G$ s8 @3 u4 |6 }
}/ X- M9 x' C4 p3 W4 e
, z% ?6 v- u& s+ R
printf("\n大王是:");
# C' G2 Y, E" `( l6 M% D  for(i=1;i<=M;i++)
7 s; v2 o$ I: j  if(link[i].number)
9 m( A$ l. @* U2 z    printf("%3d\n",link[i].number);
! S* c  N4 [, O# K( P* P2 X. q* Y/ L6 Y& F' M$ ?: K

- X, M4 D7 i) _4 z1 N}
6 ^8 C& P! I2 \+ a# U! p
第三种是普通方法for循环

4 H7 S* @9 W; y% h#include<stdio.h>
* z9 V; j  m. f+ ?+ v5 h* ~0 Pvoid main()' j0 F0 e- N3 j; D* U- X( E
{ int i,k,m,n,num[50],q,*p;, J$ f& o2 b9 z1 \# m1 q7 P* Z
    clrscr();
# A) I. A+ }) r* C0 z4 R* ^   printf("input number of person: n=");+ d/ P  }! q+ h4 l) _6 P
    scanf("%d",&n);" B' f3 d  s* C
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只
+ f7 t& c9 G% Y/ y  p    scanf("%d",&q);
% `( K' ?3 }0 Q, c; O! {9 W- _   p=num;
; Y6 j0 F6 w9 ?- g! f  for(i=0;i<n;i++)
' L! e3 V2 k  h3 C) w  q    *(p+i)=i+1;
7 S0 T, c. B, w/ [3 Q/ T9 w   i=0;
/ e; @! x8 S7 @/ c' U5 s   k=0;3 `" H" l3 H5 z! c( c0 i3 w
   m=0;
- C% h! P; j; c5 m) A3 t3 y  while(m<n-1)
6 m4 W4 M! r  a% c5 L7 B% R   {if(*(p+i)!=0) k++;4 T' Z4 I9 F/ r' M3 v9 Q8 \  G/ _
     if(k==q)# R. Z- X5 J6 ?: I
      { *(p+i)=0;
2 l5 ~( ^# k( }" C# b        k=0;
: z" I* [! X1 w9 n1 L, D3 L4 x        m++;
) J4 n. m3 ?: n* k! |9 [      }
# k  }0 l, v4 v, U* {9 q- @    i++;9 u' y' b' Q7 V/ |- M
    if(i==n)i=0;
# |" J. K! c* }; b" N   }
6 |' Y$ K+ X9 l7 n  while(*p==0)p++;
) x' ]( v4 V' C3 f" _$ I4 P* T" g7 K    printf("The last one is NO:%d\n",*p);8 ~/ a# B% Z- |  c: P
     getch();# H: g8 m" ^( h: l' s* I
  Q$ Y: f/ K) T+ u7 G4 A* u
}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
$ S, j( o# f( x5 unamespace 又费马达又费电
8 G2 G3 `; g8 [; w+ L/ n{# d7 Q, m) W7 V1 j& U
    class Program- L0 g8 J1 F0 \7 W: M" h0 v% n! p
    {
* q$ e- [+ Q  s5 G        static void Main(string[] args)$ @; \, E5 l7 c" P7 V
        {
/ v2 |! O3 ?5 W- M7 ]" y5 o, q            int m, n;- P1 f$ r& F) Q
            Console.WriteLine("请输入数组长度");
# }+ c- Z1 k, e" t            m = int.Parse(Console.ReadLine());//m为数组的大小6 y# n6 u* e% R8 d' a
            Console.WriteLine("请输入要截取数字的大小");
5 Q7 X1 E7 C4 R            n = int.Parse(Console.ReadLine());' C# n, ^1 T7 R2 i6 H, ?
            int [] numw=new int( z9 e, ?. Y6 V% ]9 j& ~) d" E
  l0 h" q# L9 h8 X' \
&shy;&shy;&shy;;
5 t9 r# a) g; c! o; ^5 x% \            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
" w! f% S$ _$ i1 P8 ~. R6 A            {
; W/ L, t) `6 Z                numw[j - 1] = j;
0 A& y, w: [6 Z            }
6 `6 r2 J& [6 U1 `- D- P0 n            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
" ~( U3 U/ G; \; x8 c6 u            while (d != m - 1)
7 y5 w. U$ H+ L            {
; d: a+ `( B, i) p' U3 l                if (i == m && d != m - 1)9 u& p5 C' }+ L! o; G
                {
) j- l1 W# L( h( e: {! M                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!( l; N( b' g* m4 Q
                    continue;
$ I8 @7 p0 N3 H" w' w' I0 ]                }7 e% G' A3 f: @
                else6 e* |' t& \6 M' j" k: b
                {1 @& T9 }+ t% {/ e% X4 ?5 ]
                    if (numw[i] != 0)
$ H9 f( l1 j; J: a/ y                    {
+ O$ _1 J9 m# T; H                        i++;8 q. l! a6 P9 ^# D
                        k++;3 U) q2 Y- \8 q4 \$ P
                        if (k == n)
: C2 t/ z1 G7 ^2 [                        {
. z7 W) u; }' f1 W$ H) E' h) E# H                            numw[i - 1] = 0;//把在n位置数组元素的值改变了: u  o3 Z; k8 o: F2 d: P
                            k = 0;
6 a; h4 N; w0 b9 ?              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
+ W! z& c" u0 B( u4 ?, }                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
$ A, s6 z* i- V2 v: U                        }1 ?" ~: b& j4 {2 ~$ p* N7 X2 r
                        else//输出暂时还没有改变数组元素的值
: _/ B+ v6 {( y) h6 n                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
2 h+ @- X7 u% F# s; F                    }$ k, _( N6 f9 D: ?+ r! M% r
                    else/ j, N: S8 f% C1 T6 e/ O: p. z& ?2 F$ M
                        i++;//数组元素为0,直接跳过,不计数。。。
- U. D  [' i4 T7 K. W) }                }
5 D1 n% T9 N: E& Q" M
" r& z2 o; r* F$ G9 b% X: }2 [4 T3 n3 o3 A4 k
            }//结束while循环) Q. L/ e5 h! P
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦, D! J* E( C2 J3 d3 k
           ! Y' U& w3 C7 ~8 L0 @
                if (numw[i] != 0)
* L  X& L3 d) r7 ~0 F* w                    Console.WriteLine(numw[i]);1 v0 A3 t7 x& v" A7 V  X
           ( N0 q6 @+ v& F2 |  t1 p3 ?8 S$ T
            Console.ReadLine();' w3 c1 E. p; n8 E/ d" Z5 d0 D
        }
* R, \! l6 V' A2 H) Q( C. J9 d    }# |- t4 b$ x5 V
}
$ @6 @2 c1 T2 ^$ 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-2-5 17:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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