鱼C论坛

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

猴子问题

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

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

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

x
大家好!6 Q& M& W5 c$ C* t' \
这几天我在忙着编一个问题,我用了一种方法编出来!
- t0 L  Z" F8 O' v. p% t但是当我编完时我去看书! 发现许多的方法 我看了看,拿出来与大家共享!还有附件哦!3 u% K- K2 R7 H0 ~; E+ e4 D
注意拉!第一个是我的原创哦!!!!! 如果有什么不对的地方请大家指点出来,本人不胜感激 * O6 l  P; y" ]0 Z9 v! S5 N
/ Z& q+ p$ z/ T. w/ P9 M

5 p; A- G0 {2 _
                            题目' h2 \, |& I& z# D; S
山上有m只猴子要选大王,选举办法如下:所有猴子从1到m进行编号并围坐一圈,从第一号开始按顺序1,2,...n继续报数,凡是报n号的猴子都退出到圈外,照此循环报数,直到圈内只剩下一只猴子时,这只猴子就是大王.输出大王的编号。
2 U! k  d, C/ A+ L3 w3 }第一种方法:利用循环链表
* S, H! ?4 C. k7 ^2 U5 P: ]% s#include<stdio.h>
3 G( g  _# u" I0 }9 X#include<malloc.h>* B  q3 h/ `% S& Q1 p$ U
#define M 8            //共有8只猴子* |! n+ d- w6 z2 H( q
#define N 3            //数到3只时退出第三只7 S) h3 X2 c+ Y0 ?
typedef struct monkey
0 C1 L- f# m2 S$ |$ U{int number;
6 ]$ ~5 m1 o& ^; k" rint flag;. ?' ~0 w! W  y- l8 `
struct monkey* next;
3 R, E$ P, G" e7 S}MONKEY;: k; x% Z5 t# G& v' T
main()  \, T. }' q; Z5 Q5 }
{ MONKEY *head=NULL,*p,*s;6 J% P$ M+ ]$ n9 [; h: ^
  int i,sum=0,count=0;# [3 c6 L1 b3 h& W6 ?- {4 T: @' i
  clrscr();              //清屏
9 @0 P5 ]  D3 R2 S! Y  B: C( V  p=(MONKEY *)malloc(sizeof(MONKEY));  //分配内存- h( G( U$ E+ K
  p->number=1;p->flag=1;! L2 r: N3 w4 e$ O9 o1 U- X
  p->next=head;
" e+ i- P: q% q1 I0 m8 C  head=p;/ W- {! D) S" m8 p
  for(i=2;i<=M;i++)
# _2 c! x. D  S8 ]) [$ D0 U    { s=(MONKEY *)malloc(sizeof(MONKEY));
; E4 U# {$ g7 B3 m) M$ K4 u9 D     s->number=i;s->flag=1;8 p0 L  o! }& P0 [
     s->next=head;% h) T! z0 @! [2 \
     p->next=s;p=p->next;2 ~! w* O% h9 j2 e! U6 E& e! \6 G
    }8 P2 u! p# |7 h! y5 `
    p=head;) P' ~7 y! y: [6 Z+ F+ h
   for(;;)' n  q8 \2 `) L( b5 Q; W
    {if(p->flag==1)* @* \% s- ?  c7 u
       count++;
# g% S7 x2 X, N( d; s7 M     if(count==N)8 U" I) T1 v, Z' }" h) M/ k% }
        {p->flag=0;; _" L* F5 k  S, |: y! N
         count=0;
6 B0 H) o. ~& j! G- `. Q2 E1 `         sum++;}; N" k7 _; \  N6 ?; H
     if(sum==M-1)
