鱼C论坛

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

猴子问题

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

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

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

x
大家好!
8 M3 M, c$ l6 s+ A% D- N* {这几天我在忙着编一个问题,我用了一种方法编出来!
! r; b  v7 d# K但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!7 p. ?' ?% P& {# }
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激
% [) b* S2 c% M* N) {* e6 m. u& Y! g

3 n$ f0 n; G; |; ?( A+ b7 M+ ?
                            题目  x8 ^9 B0 ]7 s
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
, V1 I6 s& R, m" A9 f/ ~5 q# `第一种方法:利用循环链表8 Y& Q  S5 l8 ]* J
#include<stdio.h>
2 a1 E  }, g( W6 y* }#include<malloc.h>( K9 A* A2 _* b) V6 U
#define M 8            //共有8只猴子7 Y. [, B7 `; x) q  _4 f5 Y
#define N 3            //数到3只时退出第三只
. M0 X0 p, H  ^! }+ e3 B; otypedef struct monkey
' N2 ~4 m& |9 |) O8 q: `, {{int number;0 s! E( c8 u; A8 ^
int flag;
% A( Y4 w" O- g% M1 E2 lstruct monkey* next;4 E5 r8 S! j8 S% u" m( F( _
}MONKEY;8 O7 s1 w5 s& R, L1 ]$ u, |1 Y
main()+ a( B% j. f9 B+ }# x  }7 S
{ MONKEY *head=NULL,*p,*s;% E* O' z5 i- Z) A; I  p: ^% O
  int i,sum=0,count=0;
/ c+ y: V$ _# o; M% `  clrscr();              //清屏. ?, ?& X4 D9 {7 H8 x
  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存
% T: q: x4 [( [5 w! y  p->number=1;p->flag=1;
- c: B6 h6 f1 D- g2 v  p->next=head;
+ T5 d3 C  f! M5 ^. r- q6 v  head=p;$ k0 n) O2 X7 l, m
  for(i=2;i<=M;i++)2 }7 e: G( }! N
    { s=(MONKEY *)malloc(sizeof(MONKEY));0 f# y5 m& v' r; ~5 M
     s->number=i;s->flag=1;, q* i5 E9 y7 ?: v. F0 L/ z* y
     s->next=head;
5 k: @; c# ~" h) t1 }     p->next=s;p=p->next;! v/ o: i6 k  F& U
    }3 ]0 l: F3 N2 q4 N
    p=head;
* ?6 C  w( G- U8 ^   for(;;)
( [# L3 p) J1 \- O4 z    {if(p->flag==1)
% W8 C$ B2 U" V: z       count++;# ^  `7 S, {. T8 H
     if(count==N)
* t! K) p$ ^$ Z$ W$ g6 D2 O+ D        {p->flag=0;. b, l, m% f7 p. {
         count=0;+ R" g, A/ u  C1 `$ t5 `! W
         sum++;}/ `, r( I. A0 Z* W7 v% h8 o% N
     if(sum==M-1)
( H6 [& Q, m( h; A  ]        break;
: L' T, w6 `; c# b     p=p->next;5 Y6 \& f6 M, S" o$ W# \
    }; z, R  c7 [4 u' l1 {
    p=5 e2 n/ N; ^1 \4 c
    head;
7 }" H/ z, a4 ^  j    for(i=1;i<=M;i++)/ V+ v7 b7 x- |. j% I2 p& D) \" }
    { if(p->flag==1)/ \& E7 a0 D" ?6 N8 F
        printf("\t%d",p->number);
  P$ M# [$ _( t, A, o) k* R      p=p->next;2 e0 F, G' Z) K4 X8 A
    }3 E; d6 G9 v* _3 c& A9 s# r! X

' C8 G* b2 T/ b9 G  r/ u
, Y. ?9 v6 M& D
. A4 ^/ Y8 H/ G, r# s! ~, |}

+ k- d7 Y6 \: t" s/ b. o第二种方法:数组
% _2 O" y4 ^* w* C5 Z0 {/ r6 _#include<stdio.h>' c8 `5 |, H! h
#define M 8
- ]: O; Z7 J- A1 ^4 tstruct monkey2 r8 D+ o# l$ ^# I( d
{int number;2 r$ f. w8 @+ K; P) J: R7 z
int nextp;8 ?+ {! L. W$ t- a
}link[M+1];
* m' f7 Y; T0 l, l3 e  H: X# v
5 Q' r! u0 b( N$ X1 R- Tvoid main()# P0 s' [2 U# e: Z5 w6 G
{int i,count,h;- d) S1 v9 ?0 B. z! Q
for(i=1;i<=M;i++)5 k5 ^9 C2 D5 @, {
{  if(i==M)
3 \0 w3 N0 ~' T5 b   link[i].nextp=1;
2 Z9 |& j% R) E2 z, L# ~   else
( @1 S* K6 M; W7 \! k   link[i].nextp=i+1;7 g4 C! `4 z; e. W2 e1 Y6 C
  link[i].number=i;& {2 z, n  p' J1 {( G$ E
}
8 z: Z" p$ W9 k6 jprintf("\n");
  O& l# V/ f7 F4 a& ]count=0;! b2 G- e) O( x: I
h=M;0 X* X/ z; Y! S! i# ?3 E
printf("依次退出的猴子: \n");0 T+ O0 A1 ?& `
while(count<M-1)5 w9 ^4 h( o9 W5 l
{i=0;
8 G6 R1 W0 @( N+ Y1 L# A( F) hwhile(i!=3)
6 V* F: P  R0 p/ e5 k6 a{ h=link[h].nextp;' |2 ]7 S5 n7 ~5 C/ R
   if(link[h].number)
! L8 }" e+ I+ S- v9 _' G     i++;}
5 d; T* C1 i/ l# O9 q4 a9 g1 f3 Y3 E0 J
printf("%4d",link[h].number);
' W! A7 a2 j8 Mlink[h].number=0;
# h) a: `& I# D7 ?5 a, h% D- j: qcount++;9 B9 J5 ~: v( \  i$ G
}
/ l( d7 O4 e$ r$ Q9 \: y' d1 R; A5 Z! p6 j5 W! u3 \' g9 A! z
printf("\n大王是:");6 R% T$ D0 \3 l! j4 R5 f
  for(i=1;i<=M;i++)1 E, j. l7 h2 w% S: X0 G9 Z
  if(link[i].number)
6 @0 R0 y  b/ o( `) y3 ^/ T    printf("%3d\n",link[i].number);
8 m2 N5 h: Z& u, C& {1 N4 U: B7 p  H0 W: @# A( `) F$ K

$ U  R  `7 P% m}
1 r- s3 K. a( E$ |0 U3 H  e
第三种是普通方法for循环
! e, g& K- }- |( O2 o0 q5 P, t6 |
#include<stdio.h>
6 S& J/ D$ w8 h- Lvoid main()
7 l& l$ @9 q, S1 H8 N9 ]# F{ int i,k,m,n,num[50],q,*p;
; G' w, T; |5 }5 d4 ]    clrscr();
- Q. q3 w, P% I# c' R" J   printf("input number of person: n=");8 V7 B3 `0 e: d: x1 E5 V
    scanf("%d",&n);
& {( D( y9 K3 w5 Nprintf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只2 k& l  s% @  E0 B
    scanf("%d",&q);! ?" ]+ Z- x6 L: O  }
   p=num;
% K% ^$ H( K8 I+ V: }- \  for(i=0;i<n;i++)2 L4 L% H) r* {
    *(p+i)=i+1;! D3 ?% u4 p2 H& N
   i=0;
6 L* B1 Q9 v4 y/ |- q) ]* D* U   k=0;
. y0 O1 M  e- t; _0 c! s9 K   m=0;
) F; q; c5 u$ {1 D: X  while(m<n-1)
$ O% Q4 E  P* n  g9 a- b, ]   {if(*(p+i)!=0) k++;# d+ I8 @* [# K8 `0 S* G" M- l
     if(k==q)
  R. v6 U+ x: I2 i0 K1 D( d3 L      { *(p+i)=0;
) i* F5 [% y% W# i' e( y        k=0;3 F' U$ g& Q4 w
        m++;* S. L8 L, B  i% T; x% ?% g
      }, |! l0 t* L6 b# F+ t% S+ U# H7 }1 `
    i++;
+ q/ d3 w/ h* y' Z9 z( S    if(i==n)i=0;
' r) N" G& Y3 ^6 B) T   }0 e, Y% N% j+ r. b- c+ y6 `( `
  while(*p==0)p++;
, d: J5 X2 c0 h& u  h7 }& d    printf("The last one is NO:%d\n",*p);
& K7 A  V' K" X8 }; A5 G+ L5 b     getch();
! H1 E. o- A* p. {* z8 Z
' t0 r$ S1 t6 [3 y; L4 H}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;) a- _/ L' \0 [. ~/ g! g
namespace 又费马达又费电
7 F0 K4 d) _+ v) L2 ~{
3 Z# B9 @: D) {0 d4 G    class Program
7 v4 P; S* E6 d, D& Z( b5 F3 D; \    {
& S) |. v, a+ R+ l: T7 d        static void Main(string[] args)
( ~& T: y; i. u& U        {
) h* V9 r' ?. Z3 v            int m, n;6 b; l# e6 p! f$ Q* @# X+ X- m$ Y
            Console.WriteLine("请输入数组长度");
9 G( n/ T& C1 J0 a+ u$ C% i            m = int.Parse(Console.ReadLine());//m为数组的大小
8 @8 S! R; _$ T6 [0 k2 l+ p            Console.WriteLine("请输入要截取数字的大小");
) b6 p( q2 H' }- t            n = int.Parse(Console.ReadLine());- V# y" F/ u+ W2 c8 c
            int [] numw=new int/ s+ g2 s! n, Z+ E

, ^2 ~, k) E8 a# x5 N* f&shy;&shy;&shy;;
* }2 `# i' j: Q7 j2 F- L            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数& k# t2 l+ O0 ], u" h" t
            {
- F# n. B& e8 O' G  j                numw[j - 1] = j;
8 b' M  ~8 [+ B1 G) a. z( ~# R% X& [, W            }
9 \5 z- S* q% m3 j, w            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!
4 g7 ^8 B2 n7 p) E  L! `            while (d != m - 1)
; |+ v& F1 g* ~/ ~            {& c  G7 ?1 k* s0 z) ]' c, T# m0 f! T6 k
                if (i == m && d != m - 1)% U0 P* F% Y5 U! @6 X
                {
7 G- Y/ M" i, _& H                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
. Z. c6 c/ A/ Y8 r! e0 f$ o7 ]                    continue;
0 T' i0 [3 y: s1 F; x                }! h) Q& {! ]7 L" D
                else
% U3 K3 U% X3 ]1 y                {
# \! {/ v& l) K6 z0 ^# `: g# x/ O                    if (numw[i] != 0)
5 J! d# q5 b8 h4 _. d! D0 p                    {8 H2 i, t- B. e$ |$ G- h, w
                        i++;" T. `- b2 _& I# X/ c
                        k++;
) e5 }; |& \) e4 U7 U% d: `( W                        if (k == n)
: L' `. |' L+ T% L1 c3 G8 q9 l                        {
! s1 S8 u$ b' _- x$ @, ?2 t                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
2 V! ^. {9 ~5 p* o5 R4 Q                            k = 0;  ^# e$ Y! _; i0 ^# |  G2 L3 R! T1 F
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小18 t. K, }8 G0 Q6 [% e1 v
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
  b. e) h2 e+ U$ G5 b                        }
, R! Q- u) D+ A0 b( b- I                        else//输出暂时还没有改变数组元素的值
/ |4 o1 i, a; \' Z& ]                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
% R, y* D, }, e3 R) b) ?8 A0 S- J7 B7 M                    }
! C  b* g: N5 Q7 G% B# s0 m                    else4 J% u9 b! q$ }/ t1 n
                        i++;//数组元素为0,直接跳过,不计数。。。, N  {( ^8 P4 w5 A
                }; O2 ?- r0 E/ X$ j4 @4 e$ o
6 u& K2 W1 f5 b) d; c3 m$ }
- z3 i' b& `& C; B# f: s
            }//结束while循环
5 g$ R- G! G# j( a) V. }( W5 k            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦
8 j' j0 i3 _0 Y, m: h+ @- r           3 G- }( V1 z9 q: v
                if (numw[i] != 0)
$ a6 F& C4 I" Z; G( T( _: S                    Console.WriteLine(numw[i]);) H! m  s& n' N: x- [  g1 L
           1 l! T( M! d' q/ g/ j$ u& ~
            Console.ReadLine();2 e/ C; {; Y% o. l. E& y6 V
        }' x) @: G8 d+ s8 q6 w
    }
% J/ {2 P/ w  H& C7 s}# n# Z0 w+ ~* ?5 r" G3 `0 x, R, r- T
小甲鱼最新课程 -> 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-4-27 16:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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