+ G- U1 b4 o! f9 N" b9 a        break;
6 W. x% @, H8 x3 {+ J0 i     p=p->next;; [& C$ G* E1 H5 a/ Q& ~6 W; }5 \# d
    }3 u( y' T0 d/ X" @8 Q
    p=' T, C6 y1 x* v5 r: b' w
    head;
! \1 E; e$ Q& y% R/ x5 P    for(i=1;i<=M;i++)
; x3 H# i( ?- a" l5 O" q; {    { if(p->flag==1)
( b$ n7 V8 Z% u, g" I6 c7 A( q3 R        printf("\t%d",p->number);
) C" N$ x1 T2 Q$ X& ~' p' s" E4 a      p=p->next;
; G$ ~% H& V# e) F$ o    }
$ w2 {* v& N* Q! f
, D$ ^8 v7 r' L- L# C, }2 E# f
4 ^& U0 V; \0 l; ^* n
: H7 X: `, l6 e7 x}

: T- Q- X! R/ ~8 D; P第二种方法:数组
/ y% T* }" Y4 c* v% z: ?. X& P#include<stdio.h>3 n5 u; b1 l  P' U% T, L5 M7 \
#define M 8/ _7 j& j5 ]* {  f. z& m
struct monkey/ E# y* W* C  O, L& h
{int number;
6 f. `. E7 F+ O( a* ~% J$ H3 U) Hint nextp;
/ ~" ^# d% U% n; {/ O% h4 @* O}link[M+1];7 r  \9 i- q4 Z6 e) [
  i  B  C, n5 ~5 Z" h% i
void main()
* j5 u6 c, j0 D{int i,count,h;
9 _+ t% N2 ]" y4 q& O5 Z# V+ N$ u* zfor(i=1;i<=M;i++)
( |) Z/ z# Y9 F* P{  if(i==M)9 W. G3 _6 o+ G7 ~9 h* a
   link[i].nextp=1;! Y4 G4 X9 {$ h: ]# u; ^! d
   else
) J7 E1 q2 u: [4 C9 H7 R( m   link[i].nextp=i+1;
8 Y5 K' r8 z7 w  `, ~  link[i].number=i;
3 I- I0 f7 I  H  L2 w5 D: f8 y4 j( A}! w" O( t) }4 s2 W! e
printf("\n");4 |1 O; c  [# M! P( z
count=0;
" Y, ]$ d, f5 h1 o0 qh=M;9 A) Y  g. G5 j' M. H) J$ `) ~
printf("依次退出的猴子: \n");
0 Z0 W2 i4 G( {" n6 L" a3 Kwhile(count<M-1)
6 ^  c# V1 z& F7 M/ d{i=0;
# X7 W9 l( U# \9 S. E8 J$ owhile(i!=3): S0 S/ v4 B4 Z; d# X  k& z
{ h=link[h].nextp;! `4 T% N% ]6 T; b
   if(link[h].number)
% i8 N- X! m/ I- b! n& w+ a     i++;}
* m2 m* x  _; Z* E  f: d" {3 W/ \+ r. E! g/ }! ?
printf("%4d",link[h].number);3 ?4 N( i+ A* ?' z+ v4 ~1 D5 n
link[h].number=0;
1 m. Y/ z. K3 e. N) ^8 c0 s* |' mcount++;; K) V3 a& o3 M! z, B
}
8 E& r1 U8 K* r9 w" i
; p# A: v7 ~4 H$ D' l/ J4 dprintf("\n大王是:");
/ ?& F( V) U" g! h" f: M  for(i=1;i<=M;i++)+ r0 m* P) W+ e/ K3 h. A0 E8 [
  if(link[i].number)
7 J1 g/ S+ Y! t: @    printf("%3d\n",link[i].number);- N% K0 x+ e3 @2 X  B  z! L8 V9 \

; p) X) s7 r. r; T- F, I8 S
) k8 o- W8 \# K/ ?. `) l) _}
% K' A3 p. q: k5 t( X2 q6 ?
第三种是普通方法for循环

) ^6 }1 _4 f; O4 L- k#include<stdio.h>
: T0 O7 T; V& C8 h4 ~; _void main()  I% _) D. m& z: ], K
{ int i,k,m,n,num[50],q,*p;. I" p' M. B, X% l/ Q. Q. g5 a+ n
    clrscr();$ t" {% a8 q5 B  D: \7 ^
   printf("input number of person: n=");
  Q5 t* z4 \- X0 K    scanf("%d",&n);2 Z' }" {5 @3 U( Y/ m% W7 X" s% A8 ]
printf("\ninput number of person when how many monkey exit: q="); //输入数到q只时退出第三只2 P4 N4 I1 j6 e9 G
    scanf("%d",&q);/ Q4 a, T5 v( }4 x
   p=num;
% N, P4 M( t/ v  for(i=0;i<n;i++)
) ~6 M; ?8 R. A    *(p+i)=i+1;$ l) |" r/ E" g9 n7 }7 E7 h
   i=0;
3 |# I, L% C+ f0 h5 e   k=0;
! C; F  d9 I: B# X+ N( A  H- I6 q   m=0;
+ r) g# H6 M& p& l  while(m<n-1)3 ~) k2 e) B7 x. ~+ |
   {if(*(p+i)!=0) k++;
0 H7 _  r! V* O3 u9 S; R, X( P3 h     if(k==q)
2 U3 O- s+ x' r; j0 L# [7 j      { *(p+i)=0;1 w& e, `) i7 Q
        k=0;
3 |( K& i" o: ?9 _, i# a& I8 ~        m++;
/ a7 s$ P; i" m4 g* k( Q      }! Y! j! j3 c5 n, k9 X3 G6 x
    i++;
6 ?3 ^0 ^" F/ E% Z$ Q/ ^5 u! m# T    if(i==n)i=0;+ [  J6 p+ x+ @6 l6 Z
   }
" V9 [3 ^! `9 B4 A  while(*p==0)p++;
$ a( q( f! v, t, q    printf("The last one is NO:%d\n",*p);) D4 M/ |2 K& u
     getch();0 K) x/ @0 M: t( ]; _/ N

1 a4 @0 d* K; ~) q) V) i+ ^}
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:28:46 | 显示全部楼层
{:1_1:}这个题以前读大学的时候做过!我是用C#语言写的!待会儿拿出来共享
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-10-24 17:32:28 | 显示全部楼层
using System;
  ^# s% T5 j" ~9 Y4 j' znamespace 又费马达又费电9 O& w5 k6 M. G+ \/ i! f
{
2 j2 f1 E/ s; h    class Program, j, Y5 f% ]4 ]" I
    {6 E7 i* a# Q! l9 M, f
        static void Main(string[] args)! u. o& q8 U' n6 q- E% L; |! n
        {) N' a2 e9 m' K1 K
            int m, n;" o2 ^( Q7 m9 x% V3 H
            Console.WriteLine("请输入数组长度");2 H6 `8 Q  ~6 I3 e% g# h
            m = int.Parse(Console.ReadLine());//m为数组的大小* q) \6 a4 H2 {  E4 U, i$ ]! f
            Console.WriteLine("请输入要截取数字的大小");
/ z9 T  t9 Z: L) i- z! L            n = int.Parse(Console.ReadLine());' \- j$ u( E: y& W! ?
            int [] numw=new int
7 S$ \9 w( k7 C8 D# I7 `& k4 h0 h% F2 t2 C* D
&shy;&shy;&shy;;
1 \8 Q7 ^# u9 H$ S2 u& ?0 v) l            for (int j = 1; j <= m; j++)//给数组赋值1开始的整数
- Z  ?6 o, k, B& [7 d# `) n            {
$ K! G+ Z2 Z2 o, ?- j' N/ d                numw[j - 1] = j;  O. L1 m% }& ^% N/ m
            }
4 c4 w0 w! i! g9 l            int i = 0, k = 0, d = 0;//声明一组变量给while使用哈!!3 O/ ~3 `  i# }: G# y" }/ G. o
            while (d != m - 1)2 n9 l  `. S( A7 E& E% c7 E- j' D
            {0 q1 ~& M- d( z/ i
                if (i == m && d != m - 1)
* _6 ]/ n) h+ u' n: \0 K                {
4 a9 b0 c0 b4 M3 S* G( a. S                  i = 0;//i控制每次遍历数组的变量,用它一次次遍历数组的啊!!
" d3 ?" u* Z: z2 r2 j, C+ f& k                    continue;
  d$ }0 [& u+ A- [5 l6 b" J( U                }
$ G2 k8 c. C! K6 D+ R0 Q; l! ^3 A                else
/ _  K8 A/ Y. O8 q2 e3 O$ R                {3 t4 T8 A; N8 ^, U% m
                    if (numw[i] != 0)
' u. s, G9 Y/ e3 U" M9 V: A                    {
: `# P( Y% d" g7 l) }. t6 N                        i++;
3 ]6 ?" G4 d2 x' u* f: I, N3 Q                        k++;
, H0 Z, ]6 |; I% g) @8 U                        if (k == n), P. s+ V+ ]% u
                        {: ]. q* d& ^$ e% q' X& g1 t
                            numw[i - 1] = 0;//把在n位置数组元素的值改变了
% C" }, `8 d2 h3 Y! K9 Y                            k = 0;4 ?9 s/ v. h+ Z+ R( s
              d++;//每改变一次数组中元素的值,d就自动加1,但要比数组的长度小1
  E$ z* V6 S/ M' p- k                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);9 b# K5 u  V  k" q7 s; J+ t6 L
                        }
( n) X, x6 Q8 y* m- o" j" F                        else//输出暂时还没有改变数组元素的值' I* l) K0 J  I7 k) q
                      Console.WriteLine("numw[{0}]={1}", i - 1, numw[i - 1]);
) _- `) K2 B% @5 I$ N                    }
$ e3 w2 X1 ?$ p& ]                    else* y- B1 F, _+ Q/ J& e9 p
                        i++;//数组元素为0,直接跳过,不计数。。。) c& {, e- {" }# X9 a2 f
                }# k8 z; K( Q+ s& w6 p
: ^3 I4 k( Z# K0 f- K) K
* C8 l2 O: ?3 v" V
            }//结束while循环2 p1 x2 }4 z4 s: W! J0 y. E
            for (i = 0; i < m; i++)//输出剩下那个数字,得到最终结果了哦) y" X4 @! Y6 r0 C6 e
           % u; V" j* |/ n
                if (numw[i] != 0)
2 Y% |# {  z- d6 k2 g  b                    Console.WriteLine(numw[i]);* ~3 j( `" A) d6 L3 W4 x
           
( v+ f! f% e; D$ w' l            Console.ReadLine();
% ^( f" N" q3 d9 T, N4 m! I        }
" s; C, R: \9 ]5 Q: v1 J6 b    }; X$ u0 f$ e1 e$ H
}% C9 |; W7 Q, b3 I
小甲鱼最新课程 -> 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-2 00:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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